gpt4 book ai didi

java - 从 main 方法访问带注释的类成员

转载 作者:行者123 更新时间:2023-11-29 08:30:34 25 4
gpt4 key购买 nike

在我的 Spring Boot 应用程序中,我想从 main 方法。由于静态 main 方法无法读取非静态变量,因此我也将变量设为静态。

编辑:我还需要根据此属性的值关闭 SpringApplication.run() 返回的 ApplicationContext。我正在更新下面的代码以反射(reflect)这一点。

我的代码看起来像这样:

@SpringBootApplication
public class Application {

// the variable I want to access in main
@Value("{property:}")
protected static String property;

public static void main(String[] args) throws Exception {
ConfigurableApplicationContext context = SpringApplication.run(AccountApiApplication.class, args);

if(new String("true").equals(property)) {
SpringApplication.exit(context)
}
}

编辑:这里有两个问题:

  1. property 不能是静态的(与上面的代码相反),否则 @Value 注释将无法使用它。而且我不能使它成为非静态的,因为那样就无法从 main 访问它。

  2. 有人建议我使用几种不同的方法,我正在考虑关闭 ApplicationContext,但它们可能对我不起作用:

    - 使用 @PostConstruct 注释的 init() 方法。问题是,我认为 main() 返回的 ConfigurableApplicationContext 不能在这里访问。

    - 使用 CommandLineRuuner.run()ApplicationRunner.run()。这些 run() 方法似乎在我的 Spring Batch 作业开始之前就已经执行了,所以我不能使用它们来关闭 ApplicationContext,否则即使在我的作业执行之前应用程序也会关闭。

最佳答案

您不能在静态字段(以及 Spring 组件)中注入(inject)值表达式。

所以@Value 字段应该是一个实例字段。为了能够访问它,您应该按照您的猜测从实例方法中进行访问。

请注意,为了能够操作正在运行的 ApplicationContext 实例,必须完全初始化 Spring 上下文。

要实现它,您应该仅在返回SpringApplication.run()后调用操作ApplicationContext的实例方法。
您应该首先使用 BeanFactory.getBean() 方法检索与当前应用程序类对应的 bean。
然后,您可以调用需要 ApplicationContext 的实例方法:

@SpringBootApplication
public class Application {

@Value("{property:}")
protected String property;

public static void main(String[] args) throws IOException {
ConfigurableApplicationContext context = SpringApplication.run(AccountApiApplication.class, args);
AccountApiApplication app = context.getBean(AccountApiApplication.class);
app.doMyTask(context);
}

public void doMyTask(ConfigurableApplicationContext context) {
if(property) {
context.close();
}
else {
// do something else
}

}
}

关于java - 从 main 方法访问带注释的类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48612286/

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