加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

spring – 包装上的条件ComponentScan

发布时间:2020-12-15 01:37:31 所属栏目:大数据 来源:网络整理
导读:在Spring Boot应用程序中,我有一个包含Application类的包 @SpringBootApplicationclass Application { public static void main(String[] args) { SpringApplication application = new SpringApplication(Application); application.run(args); }} 默认情况

在Spring Boot应用程序中,我有一个包含Application类的包

@SpringBootApplication
class Application {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(Application);
        application.run(args);
    }

}

默认情况下,它会自动从该类的包中设置ComponentScan.然后我有几个子包,每个子包包含几个组件和服务bean(使用注释).但是为了针对不同的用例重用此应用程序,我需要启用/禁用某些子包中的所有组件,最好是通过属性.

那就是我喜欢的子包

org.example.app.provider.provider1
org.example.app.provider.provider2

现在,基于某些属性,我想在其中一个软件包中启用(扫描)bean,例如

provider1.enabled=true

我以为我可以使Configuration类上的ConditionalOnProperty像这样工作,但问题是,默认的@SpringBootApplication组件扫描会拾取bean(即子包配置类不会覆盖顶级组)

所以我认为我会排除这些包,但是当需要新的提供程序包时,这会增加更多的工作(和知识)(需要提前知道为该包添加显式排除).

有没有其他方法如何做到这一点我无法弄清楚?

最佳答案
有条件地加载提供程序组件

使用@ConditionalOnProperty注释的Spring配置就是这样做的:

@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 {
}

然后排除org.example.app.provider下的组件.*

现在,您只需要从Spring Boot Application中排除提供程序(并让CondtionalOnProperty完成它的工作).你可以:

>(1)移动提供程序包,使它们不低于Spring Boot应用程序

例如,如果Spring Boot main位于org.example.app中,请将orCon.example.app中的@Configuration保留在org.example.providers中的提供程序中.

>(2)或者从Spring Boot中排除提供程序包(假设@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);
    }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读