想要在Java中理解DI

概要摘要

我完全理解了Java中的依赖注入(DI)概念,因此我将其记述为备忘录式的文章。由于充分利用了ChatGPT的辅助,可能会有些日语表达比较生硬,请不要介意。

依赖注入是指一种方法。

依赖注入(Dependency Injection,以下简称DI)是面向对象编程中的一种设计模式,在特别是Java等语言中被广泛使用。简略介绍了DI的作用、优点和缺点。

角色

DI在于管理类之间的依赖关系。当一个类依赖于其他类或组件时,可以使用DI来从外部注入依赖的对象。

好处

    1. 可读性和可维护性的提升:通过保持代码之间的清晰关系,每个类的角色和责任变得明确。

可重用性的提升:类与特定实现无密集耦合,可以轻松地交换不同的实现。

测试易用性:在测试时,更容易将生产环境的依赖对象替换为模拟或存根。

缺点

    1. 可能会感到复杂:对于初学依赖注入的程序员来说,可能会觉得复杂,比如对DI容器的设置和接口的管理等。

运行时错误:由于依赖关系没有在代码中直接声明,因此在运行时而不是编译时可能会发现存在依赖关系问题。

总的来说,依赖注入是一个强大的工具,可以提高软件设计的灵活性和可测试性,但在引入和管理方面需要注意和理解。

依存性注入(DI)是一个稍微高级的概念,但我会一步一步地分解解释,以便Java初学者也能容易理解。

什么是依赖性?

首先,当类A使用类B的方法时,我们说类A“依赖于”类B。当依赖关系增多时,代码的修改变得困难,测试变得更加困难。

依赖注入是什么?

依赖注入是一种在类之间注入依赖关系的技术。也就是说,如果类A依赖于类B,那么在类A内部不直接创建类B的实例,而是将类B的实例从外部传递给类A。

为什么需要依赖注入?

如果没有依存性注入,类A直接生成类B并使用,则类A和类B之间将产生强烈的关联。这意味着更改类B可能会影响到类A。在测试时,替换类B为另一个类也会变得困难。

使用依赖注入时,A类不会直接依赖于B类,而是依赖于B类的某种接口。这将提高代码的灵活性和可测试性。

实施方式

例:商店与产品

A类班级认为「店铺」,而B类班级认为「产品」。

依存性注入なし: お店が製品を直接作って販売します。製品が変わるとお店も変わります。

依存性注入あり: お店は製品を外部のサプライヤーから受け取ります。製品が変わってもお店は影響を受けません。別の製品に変更するのも簡単です。

如果不使用DI

// Shopクラスを定義しています。このクラスは製品を直接持っている構造です。
class Shop {
  // Product型のproduct変数を定義し、新しいProductインスタンスを直接生成して代入しています。
  private Product product = new Product();

  // 製品を販売するためのpublicメソッドです。外部からアクセスすることができます。
  public void sell() {
    // product変数に格納されたProductインスタンスのdisplayInfoメソッドを呼び出して製品の情報を表示しています。
    product.displayInfo();
  }
}

当使用 DI

// ShopWithDIクラスを定義しています。このクラスは製品を外部から受け取る構造です。
class ShopWithDI {
  // Product型のproduct変数を定義していますが、ここではインスタンスを生成していません。外部から受け取ります。
  private Product product;

  // このコンストラクタは、ShopWithDIインスタンスを生成する際に、外部からProductインスタンスを受け取ります。
  public ShopWithDI(Product product) {
    // 受け取ったProductインスタンスを、このクラスのproduct変数に代入しています。
    this.product = product;
  }

  // 製品を販売するためのpublicメソッドです。外部からアクセスすることができます。
  public void sell() {
    // product変数に格納されたProductインスタンスのdisplayInfoメソッドを呼び出して製品の情報を表示しています。
    product.displayInfo();
  }
}

在DI中的范围类型

在依赖注入(DI)中,作用域用于管理对象的生命周期。一般的作用域类型如下所示。

    1. 单例作用域:单例作用域只生成类的一个实例,并在整个应用程序中共享。当需要再次使用相同类的实例时,将重用最初生成的实例。

原型作用域:原型作用域会在每次需要其依赖时生成该类的新实例。使用该作用域可以生成多个不同类的实例。

请求作用域:常用于Web应用程序的作用域,每个HTTP请求都会生成一个新的实例。当请求完成后,该实例将被销毁。

会话作用域:也是用于Web应用程序的作用域,每个HTTP会话都会生成一个新的实例。当用户会话结束时,该实例将被销毁。

应用程序作用域:生成一个在整个应用程序中共享的实例。在应用程序启动时生成实例,并在应用程序结束时销毁。

自定义作用域:在某些特定框架中,可以根据特定要求定义自定义作用域。

这些范围可以控制特定对象的生命周期,有效地使用资源,并提高代码的可测试性和可维护性。使用的范围取决于具体的使用情况和应用需求。

最后

因为这是备忘录,所以有很多复制粘贴,但内容非常易懂,所以我写了一篇文章。
从下一次开始,我会自己发表文章。

广告
将在 10 秒后关闭
bannerAds