理解しやすい-依存性注入

Springのコアは、軽量の制御の反転(IOC)とアスペクト指向プログラミング(AOP)フレームワークです。
制御の反転は、コード間の結合を減らすことです。最も一般的な方法は、依存性注入です。

依存性注入とは何ですか?

まず、依存関係とは何かを見てみましょう。人生において、独立したり独立したりすることができずに他人や他のものに依存することは依存と呼ばれます。

では、アプリケーションの依存関係とは何ですか?依存関係とは、2つのインスタンス間の関係を指します。1つのインスタンスは独立しており、もう1つのインスタンスは依存(依存)しており、別のインスタンスに依存しています。たとえば、ホストオブジェクトと表示オブジェクトを含むコンピューターオブジェクト。ホストオブジェクトやディスプレイオブジェクトがない場合、コンピュータオブジェクトは不完全であり、正常に使用できません。コンピュータオブジェクトはホストオブジェクトとディスプレイオブジェクトに依存していると言います。

では、注射とは何ですか?コンピュータオブジェクトは、ホストオブジェクトおよび表示オブジェクトから分離できません。プログラムの実行時に、コンピュータオブジェクトに必要なホストオブジェクトと表示オブジェクトを提供し、ホストオブジェクトと表示オブジェクトを次のようにコンピュータオブジェクトに提供する必要があります。 「注入」。このプロセスは注入と呼ばれます。つまり、オブジェクトが通常使用される別のオブジェクトを必要とする場合、プログラムの実行時に必要なオブジェクトをオブジェクトに提供します。これは「依存性注入」と呼ばれます。

SpringはほぼすべてのBeanオブジェクトを管理し、オブジェクト間に依存関係がある可能性があることはわかっています。プログラムの実行中に、Springは必要なすべてのオブジェクトをアセンブルします。これがSpringの依存性注入です。従来のJava設計では、Javaインスタンスの呼び出し元が呼び出されたJavaインスタンスを作成するときに、呼び出されたJavaクラスが呼び出し元のコードに表示される必要があり、2つの間で疎結合を実現できません。素人の言葉で言えば、ファクトリモデルはこれを改善して、呼び出し元が呼び出し先の特定の実装プロセスを気にする必要がなく、特定の標準(インターフェイス)を満たすインスタンスを取得する限りそれを使用できるようにしました。呼び出し元のコードは、呼び出し元と呼び出し先の分離をサポートするインターフェイスプログラミングを対象としているため、ファクトリパターンを広く使用できます。ただし、ファクトリモデルでは、呼び出し元は自分でファクトリを見つけて特定のファクトリと結合する必要があるため、呼び出し元と呼び出し先の分離はある程度しか達成されません。Springの登場により、呼び出し元が自分でファクトリを見つける必要がなくなりました。プログラムが呼び出し先に対して実行されると、システムは自動的に呼び出し先インスタンスを提供します。実際、呼び出し元と呼び出し先の両方がSpringによって管理され、2つの間の依存関係はSpringによって提供されます。

素人の言葉で言えば、クラスBオブジェクトはクラスAで使用されます。通常の状況では、クラスAの新しいBオブジェクトを使用する必要があります。依存性注入では、クラスAのプライベートBオブジェクトを定義するだけで済みます。

IOCの側面である依存性注入は一般的な概念であり、多くの説明があります。概念は、オブジェクトを作成する必要はなく、オブジェクトがどのように作成されるかを説明するだけでよいということです。コンポーネントとサービスをコードで直接アセンブルすることはありませんが、構成ファイルでどのコンポーネントにどのサービスが必要かを記述する必要があります。その後、コンテナー(IOCコンテナー)がそれらをアセンブルします。

依存性注入の包括的なケース
  • プリンタの開発方法?
    カラーインクカートリッジまたはブラックインクカートリッジを使用するように柔軟に構成できます
    印刷ページのサイズを柔軟に構成できます(A4、B5)
    プリンタ機能の実現は、インクカートリッジと用紙によって異なります
  • 手順
    1.インクカートリッジと用紙のインターフェイス規格を定義します
    2.インターフェイス規格を使用してプリンタを開発し
    ます3.プリンタを組み立て
    ます4.プリンタを実行します

1.インクカートリッジと紙のインターフェース規格を定義します

//定义墨盒接口
public interface InkBox {
    
    
    //提供获取颜色的方法
    String getColor();
}
============== 为了阅读方便放在了一起 标准做法应该要分开写 ==============
//定义纸张大小接口
public interface PaperSize {
    
    
    //提供获取纸张大小的方法
    String getPaper();
}

2.インターフェースの実装クラス

//A4纸张
public class A4Paper implements PaperSize {
    
    
    public String getPaper() {
    
    
        return "A4";
    }
}
//B5纸张
public class B5Paper implements PaperSize {
    
    
    public String getPaper() {
    
    
        return "B5";
    }
}
//黑色墨盒
public class BlackInkBox implements InkBox {
    
    
    public String getColor() {
    
    
        return "黑色墨盒";
    }
}
//彩色墨盒
public class ColourInkBox implements InkBox {
    
    
    public String getColor() {
    
    
        return "彩色墨盒";
    }
}

3.プリンタークラスクラスはここで定義されます。異なるプリンターをアセンブルする場合は、インターフェイスを使用する必要があり、異なるプリンタークラスは共通のプリンターメソッドを実装します)

セッターメソッドインジェクション:セッターメソッドインジェクションとは、コンテナーがパラメーターレスコンストラクターまたはパラメーターレス静的ファクトリメソッドを呼び出してBeanをインスタンス化した後、Beanのセッターメソッドが呼び出され、セッターベースの依存性注入が実現されることを意味します。

public class Printer {
    
    
    private InkBox inkBox;
    private PaperSize paperSize;
	//通过set注入必须要提供无参构造
    public Printer() {
    
    
    }
	//提供setter方法对应xml文件中标签<property name="paperSize" ref="a4Paper"/>
    public void setInkBox(InkBox inkBox) {
    
    
        this.inkBox = inkBox;
    }
    //提供setter方法对应xml文件中标签<property name="inkBox" ref="colourInkBox"/>
    public void setPaperSize(PaperSize paperSize) {
    
    
        this.paperSize = paperSize;
    }
    //组装打印机的方法
    public void print(){
    
    
        System.out.println("使用"+inkBox.getColor()+"打印出了"+paperSize.getPaper()+"大小的纸张");
    }
}

4.applicationContext.xmlファイルを構成します

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 创建A4Paper的对象 -->
    <bean id="a4Paper" class="com.li.bean.Impl.A4Paper"/>
    <!-- 创建ColourInkBox的对象 -->
    <bean id="colourInkBox" class="com.li.bean.Impl.ColourInkBox"/>
    <!-- 创建Printer对象 Printer中用到了PaperSize InkBox 两个接口的引用 所以需要接口的实现类-->
    <bean id="printer" class="com.li.bean.Printer">
        <property name="paperSize" ref="a4Paper"/>
        <property name="inkBox" ref="colourInkBox"/>
    </bean>

    <bean id="b5Paper" class="com.li.bean.Impl.B5Paper"/>
    <bean id="blackInkBox" class="com.li.bean.Impl.BlackInkBox"/>
    <bean id="printer2" class="com.li.bean.Printer">
        <property name="paperSize" ref="b5Paper"/>
        <property name="inkBox" ref="blackInkBox"/>
    </bean>
</beans>

5.テスト

public class TestPrinter {
    
    
    /**
     * 一般情况下:new 对象
     */
    @Test
    public void printerOut() {
    
    
        A4Paper a4Paper = new A4Paper();
        ColourInkBox colourInkBox = new ColourInkBox();
        Printer printer = new Printer();
        printer.setPaperSize(a4Paper);
        printer.setInkBox(colourInkBox);
        printer.print();
        //使用黑色墨盒打印出了A4大小的纸张
    }

    /**
     * 创建对象由配置文件管理
     */
    @Test
    public void printerOut2(){
    
    
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Printer printer = context.getBean("printer", Printer.class);
        printer.print();
        //使用彩色墨盒打印出了A4大小的纸张
    }

    @Test
    public void printerOut3() {
    
    
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Printer printer = context.getBean("printer2", Printer.class);
        printer.print();
        //使用黑色墨盒打印出了B5大小的纸张
    }
}

概要:Spring IOCは、オブジェクトの作成、オブジェクトの管理(依存性注入(DI)、オブジェクトのアセンブル、オブジェクトの構成、およびこれらのオブジェクトのライフサイクル全体の管理)を担当します。

おすすめ

転載: blog.csdn.net/lirui1212/article/details/108977147