スプリングドライブ自動組立アノテーション(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に導入されています。

公開された17元の記事 ウォンの賞賛1 ビュー301

おすすめ

転載: blog.csdn.net/weixin_43424932/article/details/104081211