如何动态配置@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了。或者任何其他优雅的方式。
我已经尝试了很多。
使用占位符。例如 @ComponentScan(basePackage="${scan.basePackage}")
。并在需要时更改 .properties 文件中的值。但是这种方式无法修复excludeFilters
。因为如果我使用 FilterType.ASSIGNABLE_TYPE
分配需要排除的 class,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();
}
我在主程序中调用了这个方法function.But它也无法解决excludeFilters
问题,原因在这里:Doing context:component-scan programatic way?
...
我真的试了很多,但仍然无法修复。所以我需要你的帮助。
请原谅我糟糕的英语。
非常感谢,至少你有一点时间阅读。
也许您正在寻找 Spring 的个人资料! Spring 配置文件允许您确定配置和 Bean 的配置文件。我认为你必须分开配置 类 才能有两个配置文件!看看这些例子!
- How to set a Spring profile to a package?
- https://www.mkyong.com/spring/spring-profiles-example/
这是文档:
http://docs.spring.io/autorepo/docs/spring-boot/current/reference/html/boot-features-profiles.html
@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了。或者任何其他优雅的方式。
我已经尝试了很多。
使用占位符。例如
@ComponentScan(basePackage="${scan.basePackage}")
。并在需要时更改 .properties 文件中的值。但是这种方式无法修复excludeFilters
。因为如果我使用FilterType.ASSIGNABLE_TYPE
分配需要排除的 class,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(); }
我在主程序中调用了这个方法function.But它也无法解决excludeFilters
问题,原因在这里:Doing context:component-scan programatic way?
...
我真的试了很多,但仍然无法修复。所以我需要你的帮助。
请原谅我糟糕的英语。
非常感谢,至少你有一点时间阅读。
也许您正在寻找 Spring 的个人资料! Spring 配置文件允许您确定配置和 Bean 的配置文件。我认为你必须分开配置 类 才能有两个配置文件!看看这些例子!
- How to set a Spring profile to a package?
- https://www.mkyong.com/spring/spring-profiles-example/
这是文档:
http://docs.spring.io/autorepo/docs/spring-boot/current/reference/html/boot-features-profiles.html