Spring-IOCコンテナ
その他
2021-03-02 16:25:13
訪問数: null
ApplicationContextの3つの一般的に使用される実装クラス
- ClassPathXmlApplicationContext:クラスパスの下に構成ファイルをロードできます。構成ファイルはクラスパスの下にある必要があります。不在の場合、ロードすることはできません。(より一般的に使用されます)
- FileSystemXmlApplicationContext:ディスクの任意のパスに構成ファイルをロードできます(アクセス権が必要です)
- AnnotationConfigApplicationContext:アノテーションを読み取ってコンテナを作成するために使用されます。
コアコンテナの2つのインターフェイスによって引き起こされる問題
- ApplicationContext :(シングルトンオブジェクトが適用可能)
- コアコンテナを構築するとき、オブジェクトを作成するための戦略は、即時ロードを使用することです。つまり、構成ファイルの読み取りが終了するとすぐに、構成ファイルで構成されたオブジェクトが作成されます。
- BeanFactory :(複数のオブジェクトに適用可能)
- コアコンテナを構築するとき、オブジェクトを作成するための戦略は、遅延読み込みを使用することです。つまり、はIDに基づいて取得されたオブジェクトであり、は実際に作成されたオブジェクトです。
春の依存性注入
- 依存性注入:依存性注入
- IOCの役割:プログラム間の結合を減らす(依存関係)
- 依存関係の管理:すべては将来春までに維持されます
- 現在のクラスでは、Springによって提供される他のクラスのオブジェクトが必要です。依存性注入と呼ばれる、構成ファイル内の依存関係の保守について説明するだけで済みます。
- 依存性注入
- 注入できるデータには3つのタイプがあります
- 基本的なタイプと文字列
- その他のBeanタイプ(構成ファイルまたはアノテーションで構成されたBean)
- 複合型/コレクション型
- 注射の方法:3つあります
- コンストラクターを使用して
- ラベルを使用:constructor-arg
- ラベルが表示される場所:Beanラベル内
- ラベルの属性:
- type:注入されたデータのデータ型を指定するために使用されます。これはコンストラクターの1つまたはいくつかのパラメーターの型でもあります。
- index:コンストラクター内の指定されたインデックス位置でパラメーターに注入されるデータを割り当てるために使用されます。インデックスの位置は0から始まります
- name:コンストラクターで指定された名前のパラメーター割り当てを割り当てるために使用されます(一般的に使用されます)
- 値:基本型と文字列型のデータを提供するために使用されます
- ref:他のBeanタイプのデータを指定するために使用されます。これは、春のIOCコアコンテナに表示されたBeanオブジェクトを指します。
- 利点:Beanオブジェクトを取得する場合、データの挿入は必要な操作です。そうしないと、オブジェクトを正常に作成できません。
- 短所:Beanオブジェクトのインスタンス化メソッドが変更されたため、オブジェクトを作成するときに、データが使用されていない場合は、それも提供する必要があります。
<bean id="userService" class="com.whut.service.imp.UserServiceImp" scope="singleton" init-method="init" destroy-method="destory">
<constructor-arg name="string" value="张三"></constructor-arg>
<constructor-arg name="integer" value="12"></constructor-arg>
<constructor-arg name="date" ref="now"></constructor-arg>
</bean>
<bean id="now" class="java.util.Date"></bean>
<bean id="userDao" class="com.whut.dao.imp.UserDaoImp"></bean>
UserServiceImpのパラメーターを使用してメソッドを構築しますprivate String string;
private Integer integer;
private Date date;
public UserServiceImp(String string, Integer integer, Date date){
this.string = string;
this.integer = integer;
this.date = date;
}
- setメソッドを使用して提供します(より一般的に使用されます)
- 関与するタグ:プロパティ
- 出現位置:Beanタグ内
- ラベル属性
- name:コンストラクターで指定された名前のパラメーターに値を割り当てるために使用されます(一般的に使用されます)。
- 値:基本型と文字列型のデータを提供するために使用されます。
- ref:他のBeanタイプのデータを指定するために使用されます。これは、春のIOCコアコンテナに表示されたBeanオブジェクトを指します。
- 利点:オブジェクトを作成するときに明確な制限はなく、デフォルトのコンストラクターを直接使用できます。
- 短所:メンバーに値が必要な場合、setメソッドは特定の注入を保証できず、オブジェクトの取得時にsetメソッドが実行されない場合があります。
<bean id="userService" class="com.whut.service.imp.UserServiceImp" init-method="init" destroy-method="destory">
<property name="string" value="李四"></property>
<property name="integer" value="21"></property>
<property name="date" ref="now"></property>
</bean>
<bean id="now" class="java.util.Date"></bean>
<bean id="userDao" class="com.whut.dao.imp.UserDaoImp"></bean>
UserServiceImpでsetterメソッドを生成しますprivate String string;
private Integer integer;
private Date date;
public void setString(String string) {
this.string = string;
}
public void setInteger(Integer integer) {
this.integer = integer;
}
public void setDate(Date date) {
this.date = date;
}
- 複合型/コレクション型注入
- リスト構造コレクションの挿入に使用
されるラベルリスト配列セット
- マップ構造コレクションを挿入するために使用されるラベル
マップ小道具
- 同じ構造で、ラベルを交換できます
<property name="myStrs">
<array>
<value>AAA</value>
<value>张三</value>
<value>A12</value>
</array>
</property>
<property name="myLsit">
<list>
<value>AAA</value>
<value>张三</value>
<value>A12</value>
</list>
</property>
<property name="mySet">
<set>
<value>AAA</value>
<value>张三</value>
<value>A12</value>
</set>
</property>
<property name="myMap">
<map>
<entry key="testA" value="AAA"></entry>
<entry key="name" value="张三"></entry>
<entry key="age">
<value>13</value>
</entry>
</map>
</property>
<property name="myProperties">
<props>
<prop key="学历">高中</prop>
<prop key="years">2019</prop>
</props>
</property>
- 注釈付き
- bean.xml構成
- コンテナの作成時にスキャンするようにパッケージにSpringに指示します。構成に必要なタグは、Beanの制約ではなく、名前空間とコンテキストという名前の制約にあります。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
- オブジェクトの作成に使用されます。それらの役割は、xml構成ファイルに記述された<bean>タグと同じです。
- 成分
- ロール:Springに現在のクラスオブジェクトを格納するために使用されます
- 属性:
- 値:BeanのIDを指定するために使用されます。記述しない場合、デフォルト値は現在のクラス名であり、最初の文字は小文字に変更されます
- コントローラー:一般的にプレゼンテーション層で使用されます
- サービス:一般的にビジネス層で使用されます
- リポジトリ:一般的に永続層で使用されます
- 上記の3つのアノテーションの関数と属性値は、コンポーネントのものとまったく同じです。それらの3つは、Springフレームワークが3つのレイヤーを使用するための明確な注釈を提供することです。これにより、3つのレイヤーオブジェクトがより明確になります。
- データの挿入に使用されます。それらの役割は、xml構成ファイルに記述された<property>タグと同じです。
- 自動配線
- 機能:注入する変数のタイプと一致するBeanオブジェクトタイプがコンテナ内に1つしかない限り、タイプに応じて自動的に注入します。注入は成功する可能性があります。注入される変数のタイプと一致するBeanタイプがIOCコンテナーにない場合、エラーが報告されます。IOCコンテナに一致するタイプが複数ある場合、インジェクションは変数名に従って実行されます。一致する変数名がない場合、インジェクションは失敗します。
- 外観位置:変数またはメソッドにすることができます
- 詳細:アノテーションインジェクションを使用する場合、setメソッドは必要ありません
- 修飾子
- 機能:クラスでの注入に基づいて、名前に従って注入します。クラスメンバーを注入するときに単独で使用することはできません。ただし、メソッドパラメータを挿入する場合は、次のことができます。
- 属性
- 値:注入されたBeanのIDを指定するために使用されます。
- 資源
- 機能:BeanのIDに従って直接注入します。単独で使用できます
- 属性
- 名前:BeanのIDを指定するために使用されます
- 上記の3つのインジェクションは、他のBeanタイプのデータのみをインジェクトできますが、基本タイプと文字列タイプは、上記のアノテーションを使用して実装することはできません。さらに、コレクションタイプの挿入は、xmlを介してのみ実現できます。
- 値
- 役割:基本型と文字列型のデータを挿入するために使用されます
- 属性:
- value:データの値を指定するために使用され、SpringでspELを使用できます(つまり、spring el式)
- spELの書き方:$ {Expression}
- スコープを変更するために使用されます。それらの役割は、xml構成ファイルに記述された<scope>タグと同じです。
- 範囲:
- 役割:Beanのスコープを指定するために使用されます
- 属性:値:値の範囲を指定します(シングルトン、プロトタイプ)
- ライフサイクルに関連:それらの役割は、xml構成ファイルでinit-methodタグとdestroy-methodタグを使用するのと同じです。
- PerDestroy:破壊方法を指定するために使用されます
- PostConstruct:初期化メソッドを指定するために使用されます
- ビジネス層
@Service("userService")
public class UserServiceImp implements UserService {
@Autowired
private UserDao userDao = null;
public void saveUser() {
userDao.saveUser();
}
}
- 永続層
@Repository("userDao")
public class UserDaoImp implements UserDao {
@Override
public void saveUser() {
System.out.println("保存用户1111111");
}
}
- テスト
public class Client {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
System.out.println(userService);
userService.saveUser();
}
}
- 注意
- @Autowired注释写在メソッド最適报错:スレッド「main」の例外org.springframework.beans.factory.BeanCreationException:「userService」という名前のBeanの作成中にエラーが発生しました:自動配線された依存関係の挿入に失敗しました。ネストされた例外はjava.lang.NullPointerExceptionです
- 解決策:変数の上に@Autowiredアノテーションを記述します
転載: blog.csdn.net/qq_40857365/article/details/111307771