← Назад к вопросам
Приведи пример области видимости типа Prototype
2.0 Middle🔥 201 комментариев
#Spring Framework
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Prototype Scope в Spring Framework
Prototype scope — это область видимости в Spring Framework, при которой контейнер создаёт новый экземпляр бина каждый раз, когда он запрашивается. В отличие от Singleton scope, где один объект переиспользуется для всех запросов.
Принцип работы
Когда Spring встречает запрос на bean с Prototype scope:
- Создаётся новый экземпляр объекта
- Вызываются методы инициализации
- Объект возвращается клиенту
- Spring не отслеживает жизненный цикл этого объекта
- Ответственность за очистку ресурсов лежит на клиенте
Практический пример: генератор отчётов
Представь ситуацию, где каждому клиенту нужно создавать свой отчёт с персональными данными. Prototype scope идеально подходит:
@Component
@Scope("prototype")
public class ReportGenerator {
private String userId;
private LocalDateTime createdAt;
public ReportGenerator() {
this.createdAt = LocalDateTime.now();
System.out.println("Новый ReportGenerator создан");
}
public void setUserId(String userId) {
this.userId = userId;
}
public String generate() {
return "Report for user " + userId + ", created at " + createdAt;
}
}
@Service
public class ReportService {
@Autowired
private ApplicationContext context;
public String createReport(String userId) {
// Каждый вызов создаёт новый экземпляр
ReportGenerator generator = context.getBean(ReportGenerator.class);
generator.setUserId(userId);
return generator.generate();
}
}
// Использование
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
ReportService service = context.getBean(ReportService.class);
// Каждый вызов создаёт новый ReportGenerator
System.out.println(service.createReport("user1")); // Новый объект
System.out.println(service.createReport("user2")); // Новый объект
System.out.println(service.createReport("user3")); // Новый объект
}
Вывод консоли:
Новый ReportGenerator создан
Report for user user1, created at 2024-01-15T10:30:45
Новый ReportGenerator создан
Report for user user2, created at 2024-01-15T10:30:46
Новый ReportGenerator создан
Report for user user3, created at 2024-01-15T10:30:47
Другой пример: многопоточная обработка
@Component
@Scope("prototype")
public class DataProcessor {
private List<String> data = new ArrayList<>();
private Thread thread;
public DataProcessor() {
this.thread = Thread.currentThread();
}
public void process(String item) {
data.add(item);
}
public List<String> getResults() {
return new ArrayList<>(data);
}
}
@Service
public class ProcessingService {
@Autowired
private ApplicationContext context;
public void processInParallel(List<String> items) {
// Каждый поток получает свой экземпляр процессора
for (String item : items) {
DataProcessor processor = context.getBean(DataProcessor.class);
new Thread(() -> processor.process(item)).start();
}
}
}
Когда использовать Prototype
- Stateful бины — объекты, хранящие состояние, специфичное для каждого клиента
- Многопоточность — каждый поток получает свой экземпляр
- Временные объекты — которые создаются, используются и выбрасываются
- Большие объекты — когда переиспользование памяти критично
Важные различия от Singleton
| Аспект | Singleton | Prototype |
|---|---|---|
| Создание | Один раз | На каждый запрос |
| Память | Общая память на всех | Копия для каждого |
| Состояние | Общее для всех | Собственное для каждого |
| Thread-safety | Нужна синхронизация | Обычно не нужна |
| Shutdown hook | Вызывается | Не вызывается |
Prototype scope — мощный инструмент для создания изолированных, независимых объектов в масштабируемых приложениях.