如何动态配置@ComponentScan?

How to config @ComponentScan dynamic?

@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的主要class.如你所见,我必须使用注释,而不是xml。有两个@ComponentScan Annotations.And当然是不允许的Spring。对我来说,两个不同的 @ComponentScan 意味着启动我的应用程序的两种不同方式。如果我选择使用CS1(它表示@ComponentScan1),我必须评论CS2,反之亦然

对于 Spring 的新手来说,它并不优雅或 graceful.Especially。所以我想知道如何根据我的 . properties file。比如我的.properties文件中一个参数"isScanA"是true,那么我就可以使用CS1了。或者任何其他优雅的方式。

我已经尝试了很多。

  1. 使用占位符。例如 @ComponentScan(basePackage="${scan.basePackage}") 。并在需要时更改 .properties 文件中的值。但是这种方式无法修复excludeFilters。因为如果我使用 FilterType.ASSIGNABLE_TYPE 分配需要排除的 class,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();
    }
    

我在主程序中调用了这个方法function.But它也无法解决excludeFilters问题,原因在这里:Doing context:component-scan programatic way?

...

我真的试了很多,但仍然无法修复。所以我需要你的帮助。

请原谅我糟糕的英语。

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

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

这是文档:

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