背景:采用@Bean注解实例化对象

    1. @Bean(name = "dbTwoDataSource")
    2. @ConfigurationProperties(prefix = "spring.datasource.mes") // application.properteis中对应属性的前缀
    3. public DataSource dbTwoDataSource() {
    4. return DataSourceBuilder.create().build();
    5. }
    6. @Bean
    7. @Primary
    8. IdWorker idWorker() {
    9. DataSource dataSource = dbTwoDataSource();
    10. System.out.println(dataSource.hashCode());
    11. return new IdWorker(1, 1, 1);
    12. }
    13. @Bean
    14. IdWorker idWorker2() {
    15. DataSource dataSource = dbTwoDataSource();
    16. System.out.println(dataSource.hashCode());
    17. return new IdWorker(1, 1, 1);
    18. }

    image.png
    image.png

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