【发布时间】:2013-09-10 12:38:14
【问题描述】:
我在我的应用程序中使用 Spring 的基于 Java 的配置。我有一个根配置类,它导入了一堆其他配置,每个配置都可以导入更多配置等等:
@Config
@Import(AnotherConfig.class)
class RootConfig {
// beans
}
@Config
@Import(YetAnotherConfig.class)
class AnotherConfig {
// beans
}
@Config
class YetAnotherConfig {
// beans
}
然后我通过在我的web.xml 文件中声明一个AnnotationConfigWebApplicationContext 来引导系统,该文件的contextConfigLocation 设置为RootConfig。
有没有办法确定启动我的应用程序的全套配置类? 像这样的一些函数(可能需要ctx...的子类):
List<Class> readConfigClasses(ApplicationContext ctx) {
// what goes here?
// should return [ RootConfig.class,
// AnotherConfig.class,
// YetAnotherConfig.class ]
}
更新:@axtavt 的答案大部分都在那里,返回实际的配置对象本身,在我的例子中,它们是由 CGLIB 增强的实例。抓住这些代理的超类就行了:
List<Class<?>> readConfigClasses(final ApplicationContext ctx) {
List<Class<?>> configClasses = new ArrayList<Class<?>>();
for (final Object config :
ctx.getBeansWithAnnotation(Configuration.class).values()) {
configClasses.add(config.getClass().getSuperclass());
}
return configClasses;
}
【问题讨论】:
-
你在运行时需要这个,还是只是开发?打开完整的 Spring 日志记录通常足以确定(通过手动检查)加载了哪些配置类。
-
@artbristol,理想情况下在运行时...
-
您可以尝试查看
org.springframework.beans.factory.config.BeanFactoryPostProcessor,但不知道您的确切要求,这很棘手。你确定你需要这样做吗? -
@artbristol,该列表用于允许运行时检查应用程序的确切配置(这更像是一个框架本身,而不是一个简单的应用程序)。
-
听起来很复杂!您确定配置不应该通知应用程序必要的信息吗?而不是应用程序与其配置耦合?
标签: java spring configuration