Назад к вопросам
СБЕР
Junior — Middle
62
Возможно ли динамически переопределить или заменить Bean во время выполнения приложения?
Компании, где спрашивали
Ответ от нейросети
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 остаётся неизменным, но внутренняя реализация может меняться динамически.