SpringBeanのアセンブリメカニズム
SpringのBeanには、次の3つのアセンブリメカニズムがあります。
- xmlでの明示的な構成。
- 暗黙のBean検出メカニズムと自動アセンブリ。
- Javaでの明示的な構成;(java Config)
Springの自動アセンブリは、2つの観点、または2つの操作から実装する必要があります。
- コンポーネントのスキャン:Springは、アプリケーションコンテキストで作成されたBeanを自動的に検出します。
- 自動配線:SpringはBean間の依存関係を自動的に満たします。これをIoC / DIと呼びます。
コンポーネントスキャンと自動アセンブリの組み合わせは大きな力を発揮し、ディスプレイ構成を最小限に抑えます。
次に、XMLを使用してアセンブリを表示する方法と、Beanおよび自動アセンブリのメカニズムを暗黙的に検出する方法を見てみましょう。
XMLでの明示的な構成
1.新しいプロジェクトを作成します
2.2つの新しいエンティティクラスを作成します。CatDogには次のメソッドがあります。
public class Cat {
public void shout() {
System.out.println("miao~");
}
}
public class Dog {
public void shout() {
System.out.println("wang~");
}
}
3.新しいユーザークラスUserを作成します
public class User {
private Cat cat;
private Dog dog;
private String str;
}
4.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="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dog" class="com.zhonghu.pojo.Dog"/>
<bean id="cat" class="com.zhonghu.pojo.Cat"/>
<bean id="user" class="com.zhonghu.pojo.User">
<property name="cat" ref="cat"/>
<property name="dog" ref="dog"/>
<property name="str" value="zhonghu"/>
</bean>
</beans>
5.テスト
public class MyTest {
@Test
public void testMethodAutowire() {
ApplicationContext context = newClassPathXmlApplicationContext("beans.xml");
User user = (User) context.getBean("user");
user.getCat().shout();
user.getDog().shout();
}
}
結果は正常な出力であり、環境はOKです
自動組立
自動組み立て手順
- 自動配線は、Springを使用してBeanの依存関係を満たす方法です。
- Springはコンテキスト内で自動的に検索し、Beanのプロパティを自動的にアセンブルします。
自動アセンブリxml構成を使用するのではなく、注釈を使用することをお勧めします。
byName自動組立
autowire byName(名前によるautowire)
xmlを手動で構成する過程で、文字の欠落や大文字の使用などのエラーが頻繁に発生し、チェックできないため、開発効率が低下します。
自動アセンブリを使用すると、これらのエラーを回避し、構成を簡素化できます。
テスト:
1. Bean構成を変更し、属性autowire = "byName"を追加します
<bean id="user" class="com.zhonghu.pojo.User" autowire="byName">
<property name="str" value="zhonghu"/>
</bean>
2.もう一度テストしても、結果は正常に出力されます。
3.catのBeanIDをcatXXXに変更します
4.再度テストし、実行中にnullポインターjava.lang.NullPointerExceptionを報告します。byNameルールに従ってsetメソッドが見つからないため、実際のsetCatは実行されず、オブジェクトは初期化されません。そのため、呼び出されたときにnullポインターエラーが報告されます。
概要:
BeanノードにautowirebyNameの属性がある場合。
- setCatなど、クラス内のすべてのsetメソッド名を検索し、setが削除され、最初の文字が小文字の文字列、つまりcatを取得します。
- スプリングコンテナに移動して、この文字列名idのオブジェクトがあるかどうかを確認します。
- 存在する場合はインジェクションを削除し、存在しない場合はnullポインター例外を報告します。
すべてのBeanのIDが一意であることを確認する必要があり、Beanは自動的に注入されたプロパティのsetメソッドの値と一致している必要があります
byType自動組立
autowire byType(タイプ別の自動組み立て)
autowire byTypeを使用するには、最初に、同じタイプのオブジェクトがスプリングコンテナ内で一意であることを確認する必要があります。一意でない場合は、一意でない例外が報告されます。
NoUniqueBeanDefinitionException
テスト:
1.ユーザーのBean構成を変更します:autowire = "byType"
2.テスト、通常の出力
3.猫豆オブジェクトを登録してください!
<bean id="dog" class="com.zhonghu.pojo.Dog"/>
<bean id="cat" class="com.zhonghu.pojo.Cat"/>
<bean id="cat2" class="com.zhonghu.pojo.Cat"/>
<bean id="user" class="com.zhonghu.pojo.User" autowire="byType">
<property name="str" value="zhonghu"/>
</bean>
4.テスト、エラー:NoUniqueBeanDefinitionException
5. cat2を削除し、catのBean名を変更します。テスト!タイプごとにアセンブルされているため、例外は報告されず、最終結果に影響はありません。id属性を削除しても、結果には影響しません。
タイプに応じた自動組立です!
すべてのBeanのクラスが一意であることを確認する必要があり、Beanは自動的に注入されたプロパティのタイプと一致している必要があります
注釈を使用した自動アセンブリ
jdk1.5はアノテーションのサポートを開始し、spring2.5はアノテーションの完全なサポートを開始しました。
準備:アノテーションを使用して属性を挿入します。
1.Spring構成ファイルにコンテキストファイルヘッダーを導入します
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
2.属性アノテーションのサポートをオンにします。
<context:annotation-config/>
@Autowired
- @Autowiredはタイプごとに自動的に転送され、IDマッチングをサポートしていません。
- spring-aopパッケージをインポートする必要があります!
- 属性で直接使用することも、setメソッドで使用することもできます
- Autowiredを使用すると、AutowiredプロパティがIOC(Spring)コンテナーに存在する場合、Setメソッドを記述する必要はありません。
テスト:
1. Userクラスのsetメソッドを削除し、@ Autowiredアノテーションを使用します
public class User {
@Autowired
private Cat cat;
@Autowired
private Dog dog;
private String str;
public Cat getCat() {
return cat;
}
public Dog getDog() {
return dog;
}
public String getStr() {
return str;
}
}
2.この時点での構成ファイルの内容
<context:annotation-config/>
<bean id="dog" class="com.zhonghu.pojo.Dog"/>
<bean id="cat" class="com.zhonghu.pojo.Cat"/>
<bean id="user" class="com.zhonghu.pojo.User"/>
3.結果をテストして正常に出力します。
@Autowired(required = false)説明:false、オブジェクトはnullにすることができます; true、オブジェクトはnullではなくオブジェクトに格納する必要があります。
//如果允许对象为null,设置required = false,默认为true
@Autowired(required = false)
private Cat cat;
@Qualifier
- @Autowiredはタイプに応じて自動的にアセンブルされ、@ QualifierはbyNameメソッドに従って自動的にアセンブルできます
- @Qualifierを単独で使用することはできません。
テスト実験の手順:
1.構成ファイルの内容を変更して、そのタイプのオブジェクトが存在することを確認します。そして、その名前はクラスのデフォルト名ではありません!
<bean id="dog1" class="com.zhonghu.pojo.Dog"/>
<bean id="dog2" class="com.zhonghu.pojo.Dog"/>
<bean id="cat1" class="com.zhonghu.pojo.Cat"/>
<bean id="cat2" class="com.zhonghu.pojo.Cat"/>
2.修飾子テストは追加されず、エラーが直接報告されます
3.属性に修飾子アノテーションを追加します
@Autowired
@Qualifier(value = "cat2")
private Cat cat;
@Autowired
@Qualifier(value = "dog2")
private Dog dog;
テスト、正常に出力!
@資源
- @Resourceに指定されたname属性がある場合、最初にこの属性に従ってbyName検索とアセンブリを実行します。
- 次に、アセンブリのデフォルトのbyNameメソッドに進みます。
- 上記のいずれも成功しない場合は、byTypeメソッドで自動的にアセンブルされます。
- 成功しなかった場合は、例外が報告されます。
エンティティクラス:
public class User {
//如果允许对象为null,设置required = false,默认为true
@Resource(name = "cat2")
private Cat cat;
@Resource
private Dog dog;
private String str;
}
Beans.xml
<bean id="dog" class="com.zhonghu.pojo.Dog"/>
<bean id="cat1" class="com.zhonghu.pojo.Cat"/>
<bean id="cat2" class="com.zhonghu.pojo.Cat"/>
<bean id="user" class="com.zhonghu.pojo.User"/>
テスト:結果はOKです
構成ファイル2:beans.xml、cat2を削除
<bean id="dog" class="com.zhonghu.pojo.Dog"/>
<bean id="cat1" class="com.zhonghu.pojo.Cat"/>
エンティティクラスにのみ注釈を保持します
@Resource
private Cat cat;
@Resource
private Dog dog;
結果:OK
結論:byName検索が最初に実行され、失敗します。次に、byType検索が実行され、成功します。
概要
@Autowiredと@Resourceの類似点と相違点:
1. @ Autowiredと@Resourceの両方を使用してBeanをアセンブルできます。フィールドに書き込むことも、setterメソッドに書き込むこともできます。
2. @Autowiredは、デフォルトでタイプごとにアセンブルされます(スプリング仕様に属します)。デフォルトでは、依存オブジェクトが存在する必要があります。null値を許可する場合は、次のように必要な属性をfalseに設定できます。@ Autowired (required = false)、名前アセンブリを使用する場合は、@ Qualifierアノテーションと組み合わせて使用できます
3. @Resource(J2EE returnに属する)は、デフォルトで名前でアセンブルされ、名前はname属性で指定できます。name属性が指定されていない場合、アノテーションがフィールドに書き込まれると、デフォルトでフィールド名が名前で検索されます。アノテーションがsetterメソッドで書き込まれると、デフォルトで属性名がアセンブリに使用されます。名前に一致するBeanが見つからない場合は、タイプに応じてアセンブリが実行されます。ただし、name属性が指定されている場合は、名前に従ってのみアセンブルされることに注意してください。
それらは同じ機能を持ち、アノテーション付きのオブジェクトを注入していますが、実行の順序は異なります。@Autowired最初のbyType、@ Resource最初のbyName。
やっと
- 読んでやりがいを感じたら、いいねをあげたいと思います。これが更新の最大のモチベーションになります。ご支援ありがとうございます。
- Javaとコンピュータの基本的な知識に焦点を当てた私の公開アカウント[JavaFox]に注目してください。私を信じていない場合は、私を叩いてください。
- 読んだ後に異なる意見や提案がある場合は、コメントして私たちと共有してください。皆様のご支援、ご愛顧を賜りますようお願い申し上げます。
最新ニュースについては、パブリックアカウント「JavaFox」をフォローすることを歓迎します