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コンテナから検索されず、アプリケーションは正常に実行されます。