5

アプリケーションで Spring の Java ベースの構成を使用しています。他の構成を多数インポートするルート構成クラスがあり、それぞれがより多くの構成をインポートする可能性があります。

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

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

@Config
class YetAnotherConfig {
    // beans
}

次に、が に設定されAnnotationConfigWebApplicationContextているweb.xmlファイルでa を宣言して、システムをブートストラップします。contextConfigLocationRootConfig

アプリケーションをブートストラップした構成クラスの完全なセットを特定する方法はありますか? このようないくつかの機能(...のサブクラスを取るかもしれません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 に答える