gpt4 book ai didi

java - Spring中如何提供参数化的组件?

转载 作者:行者123 更新时间:2023-12-04 16:03:49 24 4
gpt4 key购买 nike

目前,我有一个实现 CommandLineRunner 并使用 Commons CLI 解析命令行参数的组件。

java -jar app.jar --host 123.123.222 --port 8080

还有另一个组件,Requester,它依赖于这些参数的(一个子集)。

@Component
public class Requester
{

// host and port need to be configured once
private final String host;
private final int port;

public Requester(String host, int port)
{
this.host = host;
this.port = port;
}

public boolean doRequest(String name) throws Exception
{
String url = "http://" + host + ":" + port + "/?command=" + name;

URL obj = new URL(url);
HttpURLConnection connection = (HttpURLConnection) obj.openConnection();
int responseCode = connection.getResponseCode();
return 200 == responseCode;
}

}

如何将已配置的 Requester Autowiring 到 future 的组件中? Spring 创建参数化单例 bean 的方法是什么?


一种解决方案是让每个依赖于程序参数的组件都实现CommandLineRunner。这样它可以解析程序参数本身,但这是一种高度冗余的方法。一定有更好的解决方案。

最佳答案

你检查过注释@Value ?它允许您在运行时从属性文件中注入(inject)值。每次需要从资源中注入(inject)一些外部值(value)时,您都应该使用它。例如,您的代码可以是:

@Component
public class Requester
{
@Value("${host}")
private final String host;
@Value("${port}")
private final int port;

public boolean doRequest(String name) throws Exception
{
String url = "http://" + host + ":" + port + "/?command=" + name;

URL obj = new URL(url);
HttpURLConnection connection = (HttpURLConnection) obj.openConnection();
int responseCode = connection.getResponseCode();
return 200 == responseCode;
}
}

在您的 application.properties 文件中:

...
host = myhost
port = 1234
...

如果您想将参数作为命令行参数传递,您可以像以前一样简单地调用命令:

java -jar app.jar --host 123.123.222 --port 8080

并且这些参数将覆盖属性文件中的参数,因为它们被赋予了更高的优先级,如 documentation 所示。 .

关于java - Spring中如何提供参数化的组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53487768/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com