目录
@Import({class})
@Import({class}): 容器会自动注册这些组件,id默认是全类名路径
如导入Color、Red
package com.cjian.config;
import com.cjian.bean.Color;
import com.cjian.bean.Person;
import com.cjian.bean.Red;
import com.cjian.condition.LinuxCondition;
import com.cjian.condition.WindowsCondition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/**
* @description:
* @author: CJ
* @time: 2020/10/28 9:32
*/
@Conditional({WindowsCondition.class})
@Configuration //告诉spring这是一个配置类
@ComponentScans(value = {
@ComponentScan(value = "com.cjian")
})
@Import({Color.class, Red.class})
public class MainConfig {
@Bean("person")
public Person person01() {
return new Person("cjian", 27);
}
//@Conditional 按照一定的条件进行判断,满足条件才给容器中注册bean,这也是springboot底层大量使用的注解
@Bean("Bill")
public Person person02() {
return new Person("Bill gates", 62);
}
@Conditional({LinuxCondition.class})
@Bean("linus")
public Person person03() {
return new Person("linus", 48);
}
}
测试:
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(
MainConfig.class);
String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
for (String name : beanDefinitionNames) {
System.out.println("===>"+name);
}
}
输出:
===>org.springframework.context.annotation.internalConfigurationAnnotationProcessor
===>org.springframework.context.annotation.internalAutowiredAnnotationProcessor
===>org.springframework.context.annotation.internalCommonAnnotationProcessor
===>org.springframework.context.event.internalEventListenerProcessor
===>org.springframework.context.event.internalEventListenerFactory
===>mainConfig
===>personController
===>personDao
===>personService
===>com.cjian.bean.Color
===>com.cjian.bean.Red
===>person
===>Bill
ImportSelector
返回需要导入的组件的全类名数组,springboot用的多
package com.cjian.condition;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
/**
* @description:
* @author: CJ
* @time: 2020/10/28 20:19
*/
public class MySelector implements ImportSelector {
/*
* 返回值就是要导入到容器中的组件全类名
* AnnotationMetadata annotationMetadata 当前标注@Import注解的类的所有注解信息
*
* 该方法不要返回null
* */
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{"com.cjian.bean.Blue","com.cjian.bean.Yellow"};
}
}
测试代码:
package com.cjian.config;
import com.cjian.bean.Color;
import com.cjian.bean.Person;
import com.cjian.bean.Red;
import com.cjian.condition.LinuxCondition;
import com.cjian.condition.MySelector;
import com.cjian.condition.WindowsCondition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/**
* @description:
* @author: CJ
* @time: 2020/10/28 9:32
*/
@Conditional({WindowsCondition.class})
@Configuration //告诉spring这是一个配置类
@ComponentScans(value = {
@ComponentScan(value = "com.cjian")
})
@Import({Color.class, Red.class, MySelector.class})
public class MainConfig {
@Bean("person")
public Person person01() {
return new Person("cjian", 27);
}
//@Conditional 按照一定的条件进行判断,满足条件才给容器中注册bean,这也是springboot底层大量使用的注解
@Bean("Bill")
public Person person02() {
return new Person("Bill gates", 62);
}
@Conditional({LinuxCondition.class})
@Bean("linus")
public Person person03() {
return new Person("linus", 48);
}
}
输出:
===>org.springframework.context.annotation.internalConfigurationAnnotationProcessor
===>org.springframework.context.annotation.internalAutowiredAnnotationProcessor
===>org.springframework.context.annotation.internalCommonAnnotationProcessor
===>org.springframework.context.event.internalEventListenerProcessor
===>org.springframework.context.event.internalEventListenerFactory
===>mainConfig
===>personController
===>personDao
===>personService
===>com.cjian.bean.Color
===>com.cjian.bean.Red
===>com.cjian.bean.Blue
===>com.cjian.bean.Yellow
===>person
===>Bill
ImportBeanDefinitionRegistrar
package com.cjian.condition;
import com.cjian.bean.RainBow;
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;
/**
* @description:
* @author: CJ
* @time: 2020/10/28 20:43
*/
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/*
*AnnotationMetadata:当前类的注解信息
* BeanDefinitionRegistry:BeanDefinition注册类
* */
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
boolean red = registry.containsBeanDefinition("com.cjian.bean.Red");
boolean blue = registry.containsBeanDefinition("com.cjian.bean.Blue");
if(red&&blue){
RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
//注册一个bean,并指定id
registry.registerBeanDefinition("rainbow",beanDefinition);
}
}
}
测试:
输出:
===>org.springframework.context.annotation.internalConfigurationAnnotationProcessor
===>org.springframework.context.annotation.internalAutowiredAnnotationProcessor
===>org.springframework.context.annotation.internalCommonAnnotationProcessor
===>org.springframework.context.event.internalEventListenerProcessor
===>org.springframework.context.event.internalEventListenerFactory
===>mainConfig
===>personController
===>personDao
===>personService
===>com.cjian.bean.Color
===>com.cjian.bean.Red
===>com.cjian.bean.Blue
===>com.cjian.bean.Yellow
===>person
===>Bill
===>rainbow
com.cjian.bean.Blue@15761df8