如何以编程方式配置Spring的@Configuration注释?

时间:2016-03-31 20:33:00

标签: java spring spring-annotations spring-java-config

具体来说,我希望能够通过实例化它们并包含它们来共享配置类。你通常会这样做的地方:

@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
  }
}

这样做的原因是我需要能够告诉共享组件执行扫描要查看的包。它将根据使用的项目而有所不同。

编辑:

为了提供一些额外的上下文,我正在尝试使用我们的外部配置提供程序来设置Hibernate和EHCache的通用配置,这可以使用多个项目。我当然愿意采用其他方法来做到这一点,但这对我来说似乎是最合乎逻辑的道路。我确信在Spring中有一些东西可以帮我说,“在这里!当Spring初始化你时,扫描这条路!”而不是将其硬编码为注释。

1 个答案:

答案 0 :(得分:1)

在这种情况下,您可以利用财产来源 在测试用例中,我正在设置一个由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中使用Spring表达式语言 -

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

其他参考类 -

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

    @Autowired
    SharedConfiguration sharedConfig;

  //stuff
}

@Service
public class ExampleBean {

}