背景:采用@Bean注解实例化对象
@Bean(name = "dbTwoDataSource")@ConfigurationProperties(prefix = "spring.datasource.mes") // application.properteis中对应属性的前缀public DataSource dbTwoDataSource() {return DataSourceBuilder.create().build();}@Bean@PrimaryIdWorker idWorker() {DataSource dataSource = dbTwoDataSource();System.out.println(dataSource.hashCode());return new IdWorker(1, 1, 1);}@BeanIdWorker idWorker2() {DataSource dataSource = dbTwoDataSource();System.out.println(dataSource.hashCode());return new IdWorker(1, 1, 1);}


很神奇是不是。为什么dbTwoDataSource明明是new一个实例,为什么真实执行是同一个实例呢?Spring其实考虑的很周到,在执行ConfigurationClassPostProcessor时会将收集到的带有@Configuration注解的类进行CGLIB增强,使@Bean修饰的方法能够从Spring缓存中获取
