Spring Boot: Как включить класс конфигурации, которого нет в моем базовом пакете? - PullRequest
2 голосов
/ 06 февраля 2020

У меня довольно стандартное приложение с весенней загрузкой, которое построено с использованием gradle из нескольких модулей gradle. Вот макет каталога:

 - root
   - serviceA
     - src/main/java
       - org.example.serviceA
         - ServiceAApplication.java
   - serviceB
   - serviceC
   - common
     - src/main/java
       - org.example.common
         - CommonSecurityConfiguration.java

Я бы хотел включить класс CommonSecurityConfiguration из общего модуля common в serviceA. Обратите внимание, что ServiceAApplication и CommonSecurityConfiguration находятся в различных базовых пакетах .

Я пытался использовать @Import(CommonSecurityConfiguration.class) на своем ServiceAApplication, но это никак не сказывалось.

Единственное, что сработало, это аннотировать ServiceAApplication примерно так:

@SpringBootApplication(basePackages = { "org.example.serviceA", "org.example.common"})
public class ServiceAApplication { ... }

Этот подход работает, но мне кажется очень грубозернистым - он будет импортировать каждый и каждый компонент и конфигурацию, которые он находит в org.example.common.

Есть ли лучший способ сделать это? Могу ли я включить отдельные классы в проверку компонентов, перечислив их один за другим?

Ответы [ 3 ]

1 голос
/ 06 февраля 2020

Попробуйте использовать @Import (CommonSecurityConfiguration.class) выше класса конфигурации. Так это будет выглядеть так:

@Configuration
@Import(CommonSecurityConfiguration.class)
public class ServiceAConfiguration { ... }
0 голосов
/ 07 февраля 2020

Поскольку вы хотите контролировать, какие компоненты вводятся, мы можем сделать аннотацию, назовем эту аннотацию PickyComponentImport

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface PickyComponentImport{

} 

Затем в нашей аннотации SpringBootApplication мы можем добавить новый фильтр, который ищет эту аннотацию ,

@ComponentScan(basePackages = { "org.example.serviceA",
        "org.example.common" }, includeFilters = @Filter(PickyComponentImport.class))
public class ServiceAApplication { ... }

Затем мы можем просто добавить эту аннотацию к любому классу, который мы хотим включить

@Configuration
@PickyComponentImport
public class CommonSecurityConfiguration {

}

РЕДАКТИРОВАТЬ: Я думаю, что если вы go с таким подходом, вы можете просто установить базовый пакет componentScan как root.

0 голосов
/ 06 февраля 2020

Я считаю, что вы ищете @CompnentScan("com.example"), это скажет Spring рекурсивно просмотреть все файлы по указанному пути. (В этом случае это будет @ComponentScan("root"))

Более подробную информацию вы найдете здесь: baeldun.com / spring-component-scan

Надеюсь, это поможет.

...