Реинициализировать весенний боб @Autowire - PullRequest
0 голосов
/ 05 октября 2018

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

Этот компонент не может быть обновлен, но может быть заменен только новым экземпляром.

Использует лиоператор new инициализирует только локальный экземпляр или он изменит бин?

@Component
public class TestComp {

  @Autowired
  private BeanA beanA;

  public void updateBean() {
    beanA = new BeanA("new value");
  }

}

Я ссылался на бин в другом классе и проверил после того, как инициализировал его с помощью new.Это отражало новый объект.Но мне нужно подтверждение экспертов, если оно есть.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

У меня есть сценарий, в котором мне нужно инициализировать компонент на основе конфигурации приложения во время запуска.

Все хорошо.Синглтонная область является хорошим выбором здесь.

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

Это проблема.Обновление bean-компонента в контексте - сложный процесс: вам нужно удалить существующее определение bean-компонента, добавить новое и обновить все bean-компоненты, которые как-то связаны с bean-компонентом (повторно инициализировать эти компоненты, обновить контекст).Технически это возможно, и это было упрощено с помощью @RefreshScope.

Spring Cloud. Инициализирует ли оператор new только локальный экземпляр, или он изменит бин?

Это влияет только на поле в этом классе.Никто не знает об изменениях.ApplicationContext#getBean по-прежнему будет возвращать старый объект, и все компоненты будут (или уже были) инициализированы со старым экземпляром.

Я передал компонент в другой класс и проверил его после инициализациис новым.Это отражало новый объект.

Это не может быть правдой.Вероятно, это относится к полю TestComp#beanA, а не к его собственному полю BeanA.

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

0 голосов
/ 05 октября 2018

Звучит так, будто вы хотите фабрику вместо .Ниже приведено приблизительное представление о том, как это может выглядеть;Ваши потребности могут различаться.

@Component
public class BeanFactory {
    private volatile BeanA beanAInstance;

    public BeanA createBeanA(String value) {
        if (null == beanAInstance) {
            synchronized (this) {
                if (null == beanAInstance) {
                    beanAInstance = new BeanA(value);
                }
            }
        }
        return beanAInstance;
    }

    public void refreshBeanA(String newValue) {
        synchronized (this) {
            beanAInstance = new BeanA(newValue);
        }
    }
}

Затем вы подключите это, и на основе конфигурации вы сможете обновить и использовать новое значение.Имейте в виду, что это изменит значение, которое вы получаете от этого компонента.

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