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调用后调用该变量,如果你想坚持会员注射。