如何在SpringBoot中使用SpringApplication启动应用程序时访问成员变量?
在下面的代码中,我收到了Environment
和BuildProperties
分配的编译错误。我认为必须有一种方法可以通过SpringApplication
或ConfigurableApplicationContext
引用这些属性,但我不知道如何。
我得到的编译错误是,
non-static variable environment cannot be referenced from a static context
我明白它是如何绕过它的。
我认为我的问题确实是 - SpringApplication是否以与执行普通java MyClass myClass = new MyClass()相同的方式返回类级别引用?
@Slf4j
@EnableIntegration
@EnableLoaderApplication
@SpringBootApplication
@EnableDiscoveryClient
public class ExampleApplication {
private Environment environment;
private BuildProperties buildProperties;
public ExampleApplication(Environment env, BuildProperties buildProp) {
environment = env;
buildProperties = buildProp;
}
public static void main(String[] args) {
SpringApplication app = new SpringApplication(ExampleApplication.class);
ConfigurableApplicationContext context = app.run(args);
environment = context.getEnvironment(); //compile error
buildProperties = context.getBean(BuildProperties.class); //compile error
DisplaySysInfo displaySysInfo = new DisplaySysInfo(environment, buildProperties, log);
displaySysInfo.splash();
}
}
答案 0 :(得分:2)
您可以在DisplaySysInfo类中注入Environment
@Autowire
Environment env;
或从上下文本身检索环境
ConfigurableApplicationContext run = SpringApplication.run(ExampleApplication.class, args);
ConfigurableEnvironment environment = run.getEnvironment();
答案 1 :(得分:1)
我在这里回答你的问题
“我认为我的问题确实是 - SpringApplication是否以与执行普通java MyClass myClass = new MyClass()相同的方式返回类级别引用?”
简短答案否, Spring 不会像新的MyClass()那样返回对象实例的引用。当您使用 spring context 时,您会获得 Beans 的引用,这些 Beans 实际上代表类似普通类的内容。 我建议你阅读更多关于DI和spring组件的内容,这里有一个spring_bean_definition迷你教程。该教程有点陈旧,并使用xml表示法来声明bean,但概念和定义仍然有效。
希望这可以提供帮助。
答案 2 :(得分:0)
在主类中使用这种逻辑绝不是一个好习惯,而是在完成初始bean注入和程序配置之后,可以使用@PostConstruct来启动一个新的Bean。 因此,您可以使用@PostConstruct将此逻辑移动到另一个类:
environment = context.getEnvironment(); //compile error
buildProperties = context.getBean(BuildProperties.class); //compile error
这样,您就不会收到任何静态上下文错误,而且您的代码也会更清晰。