Spring boot 或者Spring将所有持有模式注解的类元数据,扫描到容器中,然后通过条件注解
ConditionalOnBean筛选可用的Bean,去除不合条件的Bean(删除定义)。
此时会出现如下结果
1.先加载(loadBeanDefinitions)TestLifeComponent 然后加载TestConfiguration,那么这两个类都无法成为容器Bean
2.先加载(loadBeanDefinitions)TestConfiguration 然后加载TestLifeComponent ,那么TestConfiguration 可成为容器Bean
本质上如果TestConfiguration先进行loadBeanDefinitionsForConfigurationClass,那么此时容器中含有
testLifeComponent的定义,就可以顺利进行加载;反之 TestLifeComponent先进行加载,那么此时找name为testConfiguration1的bean定义,那么就会因为不合条件,而被skip掉,并且删除本身在容器中的定义。
public void loadBeanDefinitions(Set<ConfigurationClass> configurationModel) { TrackedConditionEvaluator trackedConditionEvaluator = new TrackedConditionEvaluator(); for (ConfigurationClass configClass : configurationModel) { loadBeanDefinitionsForConfigurationClass(configClass, trackedConditionEvaluator); } }
@Slf4j
@Component
//即使testLifeComponent昙花一现,TestConfiguration也可以被加载上。
@ConditionalOnBean(name = "testLifeComponent")
public class TestConfiguration implements BeanFactoryAware, BeanClassLoaderAware, EnvironmentAware, BeanFactoryPostProcessor {
private static final String mesg = "===========>>>>>>>>>>>>>>>>>>>>>>>>TestConfiguration>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>{}";
static {
log.info(mesg, "process TestConfiguration class...");
}
public int i = 0;
public TestConfiguration(){
log.info("================>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TestConfiguration初始化");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
log.info(mesg, "setBeanFactory" + i++);
log.info(mesg, "setBeanFactory," + StringUtils.arrayToCommaDelimitedString(beanFactory.getAliases("testLifeComponent")));
log.info(mesg, "setBeanFactory," + beanFactory.containsBean("testLifeComponent"));
//log.info(mesg, "setBeanFactory," + beanFactory.getBean("testLifeComponent"));==error
}
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
log.info(mesg, "setBeanClassLoader" + i++);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
log.info(mesg, "postProcessBeanFactory" + i++);
}
@Override
public void setEnvironment(Environment environment) {
log.info(mesg, "setEnvironment" + i++);
}
}
@Slf4j
@Component
@ConditionalOnBean(name = "testConfiguration1")
public class TestLifeComponent implements BeanFactoryAware, BeanClassLoaderAware, EnvironmentAware, BeanFactoryPostProcessor, BeanPostProcessor {
private static final String mesg = "===========>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>{}";
static {
log.info(mesg, "process TestLifeComponent class...");
}
public int i = 0;
public TestLifeComponent(){
log.info("================>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TestLifeComponent初始化");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
log.info(mesg, "setBeanFactory" + i++);
}
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
log.info(mesg, "setBeanClassLoader" + i++);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
log.info(mesg, "postProcessBeanFactory" + i++);
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
//log.info(mesg, "postProcessBeforeInitialization" + i++);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
//log.info(mesg, "postProcessAfterInitialization" + i++);
return bean;
}
@Override
public void setEnvironment(Environment environment) {
log.info(mesg, "setEnvironment" + i++);
}
}