red*_*ead 7 spring spring-boot
在Spring Boot应用程序中,我有一个包含Application类的包
@SpringBootApplication
class Application {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application);
application.run(args);
}
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,它会自动从该类的包中设置ComponentScan.然后我有几个子包,每个子包包含几个组件和服务bean(使用注释).但是为了针对不同的用例重用此应用程序,我需要启用/禁用某些子包中的所有组件,最好是通过属性.
那就是我喜欢的子包
org.example.app.provider.provider1
org.example.app.provider.provider2
Run Code Online (Sandbox Code Playgroud)
现在,基于某些属性,我想在其中一个包中启用(扫描)bean,例如
provider1.enabled=true
Run Code Online (Sandbox Code Playgroud)
我以为我可以让Configuration类上的ConditionalOnProperty像这样工作,但问题是,bean是由默认的@SpringBootApplication组件扫描拾取的(即子包配置类不会覆盖顶级组)
所以我认为我会排除这些包,但是当需要新的提供程序包时,这会增加更多的工作(和知识)(需要提前知道为该包添加显式排除).
有没有其他方法如何做到这一点我无法弄清楚?
用a注释的Spring配置@ConditionalOnProperty
就是这样做的:
@Configuration
@ComponentScan("org.example.app.provider.provider1")
@ConditionalOnProperty(name = "provider1.enabled", havingValue = "true")
public class Provider1Configuration {
}
@Configuration
@ComponentScan("org.example.app.provider.provider2")
@ConditionalOnProperty(name = "provider2.enabled", havingValue = "true")
public class Provider2Configuration {
}
Run Code Online (Sandbox Code Playgroud)
org.example.app.provider.*
现在,您只需要从Spring Boot Application中排除提供程序(并让它自己CondtionalOnProperty
动手).你可以:
例如,如果Spring Boot主程序位于org.example.app
,则保留@Configuration
in org.example.app
而不是提供程序org.example.providers
@Configuration
是在org.example.app
例如):SpringBootMain.java:
@SpringBootApplication
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASPECTJ, pattern = "org.example.app.provider.*"))
class Application {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application);
application.run(args);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4120 次 |
最近记录: |