1、配置一个spring配置文件
package com.zdc.sp.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import com.zdc.sp.impot.MyImportBeanDefinitionRegister;
import com.zdc.sp.impot.MyImportSelect;
import com.zdc.sp.model.Color;
import com.zdc.sp.model.Red;
import com.zdc.sp.model.User;
/**
* @import [快速给容器中导入一个组件]
* 1)、@import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名;
* 2)、ImportSelector:返回需要导入的组件的全类名数组---------->(MyImportSelect.class)
* 3)、ImportBeanDefinitionRegistrar:手动注册bean到容器中------------->MyImportBeanDefinitionRegister.class
* @author lenovo
*
*/
@Configuration
@Import({MyImportSelect.class,MyImportBeanDefinitionRegister.class})//将class类导入容器中(id默认是组建的全类名)
public class ImportConfig {
@Bean("linux")
public User user(){
return new User("张三", 24);
}
@Bean("windows")
public User user1(){
return new User("李四", 24);
}
}
2、ImportSelector --- 》MyImportSelect.class
package com.zdc.sp.impot;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
//自定义逻辑返回需要导入的组件
public class MyImportSelect implements ImportSelector{
//返回值,就是导入到容器中的组件全类名
//AnnotationMetadata:当前标注@Import注解的类的所有信息
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
System.out.println("@@@@@@;"+importingClassMetadata.getSuperClassName());
//方法不要返回null,会报空指针异常
return new String[]{"com.zdc.sp.model.Blue","com.zdc.sp.model.Black"};
}
}
3、ImportBeanDefinitionRegistrar --- 》MyImportBeanDefinitionRegister.class
package com.zdc.sp.impot;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
import com.zdc.sp.model.Yellow;
public class MyImportBeanDefinitionRegister implements ImportBeanDefinitionRegistrar{
/**
* AnnotationMetadata 当前类的注解信息
* BeanDefinitionRegistry:BeanDefinition注册类
* 把所有需要添加到容器中的bean;可调用BeanDefinitionRegistry.registerBeanDefinition手工注册进来
*/
@Override
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) {
//判断是否含有某bean
boolean definition = registry.containsBeanDefinition("com.zdc.sp.model.Red");
if (definition) {
RootBeanDefinition beanDefinition = new RootBeanDefinition(User.class);
registry.registerBeanDefinition("User", beanDefinition);
}
}
}