java - 如何动态配置@ComponentScan?

标签 java spring spring-annotations component-scan

@ComponentScan(  //CS1
    basePackages = {"com.package.A", "com.package.B"},
    excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,
                                           value = {com.Package.A.SomeClass.class
                                           })
)

@ComponentScan(  //CS2
    basePackages = { "com.package.A"}
)
@EnableAutoConfiguration
@SpringBootApplication
public class Application {
  public static void main(String[] args) throws Exception {
    ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args);
  }
}

以上是我的SpringBootApplication的主类。如你所见,我必须使用 Annnotation ,而不是 xml。有两个@ComponentScan注解。当然,Spring 不允许这样做。对我来说,两者不同@ComponentScan意味着启动我的应用程序的两种不同方式。如果我选择使用CS1(这意味着@ComponentScan1),我必须评论CS2,反之亦然。

它不优雅或优美。特别是对于那些 Spring 新手。所以我想知道如何根据我的 .properties 文件动态配置它。这样由于我的 .properties 文件中名为“isScanA”的参数为 true,那么我可以使用 CS1。或者任何其他优雅的方式。

我已经尝试了很多。

  1. 使用占位符。如@ComponentScan(basePackage="${scan.basePackage}")并在需要时更改 .properties 文件中的值。但这种方式无法修复excludeFilters 。因为如果我使用 FilterType.ASSIGNABLE_TYPE要分配需要排除的类,value应该是Class输入不是 String ,如果 value = {"${scan.excludeClass}"}被使用。

  2. 编程方式。

    /**
     * Create a new AnnotationConfigApplicationContext, scanning for bean definitions
     * in the given packages and automatically refreshing the context.
     * @param basePackages the packages to check for annotated classes
     */
    public AnnotationConfigApplicationContext(String... basePackages) {
        this();
        scan(basePackages);
        refresh();
    }
    

我在主函数中调用了这个方法。但它也无法修复excludeFilters问题,原因在这里:Doing context:component-scan programatic way?

...

我真的尝试了很多,但还是无法解决。所以我需要你的帮助。

请原谅我糟糕的英语。

非常感谢,至少你花了一点时间阅读。

最佳答案

也许您正在寻找 Spring 的个人资料! Spring Profile 允许您确定配置和 Bean 的配置文件。我认为你必须将配置类分开才能有两个配置文件!看看这些例子!

这是文档:

http://docs.spring.io/autorepo/docs/spring-boot/current/reference/html/boot-features-profiles.html

关于java - 如何动态配置@ComponentScan?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40359838/

相关文章:

java - 如何在 MyBatis Spring Boot 中使用枚举列表作为参数?

java - 一个应用程序中有多个 Spring @Transactional 注释?

java - 在 struts 1.3 中如何从数据库中检索数据并使用 DAO 显示它

java - android.support.v4.app.fragment 和 androidx.fragment.app.FragmentActivity 有什么区别

java - PlayFramework:CRUD 和排序列表

java - 带索引的数组赋值仅适用于大括号

java - Spring @Resource 注入(inject)返回 NullPointerException

java - mvn 包因新的 SpringBoot 项目而失败

java - 表达式执行 Spring 方面

Spring MVC - HTTP 状态代码 400(错误请求),缺少定义为不需要的字段