2017-11-15 3 views
0

SpringBootでSpringApplicationを使用してアプリケーションを起動するとき、どのようにメンバ変数にアクセスしますか?SpringBootでSpringApplicationからクラスメンバー変数にアクセスする方法

以下のコードでは、EnvironmentBuildPropertiesに割り当て時にコンパイルエラーが発生しています。私はSpringApplicationまたはConfigurableApplicationContextを介してこれらのプロパティを参照する方法がなければならないと思いますが、どのようにわかりません。

私が得ているコンパイルエラーは、 non-static variable environment cannot be referenced from a static context です。私はその回避方法を理解しています。

私の質問は本当ですか - SpringApplicationは、通常のjava MyClass myClass = new MyClass()と同じようにClassレベルの参照を返しますか?あなたは

@Autowire 
Environment env; 

またはあなたのメインクラス内のこの種のロジックを持つコンテキスト自体

ConfigurableApplicationContext run = SpringApplication.run(ExampleApplication.class, args); 
ConfigurableEnvironment environment = run.getEnvironment(); 
+0

mainメソッドからそのような変数にアクセスする必要があるのはなぜですか? – gtosto

+0

私は別のクラスをインスタンス化して、これらの値を渡しているので...私はこの問題を明確にするのに役立つこのコードを表示するために私のコード例を更新しました。 通常のJavaプログラムでは、単にクラスをインスタンス化し、そのクラスを通してメンバー変数を参照していますが、Springを経由しているので、これは不可能です。 – robbie70

+0

私の質問は本当にだと思います - SpringApplicationは、通常のjava 'MyClass myClass = new MyClass()'と同じようにClassレベルの参照を返しますか? – robbie70

答えて

2

は良いことはありませんこの代わりに@PostConstructを使って、プログラムの最初のbeanの注入と設定を終えた直後に新しいBeanを開始することができます。 それで、あなたは@PostConstructと別のクラスにこのロジックを移動することができます。

environment = context.getEnvironment(); //compile error 
buildProperties = context.getBean(BuildProperties.class); //compile error 

このように、あなたは、任意の静的コンテキストエラーを取得されていませんし、あなたのコードがきれいになります。

0

から環境を取得し、あなたのDisplaySysInfoクラスの環境を注入するか

@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(); 

    } 

} 
1

ここで私はあなたの質問

に答えています「私は私の質問は本当にだと思う - SpringApplicationは、MyClassのMYCLASS =新しいMyClassの(通常のJavaをやってと同じように、クラスレベルの参照を返すん)ですか? "

短い答えは、ませではありません、はありません)新しいMyClassの(のようなインスタンスをオブジェクトへの参照を返しません。 スプリングコンテキストを使用すると、への参照が実際ににプロキシされ、通常のクラスのようになります。 DIと春のコンポーネントの詳細を読むことをお勧めします。ここにはspring_bean_definitionミニチュートリアルがあります。チュートリアルは少し古く、豆を宣言するためにxml表記を使用しますが、概念と定義はまだ有効です。

これが役に立ちます。