5

我在我的应用程序中使用 Spring 的基于 Java 的配置。我有一个根配置类,它导入了一堆其他配置,每个配置都可以导入更多配置等等:

@Config
@Import(AnotherConfig.class)
class RootConfig {
    // beans
}

@Config
@Import(YetAnotherConfig.class)
class AnotherConfig {
    // beans
}

@Config
class YetAnotherConfig {
    // beans
}

AnnotationConfigWebApplicationContext然后我通过在我的web.xml文件中声明一个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;
} 
4

1 回答 1

1

@Configuration类像常规 bean 一样由 Spring 管理,因此您可以将它们枚举为ctx.getBeansWithAnnotation(Configuration.class).

但是,我不确定它在复杂情况下如何工作(@Bean@Configuration类中的 s 等)。

于 2013-09-10T12:57:52.837 回答