2013-09-10 4 views
4

Я использую конфигурацию Java на основе Spring в своем приложении. У меня есть класс конфигурации корня, который импортирует кучу других конфигураций, каждая из которых может импортировать больше конфигураций и так далее:Как перечислить классы конфигурации 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 ] 
} 

Update: @ ответ 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; 
} 
+0

Вам это нужно во время выполнения или просто в разработке? Включение полномасштабного каротажа обычно достаточно, чтобы выполнить (путем ручного осмотра), какие классы конфигурации были загружены. – artbristol

+0

@artbristol, в режиме исполнения идеально ... –

+0

Вы можете попробовать посмотреть на 'org.springframework.beans.factory.config.BeanFactoryPostProcessor', но, не зная своих точных требований, сложно. Вы абсолютно уверены, что вам нужно это сделать? – artbristol

ответ

1

@Configuration классы управляются с помощью Spring, как обычные бобы, поэтому вы можете перечислить их в качестве ctx.getBeansWithAnnotation(Configuration.class).

Однако я не уверен, как это будет работать в сложных случаях (@Bean s в классах @Configuration и т. Д.).

Смежные вопросы