我使用的是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 {
}
@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的服务应该只说"嘿,我想加载这个配置",而不是扫描那个jar的包装结构。为什么我这么认为?
- 如果您决定将新的bean添加到infra中的新包中,外部服务是否应该更改代码并定义一个要扫描的附加文件夹?-可能没有
- 如果您决定将基础设施转移到另一个包,该怎么办
现在在春天,有两种简单的方法可以做到这一点:
方法1:使用@Import Annotation
@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工厂机制
第一种方法有一个缺点:你需要知道服务中的基础设施配置到底是什么。如果你认为这是一个缺点,可以考虑使用弹簧工厂。
Spring工厂允许在某个文件中注册infra配置,这样Spring-boot就会自动将其加载到服务一中,您甚至不需要在服务配置中提及MyInfraConfiguration
,只需向infra jar添加一个依赖项,它就会工作。
在基础设施组件中创建:
META-INF/spring.factories
并添加:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.mycompany.myinfra.whatever.InfraConfiguration
就是这样。现在,如果您想在基础配置中自定义bean的加载,例如,仅在某些属性可用的情况下创建与Mongo相关的模板,您可能需要使用@Conditional
。现在,虽然这有点超出了这个问题的范围,但我提到这一点是因为与春季工厂结合使用,这可以创建一种非常灵活的方式来管理您的配置