Присвоение значения компонента в @PostConstruct - PullRequest
0 голосов
/ 27 марта 2019

В приведенном ниже примере мне нужно присвоить Bean2 атрибут Bean1. Атрибут null (см. Ниже). Кроме того, «@PostConstruct Bean2» печатается перед «После назначения».

Есть ли способ убедиться, что экземпляр Bean2 создан, прежде чем присваивать значение в Bean1?

@Stateless
public class Bean1 {

    @Inject
    private Bean2 bean2;

    String x;

    @PostConstruct
    private void init() {
         x = "Some Value";
         System.out.println("Before assignment");
         bean2.setX(x);
         System.out.println("After assignment");
    }
}

@Stateless
public class Bean2 {

    private String x;

    public setX(String x) {
         this.x = x;
    }

    @PostConstruct
    private void init() {
        System.out.println("@PostConstruct Bean2");
        System.out.println(x);  // <-- x is null
    }
  }

1 Ответ

0 голосов
/ 27 марта 2019

Это ожидаемое поведение в зависимости от того, как вы его настроили. x должен быть правильно установлен в Bean2 после того, как весь applicationContext был запущен.

Чтобы понять, что происходит, обратите внимание, что Bean2 является зависимостью для Bean1. Это означает, что Spring не может создать Bean1 до после создания Bean2. Таким образом, сначала создается Bean2, и вы видите, что x является нулем в блоке init(), потому что Bean1 еще не был создан, чтобы иметь возможность установить его значение.

Позже будет создан Bean1, будет вызван его метод init(), и значение для x в Bean2 будет правильно установлено. Но это происходит спустя много времени после того, как Bean2 @PostConstruct уже закончено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...