Spring @Autowired и @Value на имущество не работает

Я хотел бы использовать @Value на имущество, но я всегда получаю 0(на инт).
Но на параметре конструктора это работает.

Пример:

@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 ответа

Решение

Инъекция поля выполняется после того, как объекты сконструированы, поскольку, очевидно, контейнер не может установить свойство чего-то, что не существует. Поле всегда будет не задано в конструкторе.

Если вы хотите напечатать введенное значение (или выполнить некоторую реальную инициализацию:)), вы можете использовать метод, помеченный как @PostConstruct, который будет выполнен после процесса впрыска.

@Component
public class FtpServer {

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

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

}

Я думаю, что проблема вызвана тем, что порядок выполнения Spring:

  • Во-первых, Spring вызывает конструктор для создания экземпляра, что-то вроде:

    FtpServer ftpServer=new FtpServer(<value>);

  • после этого, отражением, атрибут заполняется:

    code equivalent to ftpServer.setPort(<value>)

Таким образом, во время выполнения конструктора атрибут по-прежнему равен 0, потому что это значение по умолчанию int,

Это член инъекций:

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

Какая пружина делает после создания экземпляра bean-компонента из его конструктора. Таким образом, в то время, когда spring создает экземпляр компонента из класса, spring не вводит значение, поэтому вы получаете значение int по умолчанию 0.

Обязательно вызывайте переменную после того, как конструктор был вызван пружиной, на случай, если вы хотите придерживаться внедрения члена.

Другие вопросы по тегам