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

如何彈簧設定一個對象,根本不存在......存在一個構造函數執行後對象的值。 –

回答

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; 

這春天確實從它的構造函數實例化後的豆。所以當spring從類中實例化bean時,spring並沒有注入這個值,這就是爲什麼你得到的默認int值爲0.

確保在構造函數被spring調用後調用該變量,如果你想堅持會員注射。