まず、コンポーネントは、注釈をインポートするために使用さ@import
@import注釈機能が容器アセンブリに導入され、我々は、容器アセンブリにレビューモードをインポートする、などのアノテーションによって、スプリングXMによって構成されてもよい@Component
など、コンフィギュレーション・クラスのJavaの方法により容器に導入することができます別のコメントを紹介するノート、今日、その役割は、コンテナにコンポーネントをインポートすることです。
その使い方は非常に簡単で、私たちは、小さな例を与えます
コンフィギュレーション・クラスMainConfig2
@Configuration
@Import({Color.class,Red.class})//将这两个类导入到容器中
//@Import导入组件,id默认是组件的全类名
public class MainConfig2 {
}
Color.classとRed.classは2つの非常に一般的なJavaクラスである、あなたはどのような特別のこの2つのクラスを気にしません。
私たちは、トラバーサルBeanコンポーネントの下の容器の名前のための試験方法を書きます
@Test
public void printBeans(AnnotationConfigApplicationContext applicationContext){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
String[] definitionNames = applicationContext.getBeanDefinitionNames();
for (String name : definitionNames) {
System.out.println(name);
}
}
私たちは、次の印刷の結果を懸念しています:
mainConfig2
com.atguigu.bean.Color //@Import导入组件,id默认是组件的全类名
com.atguigu.bean.Red
二、@インポートインポートImportSelector
このアプローチは、それをインポートするには、上で見たことができますか?コンポーネントの多くは、より厄介である場合か、少しトラブルスポットが、そう、我々はまた、ImportSelectorと組み合わせて使用することができます
まず、我々はと呼ばれる2つのクラスを記述Bule.java
し、Yellow.java
可能であるが、我々は唯一それが正しいアセンブリに注入することができるかどうかを気にどのような種類は、それが空のクラスであっても、そこを心配する必要はありません。
どのようにして使用するにはImportSelector
、それを?
これは継承され、インタフェースであり、達成することができます。
//自定义逻辑返回需要导入的组件
public class MyImportSelector implements ImportSelector {
//返回值,就是到导入到容器中的组件全类名
//AnnotationMetadata:当前标注@Import注解的类的所有注解信息
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
//方法不要返回null值
return new String[]{"com.atguigu.bean.Blue","com.atguigu.bean.Yellow"};
}
}
この選択のために導入され、このメソッドの名前は、selectImports
この方法では、我々はインポートする必要があるコンポーネントを返すために、異なるロジックを書くことができ、上記からのように、,,選択的に導入する手段を見ることができますイントロデューサ定義された選択し、のみインポートするコンポーネントを返すために、具体的な条件判定、自己拡張が存在しない、実証することBlue
とYellow
そして、このクラスが追加される@Import
ので、同様に、注釈パラメータ
@Configuration
@Import({Color.class,Red.class,MyImportSelector.class})//将这两个类导入到容器中
//@Import导入组件,id默认是组件的全类名
public class MainConfig2 {
}
我々はまだ先に使用された試験方法の結果の下に印刷します:
mainConfig2
com.atguigu.bean.Color
com.atguigu.bean.Red
com.atguigu.bean.Blue //Blue被注册进了容器中
com.atguigu.bean.Yellow // Yellow被注册进了容器中
これらは、使用ImportSelectorインタフェースは比較的簡単ですしています。
三、@インポートインポートImportBeanDefinitionRegistrar
ImportBeanDefinitionRegistrar
そして、ImportSelector
我々はそれを実装する必要があり、それがパラメータとして、あなたは@importで置くことができ、それはインターフェースである、ほぼ同じ使用。
カスタム実装クラスMyImportBeanDefinitionRegistrar
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* AnnotationMetadata:当前类的注解信息
* BeanDefinitionRegistry:BeanDefinition注册类;
* 把所有需要添加到容器中的bean;调用
* BeanDefinitionRegistry.registerBeanDefinition手工注册进来
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
boolean definition = registry.containsBeanDefinition("com.atguigu.bean.Red");
boolean definition2 = registry.containsBeanDefinition("com.atguigu.bean.Blue");
if(definition && definition2){
//指定Bean定义信息;(Bean的类型,Bean。。。)
RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
//注册一个Bean,指定bean名
registry.registerBeanDefinition("rainBow", beanDefinition);
}
}
}
コンフィギュレーション・クラスのアノテーションで、このカスタムクラスを追加@import
@Configuration
@Import({Color.class,Red.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})//将这两个类导入到容器中
//@Import导入组件,id默认是组件的全类名
public class MainConfig2 {
}
それでもだけ印刷する方法をテストするためにそれを使用します
mainConfig2
com.atguigu.bean.Color
com.atguigu.bean.Red
com.atguigu.bean.Blue
com.atguigu.bean.Yellow
rainBow // 自定义MyImportBeanDefinitionRegistrar的注册组件
二つの方法の比較を登録した後、我々は、ImportBeanDefinitionRegistrarがその複数のパラメータに加えて、戻り値ではないことがわかりBeanDefinitionRegistry
、つまり、あなたは、Beanのメソッドに直接登録することができます。
第四に、詳細な分析
私たちは、ImportBeanDefinitionRegistrarのソースを見て、
package org.springframework.context.annotation;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.core.type.AnnotationMetadata;
public interface ImportBeanDefinitionRegistrar {
/**
* Register bean definitions as necessary based on the given annotation metadata of
* the importing {@code @Configuration} class.
* <p>Note that {@link BeanDefinitionRegistryPostProcessor} types may <em>not</em> be
* registered here, due to lifecycle constraints related to {@code @Configuration}
* class processing.
* @param importingClassMetadata annotation metadata of the importing class
* @param registry current bean definition registry
*/
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);
}
私たちは、最初のパラメータの方法を見てAnnotationMetadata importingClassMetadata
、メタ情報注釈が付けられ、クラスのすべての音符に設定されている情報は、あなたができるMyImportBeanDefinitionRegistrar
動的登録豆から私たち自身のニーズのロジックを定義します、
違いは、によってこのカテゴリということであるBeanDefinitionRegistry
自体がコンポーネントを登録することができます。