В документации приведен такой пример:
@Configuration
public class AppConfig {
@Bean
public ClientService clientService1() {
ClientServiceImpl clientService = new ClientServiceImpl();
clientService.setClientDao(clientDao());
return clientService;
}
@Bean
public ClientService clientService2() {
ClientServiceImpl clientService = new ClientServiceImpl();
clientService.setClientDao(clientDao());
return clientService;
}
@Bean
public ClientDao clientDao() {
return new ClientDaoImpl();
}
}
И сказано, что в этом случае будет не 2 экземпляра ClientDAO, а один. И связано это с тем, что ClientDAO - это Singleton и классы помеченные @Configuration по умолчанию используют CGLIB proxy.
Мне интересно, а что будет, если класс AppConfig будет помечен @Component вместо @Configuration? Или Spring использует прокси для всех компонентов?
Связано это с тем, что все бины в Spring - это одиночки по умолчанию. Цитата оттуда же:
in Spring, instantiated beans have a singleton scope by default
А CGLIB - это способ, с помощью которого Spring добивается в данном случае возврата одного и того же экземпляра при каждом вызове метода.
CGLIB - это аббревиатура от Code Generation Library. Без кодогенарации не удалось бы перехватить вызовы метода внутри класса. Обычные JDK Dynamic proxy позволяют перехватывать только "внешние" вызовы.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости