Как обеспечить доступ к бинам для классов, не являющихся точкой входа в приложение (и бинами)?
Из ответов на вопрос Как убрать приведение типа из конструкции фреймворка Spring applicationContext.getBean? я узнал, что для соблюдения инверсии контроля использовать applicationContext можно только в конфигурационных классах Spring, а также в точке входа, например:
public class EntryPoint {
public static void main (String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationContext.class);
FilesManager filesManager = applicationContext.getBean(FilesManager.class);
PeopleGateway peopleGateway = applicationContext.getBean(PeopleGateway.class);
filesManager.initializeUserFiles();
GUI_Service.startGUI();
}
}
Каким же образом принято обеспечивать доступ к бинам из всех остальных классов? Например, в данном приложении GUI_Service будет вызывать у peopleGateway разные методы - getAllPeolple, getPersonByID и так далее. К контексту GUI_Service обращаться вроде как не должен. А в точке входа peopleGateway пока что и вовсе не нужен.
Обычный способ - передать peopleGateway либо через конструктор GUI_Service, либо через какой-нибудь инициализирующий метод. Что даёт Spring?
GUI_Service на данный момент пока не является бином.
Ответы (2 шт):
Для доступа к бинам используется аннотация @Autowired. Её можно вешать на поле или геттер.
В Спринге связать бины можно различными способами:
1) Связывание над сеттерами аннотацией @Autowired над ней.
2) Через поле и аннотацию, которая подтянет бин в классе AppConfig. Данный метод обозначен аннотацией @Bean, что автоматически подтягивает аргументы в метод.
3) Так же возможно конструировать через связывание по @Autowired с помощью конструктора. Необоходимо пометить все классы, которые являются бинами аннотацией @Component.Чтобы Спринг видел все бины, в классе AppConfig была добавлена аннотация @ComponentScan.
Ниже я представил пример 3-х различных вариантов связывания бинов. В практическом примере можно ознакомиться более детально.