Ответ
Поведение зависит от scope и контекста инъекции:
Singleton Scope (по умолчанию)
@Component
@Scope("singleton") // или без аннотации
public class SingletonBean {
// Создается один раз при инициализации контекста
// Один экземпляр на весь ApplicationContext
}
Prototype Scope
@Component
@Scope("prototype")
public class PrototypeBean {
// Новый экземпляр при каждом запросе через:
// - applicationContext.getBean()
// - @Autowired в prototype бине
// - Lookup method injection
}
Критически важный нюанс:
Когда Prototype бин инжектируется в Singleton бин:
@Component
public class SingletonService {
@Autowired
private PrototypeBean prototypeBean; // ИНИЦИАЛИЗИРУЕТСЯ ТОЛЬКО ОДИН РАЗ!
}
Почему так происходит:
- Singleton бин создается при старте контекста
- В момент создания происходит инъекция зависимостей
- Prototype бин создается один раз и "замораживается" в Singleton
Решение проблемы:
-
Lookup Method Injection
@Component @Scope("singleton") public abstract class SingletonService { @Lookup protected abstract PrototypeBean createPrototypeBean(); public void process() { PrototypeBean bean = createPrototypeBean(); // Новый экземпляр каждый раз } } -
Использование ObjectFactory или Provider
@Autowired private ObjectFactory<PrototypeBean> prototypeBeanFactory;
public void process() { PrototypeBean bean = prototypeBeanFactory.getObject(); // Новый экземпляр }
3. **Явный запрос из контекста**
```java
@Autowired
private ApplicationContext context;
public void process() {
PrototypeBean bean = context.getBean(PrototypeBean.class);
}