【问题标题】:Spring Boot dynamic context creation (parent/child)Spring Boot 动态上下文创建(父/子)
【发布时间】:2016-08-23 12:01:16
【问题描述】:

我正在将 Spring Boot 与 Spring Integration 结合使用,我想为每个 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()。父上下文是放置总线/或组件以与不同子级通信的地方吗?我想这可能是为每个上下文加载多个单例的内存问题。

【问题讨论】:

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


    【解决方案1】:

    这应该可以工作...

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

    【讨论】:

    • child() 引发空指针异常。我更新了问题。
    猜你喜欢
    • 2018-09-25
    • 2018-06-18
    • 2015-11-12
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多