gpt4 book ai didi

spring - 包装上的条件ComponentScan

转载 作者:行者123 更新时间:2023-12-04 11:35:00 24 4
gpt4 key购买 nike

在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(即子包Configuration类不会覆盖顶层的bean)

所以我以为我会排除这些软件包,但是当需要一个新的提供者软件包时(这需要事先知道为该软件包添加显式排除),这会增加更多的工作(和知识)。

还有其他方法无法解决吗?

最佳答案

有条件地加载提供程序组件

一个带有@ConditionalOnProperty注释的Spring Configuration可以做到这一点:

@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中,则将@Configuration保留在org.example.app中,但将提供者保留在org.example.providers
  • (2)或从Spring Boot中排除提供程序包(例如,假设@Configurationorg.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);
    }
    }

    关于spring - 包装上的条件ComponentScan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39167688/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com