Могу ли я получить другую @Configuration только через @ComponentScan - PullRequest
0 голосов
/ 06 декабря 2018

Я использую spring-boot 2.0.4;У меня есть несколько служб, и у них есть общий класс конфигурации, помеченный @Configuration.Я хочу переместить это в общую зависимость, которая будет иметь эту @Configuration, и в зависимости от необходимости любой микросервис может использовать @ComponentScan для активации этой конфигурации из зависимости.

Я сделал это для классов @Component, и он работает нормально.Я активирую любой конкретный компонент, который мне нужен, добавив его в @ComponentScan.Как я могу активировать конфигурацию аналогичным образом (в зависимости от необходимости).

Вот примеры кода:

Общая конфигурация:

package abc.department.common.configs.mongo
@Component
public class AbcMongo {
    @Bean
    public MongoTemplate mongoTemplate() {
        // ... create MongoTemplate.
        return createdMongoTemplate;
    }
}

Вот класскоторый использует вышеуказанную зависимость:

@Configuration
@ComponentScan("abc.department.common.configs.mongo")
public class MyServiceConfigs {
}

Точно так же я хочу сделать что-то вроде этого:

package abc.department.common.configs.security.web
@Configuration
@EnableWebSecurity
public class AbcWebSecurity extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // ... do common configs;
    }
}

и теперь, если службе потребуется настройка веб-безопасности, она может получитькак:

    @Configuration
  @ComponentScan({"abc.department.common.configs.mongo","abc.department.common.configs.security.web"})
    public class MyServiceConfigs {
    }

1 Ответ

0 голосов
/ 06 декабря 2018

@Configuration предназначен для указания bean-компонентов, например:

@Configuration 
public class MyMongoConfiguration {

    @Bean
    public MongoTemplate mongoTemplate() {
       return new ...
    }
    @Bean
    public MySampleBean mySampleBean(MongoTemplate tpl) {
       return new MySampleBean(tpl);
    }
}

Но если так, то зачем вам вообще работать с @Component (по крайней мере для создаваемых bean-компонентов)?Конфигурация - это специальный bean-компонент, используемый средой Spring для загрузки других bean-компонентов, и его можно рассматривать как «замену» / альтернативный метод сканирования компонентов.

Я считаю, что если у вас есть какая-то инфраструктурная конфигурация, которая загружает кучуЧто касается «инфраструктурных компонентов» (совместно используемый jar, если я правильно понял), то службы, использующие этот jar, должны только сказать «Эй, я хочу загрузить эту конфигурацию», а не сканировать внутри структуры упаковки этого jar.Почему я так думаю?

  • Что если вы решите добавить новые bean-компоненты в новый пакет в инфра-инфраструктуре, должны ли внешние службы изменить свой код и определить дополнительную папку для сканирования?- Вероятно, не.
  • Что если вы решите переместить инфра в другой пакет?

Теперь в Spring есть два простых способа сделать это:

Способ 1: использовать аннотацию @Import

@Configuration  // this is from "shared artifact" 
class MyInfraConfiguration {

}

@Configuration // this is from an "applicative service" that uses the infra jar in dependencies 
@Import(MyInfraConfiguration.class)
class ServiceAConfiguration {
}

Способ 2: использование механизма Spring Factories

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

фабрики Spring позволяют регистрировать инфраструктуру в каком-либо файле, чтобы Spring Boot автоматически загружал ее в служебную, вам даже не нужно будет упоминать MyInfraConfiguration в конфигурации службы, просто добавьте зависимость к инфра-банке, и она будет работать.

В компоненте инфра создайте:

META-INF/spring.factories

и добавьте туда:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.mycompany.myinfra.whatever.InfraConfiguration

Вот и все.Теперь, если вы хотите настроить загрузку bean-компонентов в инфраструктуре, например создание шаблонов, связанных с Mongo, только при наличии некоторых свойств, вы можете использовать @Conditional.Теперь, хотя это и выходит за рамки данного вопроса, я упоминаю об этом, потому что в сочетании с пружинными фабриками это может создать очень гибкий способ управления вашими конфигурациями

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