我只能通过@ComponentScan获得另一个@Configuration吗

时间:2018-12-06 04:38:58

标签: spring spring-boot spring-config

我正在使用spring-boot 2.0.4;我有一堆服务,它们有一个标记为@Configuration的通用配置类。 我想将其移动到将具有@Configuration的公共依赖项中,并且根据需要,任何微服务都可以使用@ComponentScan从依赖项中激活此配置。

我已经为@Component类做到了这一点,并且工作正常。通过将其添加到@ComponentScan中,可以激活所需的任何特定组件。如何以类似方式(根据需要)激活配置。

下面是代码示例:

常用配置:

-hls_list_size 6 -hls_flags delete_segments

这是一个使用上述依赖的类:

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;
    }
}

1 个答案:

答案 0 :(得分:0)

@Configuration用于指定bean,例如:

@Configuration 
public class MyMongoConfiguration {

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

但是,如果是这样,为什么您根本需要使用@Component(至少对于您创建的bean)? 配置是Spring框架用来加载其他bean的特殊bean,可以将其视为组件扫描的“替代” /替代技术。

我相信,如果您具有一些基础结构配置,可以加载一堆“基础设施bean”(如果我理解正确,则为共享jar),那么使用此jar的服务应该只说“嘿,我想加载此配置”,而不要扫描该罐子的包装结构内部。为什么会这样呢?

  • 如果您决定在下文中将新bean添加到新程序包中,外部服务是否应该更改其代码并定义要扫描的其他文件夹? -可能不会。
  • 如果您决定将红外设备移至另一个软件包怎么办?

现在在春季,有两种简单的方法可以想到:

方法1:使用@导入注释

@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:使用弹簧工厂机制

第一种方法有一个缺点:您需要知道Service中到底是什么基础配置。如果您认为它有缺点,请考虑使用spring工厂。

Spring工厂允许在一些文件中注册基础配置,以便Spring Boot可以自动将其加载到服务中,您甚至不需要在服务配置中提及MyInfraConfiguration,只需向基础添加一个依赖项jar,它将起作用。

在基础组件中创建:

META-INF/spring.factories

并在此处添加

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

就是这样。 现在,如果要自定义infra配置中的bean加载(例如,仅在某些属性可用时创建与Mongo相关的模板),则可能要使用@Conditional。现在,尽管这超出了这个问题的范围,但我提到这一点是因为与Spring工厂结合使用,可以创建一种非常灵活的方式来管理您的配置