← Назад к вопросам

Что такое Prototype Bean?

2.2 Middle🔥 131 комментариев
#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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 зависит от требований приложения и характера состояния объекта.