@Import[快速給容器中導(dǎo)入一個(gè)組件]
@Import(要導(dǎo)入到容器中的組件);容器中就會(huì)自動(dòng)注冊這個(gè)組件,id默認(rèn)是全類名
- @Import 注解 其內(nèi)部是一個(gè) Class 數(shù)組
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
Class<?>[] value();
}
- 新建一個(gè)Bean Color
public class Color {
}
- 使用@Import 注解快速導(dǎo)入
@Conditional({WindowsCondition.class})
@Import(Color.class)
@Configuration
public class MainConfig2 {
@Scope("singleton")
@Lazy
//@Scope("prototype")
@Bean("person")
public Person person(){
return new Person("zhangsan",22);
}
@Conditional(LinuxCondition.class)
@Bean("linux")
public Person person01(){
return new Person("linus",10);
}
@Conditional(WindowsCondition.class)
@Bean("windows")
public Person person02(){
return new Person("bill",30);
}
}
- 同時(shí)導(dǎo)入多個(gè)bean
@Conditional({WindowsCondition.class})
@Import({Color.class, Red.class})
@Configuration
public class MainConfig2 {
@Scope("singleton")
@Lazy
//@Scope("prototype")
@Bean("person")
public Person person(){
return new Person("zhangsan",22);
}
......
}
@ImportSelector:返回需要導(dǎo)入的組件的全類名數(shù)組
- 實(shí)現(xiàn) ImportSelector 接口
public class MyImportSelector implements ImportSelector {
/**
*
* @param importingClassMetadata 當(dāng)前標(biāo)注@Import注解的類的所有注解信息
* @return 返回值序臂,就是到導(dǎo)入到容器中的組件全類名
*/
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
//方法不要返回null值
return new String[]{"com.spring.annotation.bean.Bule","com.spring.annotation.bean.Yellow"};
}
}
- 單元測試
@Test
public void testImport(){
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
}
- 測試結(jié)果
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig2
com.spring.annotation.bean.Color
com.spring.annotation.bean.Bule
com.spring.annotation.bean.Yellow
person
windows
注意:@Import 注入bean的id 是全類名
ImportBeanDefinitionRegistrar: 手動(dòng)注冊bean到容器中
- 實(shí)現(xiàn)ImportBeanDefinitionRegistrar接口
/**
* ImportBeanDefinitionRegistrar: 手動(dòng)注冊bean到容器中
*/
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
*
* @param annotationMetadata 當(dāng)前類的注解信息
* @param beanDefinitionRegistry BeanDefinition注冊類
*
* BeanDefinitionRegistry.registerBeanDefinition手工注冊進(jìn)來
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata,
BeanDefinitionRegistry beanDefinitionRegistry) {
boolean definition = beanDefinitionRegistry.containsBeanDefinition("com.atguigu.bean.Red");
boolean definition2 = beanDefinitionRegistry.containsBeanDefinition("com.atguigu.bean.Blue");
if(definition && definition2){
//指定Bean定義信息怀读;(Bean的類型泞辐,Bean秒旋。煤辨。裳涛。)
RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
//注冊一個(gè)Bean,指定bean名
beanDefinitionRegistry.registerBeanDefinition("rainBow", beanDefinition);
}
}
}
- 在@Import注解中使用 中使用
//類中組件統(tǒng)一設(shè)置众辨。滿足當(dāng)前條件端三,這個(gè)類中配置的所有bean注冊才能生效;
@Conditional({WindowsCondition.class})
@Import({Color.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
@Configuration
public class MainConfig2 {
@Scope("singleton")
@Lazy
//@Scope("prototype")
@Bean("person")
public Person person(){
return new Person("zhangsan",22);
}
@Conditional(LinuxCondition.class)
@Bean("linux")
public Person person01(){
return new Person("linus",10);
}
@Conditional(WindowsCondition.class)
@Bean("windows")
public Person person02(){
return new Person("bill",30);
}
}
- 測試代碼
@Test
public void testImport(){
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
}
- 測試結(jié)果
Person constructor....
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig2
com.spring.annotation.bean.Color
com.spring.annotation.bean.Bule
com.spring.annotation.bean.Yellow
person
windows
Process finished with exit code 0