2

プロパティで@Valueを使用したいと思いますが、私はいつも0(int)を取得します。
しかし、コンストラクタパラメータでは動作します。春@Autowiredと@Valueプロパティが機能しません

例:

@Component 
public class FtpServer { 

    @Value("${ftp.port}") 
    private int port; 

    public FtpServer(@Value("${ftp.port}") int port) 
    { 
     System.out.println(port); // 21, loaded from the application.properties. 
     System.out.println(this.port); // 0??? 
    } 
} 

オブジェクトはコンストラクタのパラメータが動作しない他、春管理されています。

この奇妙な動作の原因を知っている人はいますか?

+2

コンストラクタとクラス名が一致しません。私は入力ミスです。 –

+3

Springは、存在しないオブジェクトにも値を設定できます...オブジェクトは、コンストラクタの実行後に存在します。 –

答えて

5

フィールド注入は、オブジェクトが構築された後に行われます。これは、明らかに、コンテナが存在しないもののプロパティを設定できないためです。フィールドは常にコンストラクタで設定解除されます。

注入された値を印刷する場合(または実際の初期化を行う場合)は、@PostConstructで注釈を付けられたメソッドを使用できます。このメソッドは注入プロセスの後に実行されます。

@Component 
public class FtpServer { 

    @Value("${ftp.port}") 
    private int port; 

    @PostConstruct 
    public void init() { 
     System.out.println(this.port); 
    } 

} 
+0

その@PostConstructアノテーションについて知りませんでした... + 1新しいことを学びました! –

4

私は、実行のSpringの順序ため、問題が発生していると思う:

  • はまず、春のようなもの、インスタンスを作成するためにコンストラクタを呼び出します。その後

    FtpServer ftpServer=new FtpServer(<value>);

  • 、反射によって、属性が入力されます。

    code equivalent to ftpServer.setPort(<value>)

したがって、コンストラクタの実行中には、属性が0のままであるため、デフォルト値はintです。

0

これはメンバーの注射である:

@Value("${ftp.port}") 
private int port; 

そのコンストラクタからBeanをインスタンス化した後に行い、どの春。だから、春がクラスからBeanをインスタンス化しているときに、春は値を注入していないので、デフォルトのint値は0です。

コンストラクタがspring、あなたがメンバーの注射をしたい場合に備えて。

関連する問題