春天@Autowired和@Value属性不起作用

时间:2017-09-04 11:23:19

标签: java spring spring-boot dependency-injection property-injection

我想在属性上使用@Value,但我总是得到0(在int上)。
但是在构造函数参数上它可以工作。

示例:

@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???
    }
}

该对象是弹簧管理的,否则构造函数参数将无效。

有谁知道导致这种奇怪行为的原因是什么?

3 个答案:

答案 0 :(得分:9)

在构造对象之后进行场注入,因为很明显容器不能设置不存在的东西的属性。该字段将始终在构造函数中取消设置。

如果要打印注入的值(或进行一些实际的初始化:)),可以使用注释为"string 1"的方法,该方法将在注入过程后执行。

@PostConstruct

答案 1 :(得分:5)

我认为这个问题是因为Spring的执行顺序引起的:

  • 首先,Spring调用构造函数来创建一个实例,如:

    FtpServer ftpServer=new FtpServer(<value>);

  • 之后,通过反射,填充属性:

    code equivalent to ftpServer.setPort(<value>)

因此,在构造函数执行期间,该属性仍为0,因为这是int的默认值。

答案 2 :(得分:0)

这是会员注射:

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

从构造函数中实例化bean之后会执行哪个spring。所以当spring从类中实例化bean时,spring没有注入值,这就是为什么你得到默认的int值0。

确保在spring调用构造函数后调用变量,以防你想坚持使用成员注入。