Для моего рабочего проекта мы используем внутреннюю структуру 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 на собеседовании?