Sobes.tech
Back to questions
Junior — Middle
61

Возможно ли динамически переопределить или заменить Bean во время выполнения приложения?

Companies where asked
СБЕРСБЕР

Answer from AI

sobes.tech AI

В стандартном Spring Framework динамически переопределить или заменить Bean во время выполнения приложения напрямую нельзя, так как контекст Spring создаётся при старте и является неизменяемым в плане определения бинов.

Однако есть несколько подходов для достижения похожего эффекта:

  • Использование @Primary и профилей для выбора нужной реализации при старте.
  • Применение BeanFactory или ApplicationContext для получения бина, а затем замена логики внутри самого бина (например, через паттерн стратегия).
  • Использование ConfigurableApplicationContext и методов refresh(), но это сложный и редко применяемый подход.
  • Внедрение прокси-объектов, которые могут менять поведение во время выполнения.

Пример с прокси для динамической замены поведения:

public interface Service {
    void execute();
}

public class ServiceImpl1 implements Service {
    public void execute() { System.out.println("Impl1"); }
}

public class ServiceImpl2 implements Service {
    public void execute() { System.out.println("Impl2"); }
}

public class ServiceProxy implements Service {
    private Service delegate;

    public ServiceProxy(Service initial) {
        this.delegate = initial;
    }

    public void setDelegate(Service delegate) {
        this.delegate = delegate;
    }

    public void execute() {
        delegate.execute();
    }
}

Таким образом, бин ServiceProxy остаётся неизменным, но внутренняя реализация может меняться динамически.