2016-03-31 7 views
2

В частности, я хотел бы иметь возможность разделять классы конфигурации, создавая их и включающие в себя. Где вы обычно делаете это:Как я могу программно настроить аннотации @Configuration Spring?

@Configuration 
@Import({SharedConfiguration.class}) 
public class MyAppContext extends WebMvcConfigurerAdapter { 
    //stuff 
} 

@Configuration 
@ComponentScan("com.example") 
public class SharedConfiguration { 
    //stuff 
} 

Я хотел бы сделать это:

@Configuration 
public class MyAppContext extends WebMvcConfigurerAdapter { 
    public SharedConfiguration sharedConfig(){ 
    return new SharedConfiguration("com.example"); 
    } 

    //stuff 
} 

@Configuration 
public class SharedConfiguration { 
    public SharedConfiguration(String package){ 
    //tell Spring to scan package 
    } 
} 

Причина этого заключается в том, что мне нужно, чтобы быть в состоянии сказать, общий компонент делает сканирование, какой пакет посмотри на. Он будет отличаться в зависимости от того, какой проект он используется в

EDIT:.

Чтобы обеспечить некоторый дополнительный контекст, я пытаюсь сделать конфигурацию общего использования для создания Hibernate и EHCache, используя нашу внешнюю конфигурацию который может использовать несколько проектов. Я, конечно, открыт для других методов, но это казалось мне самым логичным путем. Я уверен, что есть что-то ~ весной, что я могу поиграть, чтобы сказать: «Вот! Сканируй этот путь, когда Весна тебя инициализирует!» вместо жесткого кодирования в аннотацию.

+0

Звучит как проблема XY; более подробная информация была бы полезна. В частности, какова цель сканирования различных пакетов при разных обстоятельствах? Это звучит как случай для профилей, условных выражений и/или автоконфигурации. – chrylis

+0

@chrylis Обновлен вопрос, чтобы сделать его более понятным. Конечно, это может быть проблема XY, я пытаюсь сделать что-то программным способом, и Spring явно не очень программный. – monitorjbl

+0

Вам точно нужна автоконфигурация. В основном он использует SPI для поиска классов '@ Configuration', а затем импортирует их в контекст. – chrylis

ответ

0

В этом случае вы можете воспользоваться источниками имущества.
В тестовом случае, я устанавливаю свойство системы, которая подхвачена конфигурации Spring источника свойство -

@RunWith(SpringRunner.class) 
@ContextConfiguration 
public class MyAppContextTest { 

    @Autowired 
    ApplicationContext context; 

    @BeforeClass 
    public static void beforeClass() { 
     // use a system property to configure the component scan location of the SharedConfiguration 
     // where the "ExampleBean" lives 
     System.setProperty("packages", "net.savantly.other.packages"); 
    } 

    @Test 
    public void ensureExampleBeanExists() { 
     // throws exception if it doesnt exist 
     context.getBean(ExampleBean.class); 
    } 


    @Configuration 
    @Import(MyAppContext.class) 
    static class TestContext { 

    } 
} 

Использование языка выражений Весна в ComponentScan -

@Configuration 
@ComponentScan("${packages}") 
public class SharedConfiguration {} 

Другие Ссылочные Классы -

@Configuration 
@Import(SharedConfiguration.class) 
public class MyAppContext extends WebMvcConfigurerAdapter { 

    @Autowired 
    SharedConfiguration sharedConfig; 

    //stuff 
} 

@Service 
public class ExampleBean { 

}