当前位置: 首页 > 知识库问答 >
问题:

条件组件在包上扫描

须巴英
2023-03-14

在spring boot应用程序中,我有一个包含应用程序类包,如

@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这样工作,但问题是,Bean是由默认的@SpringBootApplication组件扫描拾取的(即子包配置类不重写顶层配置类)

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

有没有别的办法我想不出来的?

共有1个答案

楚宪
2023-03-14

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

现在,您所需要的只是从spring boot应用程序中排除提供者(并让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);
    }
}
 类似资料:
  • 问题内容: 我有一个组件,有时有时需要呈现为和,有时需要呈现为。在我读来确定这一点,是。 如果存在,则需要将组件包装在中。否则,它将仅呈现为。 可能? 这是我现在正在做的,但是感觉可以简化: 更新: 这是最终的锁定。感谢您的提示,@ Sulthan! 问题答案: 只需使用一个变量。 或者,您可以使用辅助函数来呈现内容。JSX和其他代码一样。如果要减少重复,请使用函数和变量。

  • 我有一个eclipse java项目,在/src/main/java(包com.xxx.yyy)下。我还在/src/Test/java(包com.xxx.yyy)下有几个测试类。测试类(注释为@Service(value=“sampleclient”)公共类sampleclient{…}由位于/src/main/java下的一个包中的框架代码调用。 如果所有文件/包都位于/src/main/jav

  • 我找不到关于beans xml配置的文档,所以我在这里问:在 在概念上与Java中的包相同吗? 例如,在我的src/main/java(Eclipse中的项目资源管理器视图,平面包演示)中,假设我有4个包com.amazon、com.amazon.entities、com.amazon.services、com.amazon.repositories.在Navigator视图中,我只有“amazo

  • 我正在编写一个新的SpringBoot项目,其中我的根包名是“com.example”。在我的gradle配置中,我添加了一个第三方库的依赖项,它的根包名为“org.base”。现在,这个库中有带有@Component注释的类,我想在代码中使用@Autowired 在我的配置类中,我也扫描第三方库的基本包。 当我运行应用程序时,spring无法从这个库中找到/创建bean,我得到了一个bean n

  • 我需要为类构建映射(字面上是

  • 难以存储条形码/二维码 2.)QR/Barcode直接从指定的URI打开电子表格 更改文件路径可使QR/条形码无效 null