上节提到@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");