我正在使用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;
}
}
答案 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的服务应该只说“嘿,我想加载此配置”,而不要扫描该罐子的包装结构内部。为什么会这样呢?
现在在春季,有两种简单的方法可以想到:
方法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工厂结合使用,可以创建一种非常灵活的方式来管理您的配置