当前位置: 首页 > 知识库问答 >
问题:

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

慕弘伟
2023-03-14

我将Spring Boot与Spring集成在一起,我希望为每个<code>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);

我已经查看了SpringApplication ationBuilderchild()方法,并且属性从父亲传播到孩子:

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多个 imapAdapter

这是因为一些Spring集成组件将从配置文件中动态加载。因此,我需要用动态组件创建不同的上下文。

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

编辑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);

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

共有1个答案

颜志学
2023-03-14

这应该有用。。。

SpringApplicationBuilder child = builder.child(ConfigDynamic.class);
...
child.context().getEnvironment().getPropertySources().addLast(pps);
...
child.run();
 类似资料:
  • 我正在为project编写集成测试,我希望在Spring将所有数据库迁移脚本导入到schema.sql之前将其合并到schema.sql中。为此,我使用了一个小类,它在项目中搜索sql文件并将它们合并为一个。我创建了一个套件,如下所示: 那么,这是我的测试: 但这并不像我想象的那样有效。看起来Spring试图运行schema.sql的速度比我创建schema.sql的速度要快,但失败如下所示: 附

  • 我有一个使用子/父上下文关系的Spring应用程序。这样做的原因是为了确保子上下文从父上下文继承bean/资源,然后根据需要添加更多bean/资源来覆盖它们。但是,当子上下文关闭时(退出try/catch作用域),它开始对它引用的所有bean进行清理,包括父作用域中的bean。这是不可取的,因为我需要重用父上下文来创建另一个子上下文,但是现在它是垃圾,因为它包含了一堆已处理/关闭的bean。 问题

  • 当我将应用程序作为独立的Java程序运行时,它运行得很好。当我将其作为applet运行时,它会通过以下堆栈跟踪抛出JAXBException。 当我添加jaxb.properties时,我收到以下错误- 我在类路径中添加了以下罐子 - 2.2.2.1 jsr311-api-1.1.1 球衣核心-1.2 泽西-客户端-1.2 导致此错误的原因。我是否缺少任何依赖项。 编辑:我在浏览器和开发环境中使用

  • 当应用程序启动时,会引发两个上下文:一个用于事件,另一个用于事件,并且一切正常,派遣员上下文使用“父”bean而不是创建它自己的。当我使用(我使用rest api请求调用它)启动Spring上下文刷新时,只发送了一个ContextRenewEvent(第一个),当我尝试访问任何servlet组件(rest控制器)时,派遣员开始创建自己的bean,尽管刷新后创建了“主”bean。再次没有为派遣员上下

  • 问题内容: 我已经阅读了动态bean定义的更改。我在一个简单的代码示例中进行了尝试(请参见下面的代码),并且在不想停止服务器但添加/更改bean定义的情况下,它非常吸引人。 问题: 这样做安全吗(请参见下面的代码)? 我读过,借助or 或?可以在运行时实现bean定义更改。那么区别是什么呢? final static String header = “<?xml version="1.0" enc

  • 我读过动态bean定义更改。我在一个简单的代码示例中尝试了它(参见下面的代码),我发现在不想停止服务器而是添加/更改bean定义的情况下,它非常有吸引力。 问题: null 和都允许我在运行时更改bean定义。但有什么不同,利/弊?