Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Prototype Bean
Prototype Bean — это один из основных scopes бинов в Spring Framework, который определяет жизненный цикл и поведение объекта после его создания. В отличие от Singleton (по умолчанию), каждый раз при запросе Prototype Bean контейнер создаёт новый экземпляр объекта.
Основные характеристики
Создание нового экземпляра: При каждом получении бина из контекста приложения создаётся уникальный объект.
@Component
@Scope("prototype")
public class PrototypeService {
private String id = UUID.randomUUID().toString();
public String getId() {
return id;
}
}
Отсутствие переиспользования: На отличие от Singleton, Prototype бины не переиспользуются между инъекциями.
Объявление Prototype Bean
Способ 1: Аннотация @Scope
@Component
@Scope("prototype")
public class UserSession {
private String sessionId;
private LocalDateTime createdAt;
public UserSession() {
this.sessionId = UUID.randomUUID().toString();
this.createdAt = LocalDateTime.now();
}
}
Способ 2: XML конфигурация
<bean id="userSession" class="com.example.UserSession" scope="prototype"/>
Способ 3: Использование ScopedProxyMode
@Component
@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestData {
private String data;
}
Жизненный цикл Prototype Bean
Протокол жизненного цикла отличается от Singleton:
- Создание: Контейнер создаёт новый экземпляр при каждом запросе
- Инициализация: Вызываются методы @PostConstruct и init-method
- Использование: Бин используется клиентским кодом
- Уничтожение: Контейнер НЕ вызывает методы @PreDestroy (это ответственность клиента)
@Component
@Scope("prototype")
public class PrototypeExample {
@PostConstruct
public void init() {
System.out.println("Prototype создан");
}
@PreDestroy
public void destroy() {
System.out.println("Это НЕ будет вызвано!");
}
}
Примеры использования
Сценарий 1: Request-scoped данные
@Service
public class RequestProcessor {
@Autowired
private ApplicationContext context;
public void processRequest(HttpRequest request) {
RequestContext ctx = context.getBean(RequestContext.class);
ctx.setRequest(request);
}
}
@Component
@Scope("prototype")
public class RequestContext {
private HttpRequest request;
private LocalDateTime timestamp = LocalDateTime.now();
}
Сценарий 2: Stateful сервис
@Component
@Scope("prototype")
public class OrderBuilder {
private List<Item> items = new ArrayList<>();
private Customer customer;
public void addItem(Item item) {
items.add(item);
}
public Order build() {
return new Order(customer, items);
}
}
Инъекция Prototype Bean в Singleton
Если Singleton зависит от Prototype, нужно использовать специальные подходы:
@Service
public class SingletonService {
@Autowired
private ObjectFactory<PrototypeService> prototypeFactory;
public void doWork() {
PrototypeService proto = prototypeFactory.getObject();
}
}
Заключение
Prototype Bean — это мощный инструмент для создания stateful объектов в Spring. Правильный выбор scope зависит от требований приложения и характера состояния объекта.