@Importを使用してSpringに構成クラスを登録する場合、この構成クラスに@Componentまたは@Configurationアノテーションを付ける必要はありません。

3種類の@Importアノテーションパラメータ

インゲンマメの種類

インポートされたクラスは、依存性注入で使用できるSpringコンテナにBeanとして登録され、beanNameは完全なクラス名です。

ImportSelectorタイプ

ImportSelector実装クラスはSpringコンテナのBeanとして登録されませんが、そのインターフェイスメソッドによって返される完全なクラス名はBeanとして登録され、beanNameは完全なクラス名です。

//MyImportSelector不会被注册为bean
public class MyImportSelector implements ImportSelector {
    
    

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
    
    
        //ImportedBean1被注册为bean,并且beanName为全类名
        return new String[]{
    
    ImportedBean1.class.getName()};
    }
}

ImportBeanDefinitionRegistrarタイプ

ImportBeanDefinitionRegistrar実装クラスはBeanとして登録されませんが、そのインターフェースメソッドがコールバックされ、開発者はSpringAPIを介して手動でBeanをSpringコンテナーに登録します。

public MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    
    

	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry){
    
    
	   //可以通过registry向Spring容器注册bean
	}
}

@Importが構成クラスを登録するとき、この構成クラスは@Componentまたは@Configurationアノテーションでマークされるべきではありません。

SpringはすべてのBeanクラスを1つにカプセル化しConfigurationClass、これらの構成クラスを解析します。このクラスboolean ConfigurationClass#isImportedはブール型の戻り値メソッドがあり、カプセル化されたBeanクラスが他のクラスによってインポートされるかどうかを判別します。メソッドノートは次のとおりです。

Return whether this configuration class was registered via @Import 
or automatically registered due to being nested within another configuration class.

中国語の説明:@Importを介して登録されたクラス、または構成クラスで定義された内部クラスの場合、trueが返され、他のクラスによってインポートされたかどうかがわかります。
次の例:

//其他代码省略....
@Import(B.class)
@ConditionOnBean(C.class) //条件验证bean C是否存在
class A{
    
    
   //只有当A上的条件验证通过时才会向Spring容器注入D
   @Bean
   public D d(){
    
    
       return new D();
   }
}

この例では、BはAによってインポートされたBeanです。

インポートされたクラスBがインスタンス化されると、Springは最初にBのインポートされたクラスAの条件付きアノテーションが検証されているかどうかを検証し、合格した場合はBがインスタンス化されます。条件付き検証アノテーションの結果は同時にキャッシュされます。

そして、@Componentまたは@Configuration注釈が@importクラスBは、導入されたクラスAとは考えられないであろう、この時点で、実行された春のパッケージをスキャン中にスキャンされる、導入されます。この時点でBeanBがインスタンス化され、BがAで定義されたBean Dに依存しているが、この時点でのAの条件検証に合格しなかった場合、BeanBは作成時にBeanDに依存できなくなります。 、および例外が最後にスローされます。

クラスBが通常@Component@Configuration注釈なしでクラスAによってインポートされる場合、Bean Bがインスタンス化される前に、まずクラスAの条件付き注釈が合格するかどうかが検証されます。合格する場合、クラスBはインスタンス化中にAの定義に依存します。 Bean Dも通常どおり作成でき、Bのすべての依存関係が注入されます。失敗した場合、Bean Bは作成されず、Aで定義されたBean DはSpringコンテナから検索されず、アプリケーションは正常に実行されます。

おすすめ

転載: blog.csdn.net/u013202238/article/details/107126622