如何配置@ComponentScan动态?

时间:2016-11-01 12:11:41

标签: 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”的参数,我可以使用CS1。或任何其他优雅的方式。

我已经尝试了很多。

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

  2. 程序化方式。

    excludeFilters
  3. 我在我的main函数中调用了这个方法。但它也无法修复Editor -> File Types -> Ignore Files and Folders问题,原因在于:Doing context:component-scan programatic way?

    ...

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

    请原谅我可怜的英语,PLZ。

    Thanx很多,至少你花了一点时间阅读。

1 个答案:

答案 0 :(得分:4)

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

以下是文档:

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