spring-boot
Сканирование пакетов
Поиск…
Вступление
В этом разделе я расскажу о сканировании весеннего пакета загрузки.
Вы можете найти основную информацию в документах весенней загрузки в следующей ссылке ( используя-boot-structuring-your-code ), но я постараюсь предоставить более подробную информацию.
Весенняя загрузка и весна в целом обеспечивают функцию автоматического сканирования пакетов для определенных аннотаций для создания beans
и configuration
.
параметры
аннотирование | подробности |
---|---|
@SpringBootApplication | Основная аннотация. используется один раз в приложении, содержит основной метод и действует как основной пакет для сканирования пакетов |
@SpringBootConfiguration | Указывает, что класс предоставляет приложение Spring Boot. Должен быть объявлен только один раз в приложении, обычно автоматически, устанавливая @SpringBootApplication |
@EnableAutoConfiguration | Включить автоматическую настройку контекста Spring Spring. Должен быть объявлен только один раз в приложении, обычно автоматически, устанавливая @SpringBootApplication |
@ComponentScan | Используется для запуска автоматического сканирования пакетов на определенном пакете и его дочерних элементах или для установки пользовательского сканирования пакетов |
@Configuration | Используется для объявления одного или нескольких методов @Bean . Можно выбрать автоматическое сканирование пакетов, чтобы объявить один или несколько методов @Bean вместо традиционной конфигурации xml |
@Bean | Указывает, что метод создает компонент, который должен управляться контейнером Spring. Обычно аннотированные методы @Bean будут помещаться в аннотированные классы @Configuration которые будут отобраны при сканировании пакетов для создания компонентов, основанных на конфигурации Java. |
@Составная часть | Объявляя класс как @Component он становится кандидатом на автоматическое обнаружение при использовании аннотационной конфигурации и сканирования классов. Обычно класс, аннотированный с помощью @Component , станет bean в приложении |
@Repository | Первоначально он был определен Domain-Driven Design (Evans, 2003) как «механизм инкапсуляции хранилища. Обычно он используется для указания Repository для spring data |
@Обслуживание | Очень похоже на @Component . первоначально разработанный Domain-Driven Design (Evans, 2003) как «операция, предлагаемая как интерфейс, который стоит отдельно в модели без инкапсулированного состояния». |
@Controller | Указывает, что аннотированный класс является «контроллером» (например, веб-контроллером). |
@RestController | Удобная аннотация, которая сама аннотируется с помощью @Controller и @ResponseBody . Будет автоматически выбран по умолчанию, поскольку он содержит аннотацию @Controller по умолчанию. |
@SpringBootApplication
Самый простой способ структурирования вашего кода с использованием весенней загрузки для хорошего автоматического сканирования пакетов - @SpringBootApplication
аннотация @SpringBootApplication
. Эта аннотация предоставляет в себе 3 другие аннотации, которые помогают с автоматическим сканированием: @SpringBootConfiguration
, @EnableAutoConfiguration
, @ComponentScan
(больше информации об каждой аннотации в разделе « Parameters
»).
@SpringBootApplication
обычно размещается в основном пакете, а все остальные компоненты будут размещены в пакетах в этом файле:
com
+- example
+- myproject
+- Application.java (annotated with @SpringBootApplication)
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
+- CustomerController.java
Если не указано иное, пружинная загрузка @Configuration
обнаруживает @Configuration
, @Component
, @Repository
, @Service
, @Controller
, @RestController
аннотации автоматически под сканированными пакетами ( @Configuration
и @RestController
выбираются, потому что они аннотируются @Component
и @Controller
соответственно ).
Пример базового кода:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Установка пакетов / классов в явном виде
Начиная с версии 1.3 вы также можете сказать весеннюю загрузку для сканирования определенных пакетов, установив scanBasePackages
или scanBasePackageClasses
в @SpringBootApplication
вместо указания @ComponentScan
.
-
@SpringBootApplication(scanBasePackages = "com.example.myproject")
- установитеcom.example.myproject
в качестве базового пакета для сканирования. -
@SpringBootApplication(scanBasePackageClasses = CustomerController.class)
- типа безопасная альтернативаscanBasePackages
устанавливает пакетCustomerController.java
,com.example.myproject.web
, так как базовый пакет для сканирования.
Исключение автоматической настройки
Еще одна важная особенность - возможность исключения определенных классов автоматической конфигурации с использованием exclude
или excludeName
( excludeName
существует с версии 1.3 ).
-
@SpringBootApplication(exclude = DemoConfiguration.class)
- исключаетDemoConfiguration
из автоматического сканирования пакетов. -
@SpringBootApplication(excludeName = "DemoConfiguration")
- будет делать то же самое с использованием полностью классифицированного имени класса.
@ComponentScan
Вы можете использовать @ComponentScan
для настройки более сложного сканирования пакетов. Также есть @ComponentScans
которые выступают в качестве аннотации к контейнеру, которая объединяет несколько аннотаций @ComponentScan
.
Примеры базового кода
@ComponentScan
public class DemoAutoConfiguration {
}
@ComponentScans({@ComponentScan("com.example1"), @ComponentScan("com.example2")})
public class DemoAutoConfiguration {
}
@ComponentScan
без конфигурации действует как @SpringBootApplication
и сканирует все пакеты под классом, аннотированные этой аннотацией.
В этом примере я @ComponentScan
некоторые полезные атрибуты @ComponentScan
:
- basePackages - может использоваться для указания определенных пакетов для сканирования.
- useDefaultFilters - установив этот атрибут в false (по умолчанию true), вы можете убедиться, что весна не сканирует
@Component
,@Repository
,@Service
или@Controller
автоматически. - includeFilters - может использоваться для включения конкретных весенних аннотаций / шаблонов регулярных выражений для включения в сканирование пакетов.
- excludeFilters - может использоваться, чтобы исключить определенные шаблоны весенних аннотаций / регулярных выражений для включения в сканирование пакетов.
Есть гораздо больше атрибутов, но они наиболее часто используются для настройки сканирования пакетов.
Создание собственной автоконфигурации
Весенняя загрузка основана на множестве готовых исходных проектов автоматической конфигурации. Вы уже должны быть знакомы с стартовыми проектами весенних ботинок.
Вы можете легко создать свой собственный проект стартера, выполнив следующие простые шаги:
- Создайте несколько классов
@Configuration
для определения@Configuration
по умолчанию. Вы должны максимально использовать внешние свойства, чтобы разрешить настройку и пытаться использовать вспомогательные аннотации@AutoConfigureBefore
,@AutoConfigureAfter
как@AutoConfigureBefore
,@AutoConfigureAfter
,@ConditionalOnBean
,@ConditionalOnMissingBean
и т. Д. Более подробную информацию о каждой аннотации можно найти в официальной документации. Аннотации условий - Поместите файл / файлы автоматической конфигурации, который объединяет все классы
@Configuration
. - Создайте файл с именем
spring.factories
и поместите его вsrc/main/resources/META-INF
. - В
spring.factories
установите свойствоorg.springframework.boot.autoconfigure.EnableAutoConfiguration
с разделителями, разделенными запятыми, вашими классами@Configuration
:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.mycorp.libx.autoconfigure.LibXAutoConfiguration,\
com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration
Используя этот метод, вы можете создать свои собственные классы автоматической настройки, которые будут выбраны весной-загрузкой. Spring-boot автоматически сканирует все зависимости maven / gradle для файла spring.factories
, если он находит его, он добавляет все классы @Configuration
указанные в нем, в процесс автоматической настройки.
Удостоверьтесь, что ваш проект стартовой auto-configuration
не содержит spring boot maven plugin
потому что он упакует проект как исполняемый JAR и не будет загружаться по пути класса, как предполагалось. Весенняя загрузка не сможет найти ваши spring.factories
и не загрузит вашу конфигурацию