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