spring小結(5)---繼續@Configuration

上節提到@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");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章