Spring Boot动态上下文创建(父/子)

时间:2016-08-23 12:01:16

标签: spring spring-boot spring-integration ioc-container

我在Spring Integration中使用 Spring Boot ,我想为每个child()上下文加载不同的属性。这可能吗?

此时此刻,我正在研究:(只有最相关的行)

SpringApplicationBuilder parent = new SpringApplicationBuilder(Main.class);
// Child sources (Will be inside a loop)
// Load the different environment ??
parent.child(ConfigDynamic.class); 
// End of child loading

parent.run(args);

我已经回顾了SpringApplicationBuilder child()方法,并且属性从父级传播到子级:

child.properties(this.defaultProperties).environment(this.environment)
.additionalProfiles(this.additionalProfiles);

但我需要动态加载一些属性,如下例所示:

AnnotationConfigApplicationContext parent = new AnnotationConfigApplicationContext(Main.class);
parent.setId("parent");
Properties props = new Properties();
StandardEnvironment env = new StandardEnvironment();
AnnotationConfigApplicationContext child = new AnnotationConfigApplicationContext();
child.setId("child" + ++n);
child.setParent(parent);
child.register(ConfigDynamic.class);        
// populate properties for this adapter
props.setProperty("prop1", myProp1);
props.setProperty("prop2", myProp2);
env.getPropertySources().addLast(pps);
child.setEnvironment(env);
child.refresh();

从此示例中摘录:Spring multiple imapAdapter

之所以这样,是因为某些Spring Integration组件将从配置文件中动态加载。因此,我需要使用动态组件创建不同的上下文。

任何想法都将不胜感激,谢谢

修改1:

我更新了示例:

SpringApplicationBuilder parent = new SpringApplicationBuilder(Main.class);

for start    
SpringApplicationBuilder child = parent.child(DynamicConfig.class);    

//Properties creation..
child.context().getEnvironment().getPropertySources().addLast(pps);
child.run(args);    
end for

parent.run(args);

但现在,child()上下文在run()方法之前为空,并提升了NPE。

编辑2 :(工作)

SpringApplicationBuilder parent = new SpringApplicationBuilder(Main.class);

for start    
SpringApplicationBuilder child = parent.child(DynamicConfig.class);    

PropertiesPropertySource pps = new PropertiesPropertySource("dynamicProps", props);  
StandardEnvironment env = new StandardEnvironment();
env.getPropertySources().addLast(pps);
child.environment(env);
child.run();    
end for

parent.run(args);

我绝对不明白的最后一件事就是为什么我需要一个父上下文,即使我的所有@Component@Configuration都是Spring Integration组件,并且可以加载为child()。父上下文是放置总线/或组件来传达不同孩子的地方吗?我认为这可能是为每个上下文加载几个单例的内存问题。

1 个答案:

答案 0 :(得分:0)

这应该有用......

SpringApplicationBuilder child = builder.child(ConfigDynamic.class);
...
child.context().getEnvironment().getPropertySources().addLast(pps);
...
child.run();