如何枚举Spring java配置类?

时间:2013-09-10 12:38:15

标签: java spring configuration

我在我的应用程序中使用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;
} 

1 个答案:

答案 0 :(得分:1)

像普通bean一样,

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

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