具有多个模块的项目的spring框架中的配置管理的最佳方法?

时间:2015-11-05 01:38:57

标签: spring spring-boot

我有一个像这样的项目设置:

-common-lib (common lib to included by multiple services)
-event-lib (spring framework 4 (read IOC) library for our event buffer. I want to embed the prod configuration within the app so consumers can use it without configuring it.
-serviceA (depends on event-lib, springboot application)
-serviceB (depends on event-lib, spring framework application)

我一直在努力研究如何以Java注释的方式管理配置。

在下面的示例中(作为spring framework 4项目在事件库中运行):

  • 我无法获得PropertySource以兑现环境的spring.profiles.active

  • 即使-Dspring.profiles.active =" dev"环境也不会设置有效的配置文件。被指定)

    @Configuration
    @ComponentScan(basePackages = "com.*")
    @PropertySource("classpath:events-{$spring.profiles.active}.properties")
    public class EventConfiguration {
    
    @Inject
    private ConfigurableApplicationContext ctx;
    
    @Inject
    private Environment environment;
    
    @Value("${events.asset-processing-queue}")
    private String assetProcessingEventQueue;
    }
    

对我来说没有多大意义,因为可以同时激活多个配置文件(引用文件的方法取决于只有1个活动集)。

理想情况下,我试图找到一个解决方案:

  • 使用yaml或属性文件的组合来处理所需的所有环境属性
  • 具有应加载哪些属性的某种智能层次结构。例如。如果我在共享库中指定了一个属性,请尊重它,除非使用者用自己的值覆盖它。
  • 可以在spring framework 4或spring boot app中工作(我们使用AWS lambda做一些事情并且不想要弹簧启动开销)
  • 仅依赖于java注释和属性的平面文件。 (更喜欢避免使用XML)。

1 个答案:

答案 0 :(得分:1)

以下是我们如何做到的:

@PropertySource("classpath:/${env}.config.properties")
public class Application implements RequestHandler<Request, Object> {
    @Override
    public Object handleRequest(Request request, Context awsContext) {

        ExecutionEnvironment env = getEnvironment(awsContext.getFunctionName());

        System.setProperty("env", env.toString());

这尊重环境属性。