SpringBoot и используйте/загружайте динамический applicationContext.xml вместо жестко закодированного

Я видел сотни примеров этого:

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 bad», большинство моих зависимостей основаны на аннотациях. Но я создаю фреймворк для использования другими, и поэтому мне нужно, чтобы несколько из них управлялись с помощью xml... иначе, у меня есть законная причина, чтобы некоторые из DI управлялись с помощью xml.


person granadaCoder    schedule 26.02.2019    source источник


Ответы (2)


Это может сработать -

Конфигурация

public class DemoApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

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

Главный

    public static void main(String args[]) {
         new SpringApplicationBuilder(Application.class)
            .initializers(new DemoApplicationContextInitializer())
            .run(
    }
person Ivan Furdek    schedule 27.02.2019

Для будущих читателей я сделал это:

@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

person granadaCoder    schedule 01.03.2019