Это продолжение моей предыдущей страницы о Spring Framework. Я бы порекомендовал вам клонировать этот GIT-репозиторий для этой сессии. Этот репозиторий содержит

  1. Пример кода, демонстрирующий использование концепций Spring в приложениях.
  2. Тестовый код для отработки различных функций Spring.

Spring: конфигурация со сканированием компонентов

В последнем сеансе мы видели, как можно сконструировать Spring Beans, используя комбинацию аннотаций @Bean и @Configuration. На мой взгляд, это нормально для простого приложения, в котором меньше компонентов с небольшим количеством зависимостей. Однако, если приложение Spring является массивным с большим количеством Bean-компонентов, где некоторые Bean-компоненты сложны и зависят от других Bean-компонентов, тогда список зависимостей (который отмечен аннотацией autowire в приведенном ниже примере) и список Bean-компонентов, которые необходимо создать, будут огромный в конфигурационном файле. Это затруднит обслуживание файла конфигурации.

Пример :

@Configuration
Class ApplicationConfiguration  {
// Dependency list
@Autowire
EmployeeDao employeedao
@Autowire
DepartmentService departmentService
...
...
...
// List of beans to be created
@Bean
public EmployeeService employeeService() {
    return new EmployeeService(departmentService, employeedao);
}
@Bean
.....
@Bean
....
....
}

Игнорируйте @Autowire сейчас, если вы не понимаете, так как это отдельная тема. Запомните пока, что это один из способов внедрения зависимостей.

Все, что я описал выше, является одним из способов создания экземпляров Spring Beans и управления ими.

Другой способ создания Beans — использование аннотации @ComponentScan с @Configuration.

Если приложение Spring настроено с аннотацией @ComponentScan, то Spring инициализирует приложение, сканируя пакеты, считывает аннотации для каждого класса в данном пакете и создает Spring Beans (т. е. создает экземпляр объекта и внедряет зависимости). Звучит круто? Разница в том, что Spring автоматически сканирует пакеты, создает bean-компоненты и разрешает зависимости самостоятельно, и нет необходимости явно указывать каждый bean-компонент в файле конфигурации.

Я обычно прохожу этот процесс, почему?

› Нет необходимости создавать Bean-компоненты в каких-либо файлах конфигурации. Представьте, что приложение имеет 200 классов, хотите ли вы создать Bean-компоненты для каждого из них и поддерживать список зависимостей?

› Мне это очень нравится, потому что класс знает, каковы его зависимости, поэтому пусть он разрешается сам по себе, т. е. класс может определить свой список зависимостей, и нам не нужно поддерживать какой-либо класс конфигурации. Например, если EmployeeService зависит от DepartmentService и EmployeeDao, то список зависимостей можно добавить в сам класс и позволить Spring разрешать зависимости для класса.

@Service
Class EmployeeService  {
// Dependency list
@Autowire
EmployeeDao employe
@Autowire
DepartmentService departmentService

Spring при создании Bean для «employeeService» находит и создает Bean для всех зависимостей и внедряет в класс.

Теперь мы знаем, что @ComponentScan — это еще один способ создания bean-компонентов, и мы понимаем важность этого способа. Давайте копнем больше, чтобы узнать, как его можно использовать в приложении Spring.

Я разделил документ на три разных раздела —

  1. Структура приложения — почти такая же, как в нашем реальном проекте.
  2. Какие аннотации Spring участвуют в создании bean-компонентов.
  3. Реализация аннотаций Spring в структуре приложения.

Структура приложения:-

Я нарисовал обычное приложение, состоящее из контроллеров, сервисов, репозиториев и других компонентов. Допустим, приходит запрос, и контроллер получает запрос, перенаправляет его на уровень сервиса, который использует компоненты для создания объекта домена или управления данными и передает на уровень репозитория, который сохраняется в БД.

Каждый тип класса помещается в свой собственный пакет, подобно тому, как сервисы добавляются в пакет *.service, который встроен в наши реальные приложения, где мы склонны создавать отдельные пакеты для разных наборов классов.

Здесь у приложения есть базовый пакет com.learnbypractice.app.simple, и для каждого слоя создаются отдельные пакеты, например:

› com.learnbypractice.service хранит все услуги

› com.learnbypractice.component содержит все components

› com.learnbypractice.репозиторий для репозиториев

› и com.learnbypractice.контроллер для всех контроллеров.

2. Весенние аннотации:-

В рамках раздела мы узнаем об аннотациях, необходимых для сканирования пакетов, чтения классов и создания Bean-компонентов.

@Configuration — классы, аннотированные @Configuration, представляют собой файлы конфигурации Spring. Приложение Spring использует файлы конфигурации для инициализации Spring Container.

@ComponentScan — эта аннотация используется в сочетании с @Configuration. , и он сообщает Spring, какие пакеты сканировать и какие типы классов читать и создавать экземпляры.

На рисунке ниже Configuration + ComponentScan сканирует базовый пакет.

Как вы думаете, теперь Spring может создавать Beans на основе классов, доступных в пакете — «com.learnbypractice.app.simple»?

Ответ: «Нет». Эти две аннотации сообщают Spring, какой пакет сканировать на наличие классов, но этого недостаточно для создания Bean-компонентов.

Есть несколько других аннотаций, которые позволяют Spring-ComponentScanner идентифицировать классы для создания bean-компонентов. Это —

  1. @Услуга
  2. @контроллер
  3. @Репозиторий
  4. @Компонент.

Они называются стереотипными аннотациями, и конкретная цель отдельных аннотаций отличается, и мы видим это по мере углубления в сеанс Spring. Однако общим в этих аннотациях является то, что они считываются Spring для идентификации классов для создания Bean-компонентов в контейнере Spring.

Поскольку мы теперь знакомы с различными аннотациями, необходимыми для создания компонентов Spring, давайте попробуем установить связь между ComponentScan и этими стереотипными аннотациями.

Вкратце мы знаем, что аннотации Configuration и ComponentScan используются для сканирования пакетов, чтения классов и создания Bean-компонентов. Однако не все классы в данном пакете подходят для Spring Beans. Только классы, аннотированные с помощью @Service , @Controller, @Repository, @Component участвуют в создании компонента, а другие просто игнорируются.

На рисунке ниже мы определили классы, и некоторые из них отмечены аннотациями, а некоторые опущены, например, чистые Java-бины с «Без аннотации». Таким образом, классы, отмеченные стереотипными аннотациями, подходят для Spring Beans, а другие игнорируются.

Короче говоря, ComponentScan, Configuration сканирует пакеты и ищет классы, аннотированные Service, Controller, Repository & Component для создания Bean-компонентов.

Дополнительная информация:

Аннотация ComponentScan поставляется с параметром по умолчанию для сканирования данного пакета и создания экземпляров Bean-компонентов из служб, контроллеров, репозиториев и компонентов, доступных в пакете. Однако есть возможность добавить фильтр, чтобы генерировать Beans из определенного типа класса.

На приведенном выше рисунке вы можете добавить критерии фильтра для создания экземпляров только служб или контроллеров. На данный момент помните, что эта опция доступна, и позже мы поймем, почему эта опция важна.

3. Реализация :-

Мы увидим, как создать экземпляр Spring Beans из аннотаций, рассмотренных в последнем разделе. Мы начнем сосредотачиваться на одном уровне, и по мере продвижения мы поймем, как классы в нескольких слоях могут быть созданы как экземпляры Spring Beans.

Контроллеры› Здесь мы увидим, какие аннотации и их настройки необходимы для создания экземпляров всех контроллеров, доступных в базовом пакете com.learnbypractice.app.simple.

На рисунке ниже показано, что нам нужен файл конфигурации (т. е. класс, аннотированный аннотациями Configuration и ComponentScan), который сканирует basePackage, находит в пакете все классы, отмеченные аннотацией контроллера, и начинает создавать экземпляры как Beans.

Теперь пришло время применить на практике то, что мы узнали.

Класс конфигурации — класс с аннотациями @Configuration, @ComponentScan. Чтобы проверить контроллер, нам нужно предоставить basePackage и отфильтровать аннотацию контроллера.

InitializeControllerBeansWithConfigurationAndComponentScan

Тестовый класс —

InitializeControllerBeansWithConfigurationAndComponentScanTest

Код приложения использует файл конфигурации для создания Bean-компонентов —

InitializeControllerBeansWithConfigurationAndComponentScanApplication

Службы› Давайте попробуем создать Службы в любом заданном пакете. Процесс такой же, как нам нужен файл конфигурации, который сканирует basePackage, читает классы и создает экземпляры Beans. Разница лишь в том, что нам нужно предоставить фильтр для сервисов.

Класс конфигурации —

InitializeServiceBeansWithConfigurationAndComponentScan

Тестовый класс —

InitializeServiceBeansWithConfigurationAndComponentScanTest

Код приложения использует файл конфигурации для создания Bean-компонентов —

InitializeServiceBeansWithConfigurationAndComponentScanApplication

Репозиторий › Аналогичным образом можно создать Spring Beans с использованием файла конфигурации, сканирующего все классы, аннотированные аннотацией репозитория.

Класс конфигурации —

InitializeRepositoryBeansWithConfigurationAndComponentScan

Тестовый класс —

InitializeRepositoryBeansWithConfigurationAndComponentScanTest

Код приложения использует файл конфигурации для создания Bean-компонентов —

InitializeRepositoryBeansWithConfigurationAndComponentScanApplication

Компонент ›Это особый тип аннотации стереотипа, потому что есть и другие аннотации, которые аннотированы аннотациями компонентов, поэтому, если componentScanner настроен на сканирование аннотаций component, тогда классы, отмеченные знаком @ Службы, @Controller, @Controller, @Configurations создаются как экземпляры Spring Beans.

Класс конфигурации —

InitializeComponentBeansWithConfigurationAndComponentScan

Тестовый класс —

InitializeComponentBeansWithConfigurationAndComponentScanTest

Код приложения использует файл конфигурации для создания Bean-компонентов —

InitializeComponentBeansWithConfigurationAndComponentScanApplication

Вопрос — можете попробовать ответить? Если у вас есть два файла конфигурации, один из которых сканирует службы, а другой сканирует репозитории. Сколько типов Spring Beans создается?

Ответ доступен в следующей части.

Если вам нравится эта часть, хлопайте в ладоши, делитесь и оставляйте свои ценные отзывы.