スプリングドライブ自動組立アノテーション(C)
A、Autowired @自動組立操作イル
新しい人アセンブリ、および割り当て属性名には「ジョー・スミス」、30歳プロパティの割り当てです。
package com.example.demo.annotation;
import lombok.Data;
import org.springframework.stereotype.Component;
@Data
@Component
public class Person {
public String name="张三";
public Integer age=30;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public Person() {
}
}
自動組立人@Autowiredためのアセンブリユニットをテストします。
package com.example.demo;
import com.example.demo.annotation.MainConfig;
import com.example.demo.annotation.Person;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
class annotationTest {
@Autowired
Person person;
@Test
void test(){
System.err.println(person);
}
}
コンソールに実行を印刷し、それが自動組立を有効にすることを見出しました。
私たちは、その後も違いを示すために「ジョン・ドウ」、40歳属性としてname属性を割り当て、Personクラスコンポーネントの設定で登録されています。
package com.example.demo.annotation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(value = "com.example.demo.annotation")
public class MainConfig {
@Bean
public Person person111(){
return new Person("李四",40);
}
}
そのような容器は、二つの異なる成分の種類、及びクラス名の最初の文字を小文字の人のID、ビーン名person111ための他の方法を持っています。
ここでユニットテストを見ていないですか?
@Test
void contextLoads() {
AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(MainConfig.class);
//按Person类型获取组件
String[] typeNames=applicationContext.getBeanNamesForType(Person.class);
for (String typeName:typeNames) {
System.err.println(typeName);
}
}
結果を確認するために不足して印刷します:
あなたは今2つのIOCコンテナPerson型のコンポーネントがある見ることができます。
再度、ユニットテストを実行し、結果を参照してください:
あなたは、コンポーネントのPersonコンテナの2種類が存在することになりますが、ことを確認することができますが、デフォルトではコンポーネントの人のアセンブリのIDです。
だから、それを行う方法のコンポーネントperson111 IDを組み立てるためにありますか?
第二に、同じタイプのコンポーネントの自動組立の複数
1、@Primaryコメント
注釈に直接@Primary登録場所Beanコンポーネントを追加します。
@Bean
@Primary
public Person person111(){
return new Person("李四",40);
}
:テストユニットを実行し、印刷結果は次の通りである
マーク@Primary Beanコンポーネントが優先組み立てられ、その結果から求めました。
2、アセンブリ名を変更
コメントだけを追加@Primaryノートは、自動組立属性の名前を変更します。
@Autowired
Person person111;
そして、ユニットテスト実行を変更
@Test
void test(){
System.err.println(person111);
}
動作結果が力に成分person111のIDであり、今が見つかりました:
3、@Qualifierコメントを使用して
@Qualifier直接アノテーションコンポーネントid属性値を指定して組み立てられます。今コンポーネントIDを組み立てると、指定した人です。
@Autowired
@Qualifier(value = "person")
Person person111;
単体テストは、再び実行して、人物IDと組み立て部品のためにそれを見つけた:
リソース@、@を注入注釈も自動組立のために使用することができる、別に@Autowired注釈。
しかし、@Resourceが強力なことに、追加のパッケージをインポートするには、@を注入する必要はありませんが、Springフレームワークでは、私たちの最初の選択肢はまだ@Autowiredされます。
加えて@Resourceや@InjectではまだSpringフレームワークを出た後、通常の使用のことができるように、@Autowiredは現在、Springフレームワークで有効になります。
三、@環境に応じて自動組立プロフィール
時には我々は、テストおよびPROD生産3つのテスト環境を構築DEVがあると仮定して、異なる環境の登録コンポーネントに応じて異なる必要があります。
異なる環境、それがどのように異なる組立部品を実現するには?@Profile注釈は、あなたがそうすることができます。
いくつかのBeanを登録するには、Configurationクラス、多クラス構成:
package com.example.demo.annotation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MainConfig {
@Bean
public Person person111(){
return new Person("李四",40);
}
@Bean
public Person person222(){
return new Person("张三",30);
}
@Bean
public Person person333(){
return new Person("王五",50);
}
}
テスト単位:
package com.example.demo;
import com.example.demo.annotation.MainConfig;
import com.example.demo.annotation.Person;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
class annotationTest {
@Test
void contextLoads() {
AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(MainConfig.class);
String[] typeNames=applicationContext.getBeanNamesForType(Person.class);
for (String typeName:typeNames) {
System.err.println(typeName);
}
}
}
IOCコンテナユニットテストは、これらのコンポーネントを参照するために実行
実際には登録されているBeanコンポーネントを。今、彼らは@Profileノートに記されており、PROD、テスト、DEV環境に設定されています。
@Profile("prod")
@Bean
public Person person111(){
return new Person("李四",40);
}
@Profile("test")
@Bean
public Person person222(){
return new Person("张三",30);
}
@Profile("dev")
@Bean
public Person person333(){
return new Person("王五",50);
}
ユニットテストを実行して、人のコンポーネントでIOCコンテナがなくなっことがわかった
(同時に、環境の多様性を開発することができます)PRODとテストに環境をバックアップユニット・テスト・セットを変更します。
@Test
void contextLoads() {
AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext();
applicationContext.getEnvironment().setActiveProfiles("prod","test");
applicationContext.register(MainConfig.class);
applicationContext.refresh();
String[] typeNames=applicationContext.getBeanNamesForType(Person.class);
for (String typeName:typeNames) {
System.err.println(typeName);
}
}
ユニットテストは、テストPRODと部品を容器IOCに導入されていることを見つけるために、もう一度実行してください。
@Profileのdevのノートの次のコンポーネントを削除するには、ユニットテストを再度実行します:
見つかりませ印@Profile注釈豆のデフォルトは、容器内に導入されます。
また、この注釈は、クラス、クラスコンフィギュレーションとセットのテスト環境での注釈@Profile、次のラベルにマークすることができます。
package com.example.demo.annotation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Profile("test")
@Configuration
public class MainConfig {
@Bean
public Person person111(){
return new Person("李四",40);
}
@Bean
public Person person222(){
return new Person("张三",30);
}
@Bean
public Person person333(){
return new Person("王五",50);
}
}
テスト環境でのみ、BeanがIOCコンテナにインポートされます。この手段。
手段のテスト、環境試験をアクティブにするために配置されました:
@Test
void contextLoads() {
AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext();
applicationContext.getEnvironment().setActiveProfiles("test");
applicationContext.register(MainConfig.class);
applicationContext.refresh();
String[] typeNames=applicationContext.getBeanNamesForType(Person.class);
for (String typeName:typeNames) {
System.err.println(typeName);
}
}
結果は予想:
現在の環境はテストであるため、そのBeanコンポーネントを配置し、すべてのクラスが容器IOCに導入されています。