【问题标题】:How to enumerate Spring java configuration classes?如何枚举Spring java配置类?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多