我正在创建一个Java应用程序,根据某些条件/配置,它实例化一个SpringBoot应用程序以接收一些HTTP消息。
我的问题是,我有一个ReceiverService,它需要使用在SpringBoot应用程序之外创建的一些变量。有没有办法将本地java变量(从应用程序内部,而不是像shell或文件这样的外部)传递给SpringBoot组件?
示例:
我有一个Manager对象,根据某些条件,它定义了一个变量param,我想在SpringBoot组件ReceiverService中使用它。
public class Manager {
public Manager(bool condition) {
String param = "foo";
if (condition) {
param = "bar";
}
ReceiverApp receiver = new ReceiverApp(); // init SpringBoot app
}
}SpringBoot应用程序:
@SpringBootApplication
public class ReceiverApp {
public ReceiverApp() {
SpringApplication.run(ReceiverApp.class);
}@Component
public class ReceiverService implements InitializingBean {
final CustomObject obj1 = new CustomObject(param);
@Override
public void aFunction() throws Exception {
MyConfig config = MyConfig.build(param);
}
}发布于 2022-05-25 07:36:27
SpringApplication.run被设计成接受key=value对,就像您在命令行参数中提供给Java方法的那样。
由于类路径中似乎有另一个Spring应用程序jar,并且似乎能够实例化ReceiverApp,所以您只需将参数作为字符串传递(格式为String[]{"key1=value1","key2=value2"})。
这些可以传递给SpringApplication.run,这些将自动成为SpringApplication.run值,可以在应用程序中的任何位置注入。
@SpringBootApplication
public class ReceiverApp {
public ReceiverApp(String[] notReallyFromCommandLineArgs) {
SpringApplication.run(ReceiverApp.class, notReallyFromCommandLineArgs);
}您可以发送如下参数:
String[] params = new String[]{"my.params.param1="+param1};
ReceiverApp receiver = new ReceiverApp(params);您可以将它们作为值注入到接收方Spring应用程序中的任何位置。
@Value("my.params.param1")
String theParam1;发布于 2022-05-25 07:45:16
有几种方法可以创建一个管理应用程序来配置另一个应用程序。
场景1
一种常见的方法是将配置放在两个应用程序直接访问的数据库中,尽管这不太干净(它通过数据库创建了一个硬依赖关系)。
场景2
一个更清晰的解决方案是,如果管理程序拥有数据库,并提供配置服务,配置应用程序就会消耗(并可能缓存)配置服务。通常,配置服务将通过远程访问,例如REST,因此这两个应用程序可以独立部署和运行。
场景3
如果您想保持简单,您可以反转设置,并在配置的应用程序本身中实现配置服务(有点像Tomcat中的管理接口)。然后,您可以在同一个应用程序中添加一个web并完成它,或者构建一个单独的独立客户端来与该服务交互。在最后两个场景中,考虑安全性,因为您可能不希望任何客户端能够连接和更改配置。

发布于 2022-05-25 07:24:57
您可以让ReceiverService注入一个Supplier<String> (或者定义您自己的接口,如果您喜欢一个不那么通用的命名),并让Manager实现它。
@Component
public class ReceiverService implements InitializingBean {
@Autowired
private Supplier<String> paramSupplier;
final CustomObject obj1 = new CustomObject(param);
@Override
public void aFunction() throws Exception {
MyConfig config = MyConfig.build(paramSupplier.get());
}
}
public class Manager implements Supplier<String> {
private final String param;
public String get() { return param; }
public Manager(bool condition) {
param = "foo";
if (condition) {
param = "bar";
}
// why is this in the Manager constructor???
ReceiverApp receiver = new ReceiverApp(); // init SpringBoot app
}
}或者定义自己的@组件来提供参数,并让管理器和接收方都注入它。
https://stackoverflow.com/questions/72373375
复制相似问题