Spring: @Configuration vs non-@Configuration classes

205
18 июня 2018, 04:10

В документации приведен такой пример:

@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 использует прокси для всех компонентов?

Answer 1

Связано это с тем, что все бины в Spring - это одиночки по умолчанию. Цитата оттуда же:

in Spring, instantiated beans have a singleton scope by default

А CGLIB - это способ, с помощью которого Spring добивается в данном случае возврата одного и того же экземпляра при каждом вызове метода.

CGLIB - это аббревиатура от Code Generation Library. Без кодогенарации не удалось бы перехватить вызовы метода внутри класса. Обычные JDK Dynamic proxy позволяют перехватывать только "внешние" вызовы.

READ ALSO
Как отправить пост запрос и вернуть GET

Как отправить пост запрос и вернуть GET

отправляю POST запрос в строку поиска, и нужно получить страницу ответную например В поисковую строку StackOverFlow вбиваю TEST И получаю https://rustackoverflow

210
Как правильно вынести метод из flatMap?

Как правильно вынести метод из flatMap?

Добрый день есть функция rxJava и есть метод flatMap:

219
Как получить уникальное Id для девайса?

Как получить уникальное Id для девайса?

Как получить никальное id для device-a которое не будет изменяться даже после перепрошивки ?в котором я могу быть уверен на все 100 %это MacAdress,Imei...

196
Ошибка при вызове сервлета Tomcat + spring + hibernate + mysql

Ошибка при вызове сервлета Tomcat + spring + hibernate + mysql

Который раз уже пересоздаю приложение, появляется одно и то

203