#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. Я бы просто понял назначение прокси-класса, а не все его грязные детали.