春の拡張ポイント3:@Importアノテーション

@Importアノテーションの役割

@Importアノテーションと言えば、次の2つのクラスの
ImportSelectorインターフェイス対応する実装メソッドでは、配列を返す必要があります。配列では、注入されるクラスに対応する完全なクラス名スプリングコンテナは
、ImportBeanDefinitionRegistrarインターフェイスの実装です。メソッドでは、BeanDefinitionRegistryオブジェクトが提供され、メソッド内のオブジェクトを介してbeanDefinitionオブジェクトをbeanDefinitionMapに挿入できます。
これはこれら2つのクラスの関数です。

春のソースコードでは、@ Importアノテーションが最も使用されていますが、誇張ではありません。実際、ほとんどのフレームワークでは、各フレームワークが多くのアノテーションをカスタマイズしていることがわかります。これらのアノテーションのほとんどは、@ Importアノテーションが使用されています。が実行され、@ Importアノテーションを介して、インジェクションは通常、ImportSelectorまたはImportBeanDefinitionRegistrarの実装クラス
ですこれら2つの拡張ポイントの原則に関して、前のブログの春のソースコード:@Importアノテーション
、レコードがありますはい、あまり説明しませんので、大まかにまとめましょう。

1. Springソースコードで、クラスオブジェクトをSpringコンテナが受信できるBeanオブジェクトに変換するには、最初にクラスオブジェクトをbeanDefinitionオブジェクトに変換します。変換プロセスでは、通常、スキャンと変換は次の方法で完了します。 @ComponentScanアノテーションは
2ですが、考慮すべき点:Bean実装クラスまたはImportBeanDefinitionRegistrarを挿入するImportSelectorが存在する可能性がありますが、ImportSelectorは注入されたクラスである可能性がありますが、ImportSelectorまたはImportBeanDefinitionRegistrar実装クラスがある可能性があるため、ソースコードでは再帰的です現在のBeanが通常のBeanになるまで判断が行われ、その後、すべてのBeanがコレクション
3に格納されます。この時点で、@ Importによって導入されたImportSelectorおよびImportBeanDefinitionRegistrar実装クラスが返されます。まだ通常のクラスオブジェクトであり、beanDefinitionに変換されていません。分析が完了すると、Springはこれら2つの実装クラスを統一された方法で処理します。

4.いわゆる統合処理は、現在のimportBeanDefinitionRegistrar、ImportSelector、または@Beanインジェクションが処理され、beanDefinitionに変換されてから、beanDefinitionMapに格納されるかどうかに基づいています。

応用

次に、主にアプリケーションについて説明します。実際、@ Importアノテーションについては、
1。@ Importを介してインゲンマメを直接導入できます。2。ImportSelector
の実装クラスを
導入することもできます。3。ImportBeanDefinitionRegistrarの実装クラスを導入することもできます。

ImportBeanDefinitionRegister

@Configuration
@ComponentScan("com.spring.study.importbeandefinitionregistrar")
@Import({
    
    MyImportBeanDefinitionRegistrar.class,ImportTestBean.class})
public class ImportConfig {
    
    
}
public class ImportTestBean {
    
    
}
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    
    

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    
    
        System.out.println("自己手动注入一个bean");
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(OrderBean.class);
        registry.registerBeanDefinition("orderBean", beanDefinitionBuilder.getBeanDefinition());
    }
}
public class OrderBean {
    
    
}
public class TestImportBeanDefinitionRegistrar {
    
    
    public static void main(String[] args) {
    
    
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ImportConfig.class);
        System.out.println(ac.getBean(OrderBean.class));
        System.out.println(ac.getBean(ImportTestBean.class));
    }
}

最終的な印刷結果

自己手动注入一个bean
18:49:04.903 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor'
18:49:04.906 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'
18:49:04.907 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
18:49:04.909 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
18:49:04.927 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'importConfig'
18:49:04.936 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'com.spring.study.importbeandefinitionregistrar.ImportTestBean'
18:49:04.936 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'orderBean'
com.spring.study.importbeandefinitionregistrar.OrderBean@43301423
com.spring.study.importbeandefinitionregistrar.ImportTestBean@2f112965

ここでの@Importアノテーションは、2つのクラスを挿入します。1つは通常のBeanで、もう1つはimportBeanDefinitionRegistrarの実装クラスです。
したがって、ImportBeanDefinitionRegistrarインターフェースの役割は、BeanDefinitionRegistryをプログラマーに提供することであり、プログラマー自身がビジネスロジックを決定します。行われなければ。

ImportSelector

public class MyImportSelector implements ImportSelector {
    
    

    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
    
    
        return new String[]{
    
    "com.spring.study.importselector.OperChannelEntity","com.spring.study.importselector.UserBean"};
    }
}

ImportSelectorは、このBeanが@Importアノテーションを介してインポートされる限り、あまり多くのコードを投稿しません。Springは、OperChannelEntiryとUserBeanの2つのクラスを挿入するのに役立ちます。

springbootの自動インジェクションは、このポイントを使用してImportSelectorを実装し、自動的にインジェクションされるBeanの完全なクラス名を取得して、返された配列に配置します。

おすすめ

転載: blog.csdn.net/CPLASF_/article/details/115207928