Для моего рабочего проекта мы используем внутреннюю структуру Java компании при разработке нашего приложения. Несмотря на свои уникальные особенности, этот фреймворк не такой мощный, как Spring, который обеспечивает доступ к БД, подключение к кешу и другие внешние функции.
Поэтому наша команда решила первой опробовать гибрид фреймворка компании и фреймворка Spring.
Однако из-за сочетания аннотаций и пакетов из двух разных фреймворков нам приходится разделять два фреймворка и настраивать их по-разному для доступа к bean-компонентам Spring.
Шаг 1. Настройте контекст Spring.
Сначала мы создадим класс конфигурации Spring.
@ Конфигурация указывает контейнеру Spring генерировать определения компонентов и запросы на обслуживание. @ ComponentScan следует использовать с @ Configuration, чтобы указать контейнеру Spring найти классы компонентов, такие как тот, который мы определяем на шаге 2 позже. Здесь мы объявляем basePackages, чтобы контейнер Spring мог найти классы компонентов в пути к пакету.
В классе у нас есть статический метод, который создает ConfigurableApplicationContext, который принимает текущий класс Configuration в качестве входных данных и возвращает нам контекст Spring для последующего использования.
@Configuration @ComponentScan(basePackages = {"com.dntech.demo"}) public class SpringContextConfiguration { public static ConfigurableApplicationContext configure(){ ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(SpringContextConfiguration.class); return context; } }
Обратите внимание, что ConfigurableApplicationContext — это интерфейс. Чтобы создать объект контекста, нам нужен конкретный класс реализации — AnnotationConfigApplicationContext. Другие доступные классы реализации вы можете найти здесь.
Шаг 2. Получить Context в нужных классах.
Один из имеющихся у нас классов компонентов — SomeServiceDao. Для простоты мы моделируем метод получения данных из БД, возвращая строку «Некоторые данные БД».
@Component public class SomeServiceDao { public String getSomeDbData(){ return "Some DB data"; } }
Как мы можем использовать приведенный выше контекст Spring для доступа к этому методу?
Приведенный ниже класс SomeService содержит основную бизнес-логику. Здесь мы можем инициализировать SomeServiceDao и ConfigurableApplicationContext в конструкторе по умолчанию.
Мы получим контекст Spring, сначала вызвав статический метод configure(). После этого мы используем метод getBean для назначения поля serviceDao.
Затем мы можем сосредоточиться на нашей бизнес-логике ниже. Здесь у нас есть простой метод для вызова метода из класса serviceDao.
public class SomeService { final SomeServiceDao serviceDao; final ConfigurableApplicationContext context; public SomeService() { this.context = SpringContextConfiguration.configure(); this.serviceDao = this.context.getBean(SomeServiceDao.class); } public String getData(){ return this.serviceDao.getSomeDbData(); } }
Шаг 3. Получите доступ к методу.
public class Application { public static void main(String[] args) { final SomeService someService = new SomeService(); System.out.println(someService.getData()); } }
В основном классе приложения мы можем просто создать наш сервисный класс и вызвать метод:
Наша программа выводит правильную строку.
В этой статье мы увидим, как ConfigurableApplicationContext может помочь нам получить доступ к пользовательским компонентам. Я надеюсь, что вы найдете эту статью полезной.
Если вы похожи на меня и стремитесь изучить Java и узнать больше о бэкэнд-инжиниринге, следите за моим каналом и будьте в курсе того, что меня вдохновляет в повседневной работе и жизни.
Подробнее:
Кейс о статическом ключевом слове Java во время моей работы
Как решить эту проблему многопоточности Java на собеседовании?