为什么@Configuration类由cglib代理与ConfigurationClassEnhancer类包装

时间:2019-03-31 13:28:39

标签: java spring spring-boot

当我阅读和调试spring源代码时,我发现@configuration类由cglib代理和ConfigurationClassEnhancer类包装,我不理解设计的原因,谢谢

1 个答案:

答案 0 :(得分:0)

处理如下情况。

  • @Configuration类通过@Bean包含bean定义 注释
  • 许多豆都有合作者,所以我们注入那些 使用标准java方法的协作者(也是bean) 语义
  • 因此,每次调用datasource()时,spring都不会创建新的 实例(因为它是Singleton)。
  • 这是因为@Configuartion类被代理并且包含 检查bean是否已在ApplicationContext中的逻辑

    @Configuration
    public class MyConfig{
    
    @Bean
    public MyDao1 Dao1(){
        MyDao1 d1 = new MyDao1();
        d1.setDataSource(datasource());
        return d1;
    }
    
    @Bean
    public MyDao2 Dao2(){
        MyDao1 d2 = new MyDao2();
        d2.setDataSource(datasource());
        return d2;
    }
    
    @Bean
    public Datasource datasource(){
      DataSource ds = new DataSource();
      return ds;
    }
    
    }
    

注意:@Component类也可以通过@Beans定义bean,但是上述情况肯定会引起问题,因为在这种情况下bean调用不会通过代理被拦截。