如何在Spring Boot中从SpringApplication访问类成员变量

时间:2017-11-15 10:29:42

标签: java spring spring-boot

如何在SpringBoot中使用SpringApplication启动应用程序时访问成员变量?

在下面的代码中,我收到了EnvironmentBuildProperties分配的编译错误。我认为必须有一种方法可以通过SpringApplicationConfigurableApplicationContext引用这些属性,但我不知道如何。

我得到的编译错误是, 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();

    }

}

3 个答案:

答案 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

这样,您就不会收到任何静态上下文错误,而且您的代码也会更清晰。