我看过一百个例子:
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驱动。
答案 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