SpringBoot并使用/加载动态“ applicationContext.xml”,而不是硬编码的

时间:2019-02-26 21:38:09

标签: spring-boot spring-bean

我看过一百个例子:

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;

@SpringBootApplication
@ImportResource("classpath:applicationContext.xml")
public class MySpringBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }
}

我已经走了好几个小时了。

我正在构建一个框架...。我需要从xml依赖项注入文件(又名“ beans”)中加载(少数依赖项,不是全部...):

applicationContext.xml

并且我需要命名为动态名称,而不是硬编码。

String myValue = "DefaultEnvVarValue";
String envValue = System.getenv("MYENVVARIABLENAME");
if (null != envValue )
{
     myValue=envValue;
}
String topLevelAppContextFileName = "applicationContext." + myValue + ".xml";

没有springboot,我会这样做:

 ApplicationContext context = new ClassPathXmlApplicationContext(topLevelAppContextFileName);

有没有办法通过SpringBoot做到这一点?

我找到了用于属性文件的PropertySourcesPlaceholderConfigurer,但是找不到用于依赖项注入的任何内容。

旁注:

在得到“ xml错误”注释之前,我的大多数依赖项都是基于注释的。但是我正在建立一个框架供其他人使用,因此我需要少数几个框架来进行xml驱动。.....aka,我有正当理由将一些DI进行xml驱动。

2 个答案:

答案 0 :(得分:1)

这可能有效-

配置

SynchronizationContext

主要

public class DemoApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

     @Override
     public void initialize(ConfigurableApplicationContext ac) {
      ac = new ClassPathXmlApplicationContext(topLevelAppContextFileName);
     }
}

答案 1 :(得分:0)

对于将来的读者,我最终这样做:

@SpringBootApplication
@ImportResource({"classpath*:applicationContext.xml"})

public class MySpringBootApplication { 


    public static void main(String[] args) {
        try {

            URL resource = MySpringBootApplication.class.getResource("/applicationContext.xml");
            if (null == resource || StringUtils.isBlank(resource.getPath())) {
                throw new FileNotFoundException("applicationContext.xml not found.  The entry dependency injection file must be applicationContext.xml");
            }

            org.springframework.context.ConfigurableApplicationContext applicationContext = SpringApplication.run(MySpringBootApplication.class, args);

然后将“动态”部分放入内部applicationContext.xml文件中。

请注意“:”定界符,如果环境变量不存在,它将使用默认值。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/util
    http://www.springframework.org/schema/util/spring-util.xsd">

    <import resource="projectContext.${MYENVVARIABLENAME:DefaultEnvVarValue}.xml"/>

即使我从技术上讲有2个文件,而不是一个文件,这也更易于实现。

因此,如果环境变量不存在,它将默认导入第二个文件:

  

projectContext.DefaultEnvVarValue.xml