上节提到@Configuration的cglib,假设将confi类的方法配置为static,会输出2次
@Configuration
@ComponentScan("com.lmq.BaseService")
//@Import(MyImportBeanDefinitionRegistrar.class)
@Import(MyImportSelector.class)
public class AppConfig {
@Bean
public static lmqDao indexdao()
{
return new lmqDao();
}
@Bean
public lmqDao1 indexdao1()
{
indexdao();
return new lmqDao1(); //会输出2遍“lmqdao1-init",因为是根据执行方法来产生bean,方法调用了一次,总共2次
}
}
原因在于spring处理不同
查看
ConfigurationClassBeanDefinitionReader 的chuli
ConfigurationClassBeanDefinition beanDef = new ConfigurationClassBeanDefinition(configClass, metadata);
beanDef.setResource(configClass.getResource());
beanDef.setSource(this.sourceExtractor.extractSource(metadata, configClass.getResource()));
if (metadata.isStatic()) {
// static @Bean method 设置的是class
beanDef.setBeanClassName(configClass.getMetadata().getClassName());
beanDef.setFactoryMethodName(methodName);
}
else {
// instance @Bean method //设置的是factorybean,后面进入代理,安照上节所讲所以一次
beanDef.setFactoryBeanName(configClass.getBeanName());
beanDef.setUniqueFactoryMethodName(methodName);
}
beanDef.setAutowireMode(RootBeanDefinition.AUTOWIRE_CONSTRUCTOR);
beanDef.setAttribute(RequiredAnnotationBeanPostProcessor.SKIP_REQUIRED_CHECK_ATTRIBUTE, Boolean.TRUE);
AnnotationConfigUtils.processCommonDefinitionAnnotations(beanDef, metadata);
Autowire autowire = bean.getEnum("autowire");