почему классы @Configuration обернуты прокси-сервером cglib классом ConfigurationClassEnhancer

#java #spring #spring-boot

#java #spring #весенняя загрузка

Вопрос:

когда я читаю и отлаживаю исходный код spring, я обнаруживаю, что классы @configuration обернуты прокси-сервером cglib классом ConfigurationClassEnhancer, я не понимаю причину дизайна, спасибо

Ответ №1:

Для обработки ситуаций, подобных приведенным ниже.

  • Классы @Configuration содержат определения компонентов через аннотации @Bean
  • У многих компонентов есть соавторы, поэтому мы внедряем эти соавторы (которые также являются beans), используя стандартную семантику метода Java
  • Итак, каждый раз, когда вызывается datasource(), spring не создает новый экземпляр (поскольку он одноэлементный).
  • Это происходит потому, что класс @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 через @Beans , но сценарий, подобный описанному выше, определенно вызовет проблемы, поскольку в этом случае вызовы bean не перехватываются через прокси.

Комментарии:

1. Я определяю @Configuration с именем AppConfig, а cglib создает прокси-класс с именем AppConfig $$EnhancerBySpringCGLIB $$ e53ce80a с помощью AppConfig, я не могу t understand the proxy class, And can прочитать исходные тексты прокси-класса, у вас есть какие-то навыки, чтобы понять их?

2. Я бы просто понял назначение прокси-класса, а не все его грязные детали.