SpringBoot и используйте / загрузите динамический «applicationContext.xml» вместо жесткого - PullRequest
0 голосов
/ 27 февраля 2019

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

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 для файлов свойств, но не могу найти ничего для внедрения зависимостей.

Sidenote:

До того, как я получу комментарий "xml bad", большинство моих зависимостей основаны на аннотациях,Но я создаю среду, которую могут использовать другие, и поэтому мне нужно несколько из них, чтобы они были управляемы xml ... иначе, у меня есть законная причина, чтобы некоторые из DI были управляемыми xml.

Ответы [ 2 ]

0 голосов
/ 01 марта 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"/>

Это было проще реализовать, даже если у меня есть два файла вместо одного.

Так что еслипеременная среды не существует, по умолчанию будет импортирован второй файл с именем:

projectContext.DefaultEnvVarValue.xml

0 голосов
/ 27 февраля 2019

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

Конфиг

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(
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...