Spring Framework -- IOC/DI

Spring フレームワーク IOC/DI

1. IOC (Inversion of Control) 制御の反転

1. 制御の反転とは

IOC: Inversion of Control. 以前は、オブジェクトを自分で作成する必要がありました. 今では、オブジェクト作成の操作はSpringフレームワークに渡されます. 使用する場合は、フレームワークに直接問い合わせることができます. Springは作成を担当します. IOC コンテナと呼ばれるすべてのオブジェクトの管理。

2. IOC コンテナの機能と内部には何が格納されていますか?

  • IOC コンテナーは、データ層とビジネス層のクラス オブジェクトを含む、オブジェクトの作成と初期化などの一連のタスクを担当します。
  • 作成または管理されるオブジェクトは、IOC コンテナー内でまとめて ==Bean== と呼ばれます。
  • Bean オブジェクトは IOC コンテナに配置されます

3. サービスと dao オブジェクトが IOC コンテナに作成された後、プログラムは正しく実行できますか?

  • いいえ、サービス操作は dao オブジェクトに依存する必要があるためです
  • IOC コンテナには service オブジェクトと dao オブジェクトがありますが、
  • しかし、サービス オブジェクトは dao オブジェクトとは何の関係もありません
  • dao オブジェクトをサービスに渡す必要があります。つまり、サービスと dao オブジェクトの関係をバインドする必要があります。

DI は、このようなコンテナー内のオブジェクトとオブジェクトの間のバインド関係を確立するために使用されます。

2. DI (Dependency Injection) 依存性注入

(1) 依存性注入とは?

コンテナー内の Bean 間の依存関係を確立するプロセス全体は、依存性注入と呼ばれます。ビジネス層は、データ層のクラス オブジェクトを使用する必要があります。これは、以前はそれ自体が新しいものでした。

今、私は新しいものではなく、他の人に依存しています[外部は実際にIOCコンテナーを参照します]それを注入します

このアイデアは依存性注入です

(2) IOC コンテナー内のどの Bean が依存関係を確立する必要がありますか?

  • これにはプログラマーがビジネスのニーズに応じて事前に良好な関係を確立する必要があります. ビジネス層がデータ層に依存する必要がある場合, サービスはdaoとの依存関係を確立する必要があります. SpringのIOCとDIの概念を紹介した後,これら 2 つの概念の最終的な目標は :==完全なデカップリング== であり、具体的な実装は以下に依存します。
  • IOC コンテナー (IOC) を使用したマネージド Bean
  • IOC コンテナー内の依存関係を持つ Bean のリレーショナル バインディング (DI)
  • 最終的な結果は次のとおりです。オブジェクトを使用する場合、オブジェクトを OC コンテナーから直接取得できるだけでなく、取得した Bean がすべての依存関係を既にバインドしています。

重要な機能はリフレクションで、これにより、プログラムは動的にオブジェクトを生成し、オブジェクト メソッドを実行し、実行時にオブジェクト プロパティを変更できます. Spring は、リフレクションによる注入を実装します.

  • 注入方法: 1. セット メソッド注入 2. 構築メソッド注入 3. フィールド注入
  • インジェクションの種類: 1. 値型のインジェクション 2. 参照型のインジェクション

インターフェイスの違い

  • BeanFactory は、Spring が内部的に使用するインターフェースであり、開発者には提供されません. 構成 xml 解析をロードするときに作成されず、オブジェクトを作成するときにのみ getBean が作成されます。
  • ApplicationContext は BeanFactory のサブインターフェースであり、強力で開発者が使用できます. 構成が読み込まれると、オブジェクトが作成されます.

ApplicationContext にはいくつかの特別な実装クラスがあります

  • ClassPathXmlApplicationContext、ファイル名はsrcディレクトリに記述可能
  • src ディレクトリの FileSystemXmlApplicationContext には、絶対パスを記述する必要があります。

実装:

リフレクションは、すべての Spring フレームワークの下部で使用されます。

最初にjarパッケージをインポートします

ダオレイヤー

BookDao インターフェイス

package com.chen.dao;

public interface BookDao {
    void add();
}

BookDaoImpl 実装クラス

package com.chen.dao.impl;

import com.chen.dao.BookDao;

public class BookDaoImpl implements BookDao {
    @Override
    public void add() {
        System.out.println("BookDaoImpl...add");
    }
}

サービス層

BookService インターフェース

package com.chen.service;

public interface BookService {
    void save();
}

BookServiceImpl 実装クラス

package com.chen.service.impl;

import com.chen.dao.BookDao;
import com.chen.service.BookService;

public class BookServiceImpl implements BookService {
    //BookServiceImpl 依赖 BookDao的对象

    private  BookDao bookDao;
    public String name;
    private int age;
        set方法
        在BookServiceImpl中添加BookDao方法
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

 使用Spring的API获得Bean实例
    @Override
    public void save() {
        System.out.println("BookServiceImpl...save");
        bookDao.add();
    }
}

BookServiceVip 実装クラス

package com.chen.service.impl;

import com.chen.service.BookService;

public class package com.chen.service.impl;

import com.chen.service.BookService;

public class BookServiceVip implements BookService {
    @Override
    public void save() {
        System.out.println("BookServiceVip...save");
    }
}
 implements BookService {
    @Override
    public void save() {
        System.out.println("BookServiceVip...save");
    }
}

テストクラス:

package com.chen.test;

import com.chen.service.BookService;
import com.sun.org.apache.bcel.internal.util.ClassPath;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test01 {
    BookService bookService;

    @Test
    public void tset01(){
        //对家的创建由spring框架创建,此处只需要直接闻IOC空器要
        //1.通过CLassPathXmLApplicationContext加载sprinq.xml获得获得IOC容器
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        //2.从IOC容器中根据名字获得对象
        bookService = (BookService) context.getBean("bookService");
        bookService.save();
    }
}

Spring コア構成ファイル:

<?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=" /schema/beans のインデックス http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>

ビーンタグの基本構成

構成に使用されるオブジェクトは、Spring によって作成されます。

デフォルトでは、クラス内の引数のないコンストラクターを呼び出しますが、引数のないコンストラクターがないと、正常に作成できません。

基本特性:

  • id: Spring コンテナー内の Bean インスタンスの一意の識別子
  • class: Bean の完全修飾名

注入方法

== 基本型

set メソッド注入

値型には値が注入されます

参照型には ref が注入されます

<?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">

    <!--告诉spring框架,创建管理哪些对象
        id:给创建出来的对象起个名字
        class:要创建对象对应类的全类名
    -->
    <bean id="bookDao" class="com.chen.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="com.chen.service.impl.BookServiceImpl">
        <property name="bookDao" ref="bookDao"/>
     </bean>
</beans>

3. よく使われる注釈と関数

1.@コンポーネント

クラス アノテーション、Spring によって管理される Bean としてクラスを設定、属性は Bean の ID を定義でき、クラス定義の上に追加できます インターフェースはオブジェクトを作成できないため、@Component アノテーションをインターフェースに追加することはできません。

 

ステップ 1: 元の XML 構成を削除する

<bean id="bookDao" class="com.chen.dao.impl.BookDaoImpl"/>

ステップ 2: Dao に @Component アノテーションを追加する

ステップ 3: Spring の注釈パッケージのスキャンを構成する

Spring フレームワークがクラ​​スに記述されたアノテーションをスキャンするには、構成ファイルでパッケージのスキャンを実行する必要があります。

XMLとアノテーション構成の対応

2.@コンポーネントスキャン

これは、スキャン パスを設定するために使用されます。この注釈は一度だけ追加できます。複数のデータは配列形式であり、構成ファイルのスキャンを置き換えることができます

3.@スコープ

クラスアノテーションは、クラスの上に設定され、このクラスによって作成されたオブジェクトのスコープを設定し、作成された Bean がシングルトンオブジェクトであるかどうかを設定するために使用できます。属性は Bean のスコープを定義します。デフォルトは singleto (シングルトン) です。プロトタイプに記入できます(非シングルトン)

6.@Autowired

属性アノテーション、メソッド アノテーション、およびメソッド パラメーター アノテーションは、属性定義の上、標準セット メソッドの上、クラス セット メソッドの上、またはメソッド パラメーターの前に記述して、参照型属性の値を設定できます。

@Autowired はプロパティまたはセッター メソッドに記述できます.最も簡単な対処方法は、プロパティに記述してセッター メソッドを削除することです

setter メソッドを削除できるのはなぜですか?

1.自動アセンブリは、反射設計に基づいてオブジェクトを作成し、激しい反射によって私有財産の値を設定します

2. 通常のリフレクションは、変更された公開コンテンツのみを取得できます

3.公開の改変コンテンツに加えて、暴力的な反省は私的な改変コンテンツを取得することもできます

したがって、ここでセッターメソッドを提供する必要はありません

7.@予選

プロパティ注釈またはメソッド注釈。プロパティ定義の上、または標準の set メソッドの上、またはクラスの set メソッドの上に記述します。タイプに応じてコンテナ内に複数の Bean が見つかり、注入されたパラメータの属性名がコンテナ内の Bean の名前と一致しない場合は、 @Qualifier を使用して、注入する名前の Bean オブジェクトを指定する必要があります. @Qualifier アノテーションの属性値は、注入する必要がある Bean の名前です。@Qualifier は単独では使用できず、@Autowired と一緒に使用する必要があります。

おすすめ

転載: blog.csdn.net/weixin_67224308/article/details/129821963