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

Приведи пример области видимости типа 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:

  1. Создаётся новый экземпляр объекта
  2. Вызываются методы инициализации
  3. Объект возвращается клиенту
  4. Spring не отслеживает жизненный цикл этого объекта
  5. Ответственность за очистку ресурсов лежит на клиенте

Практический пример: генератор отчётов

Представь ситуацию, где каждому клиенту нужно создавать свой отчёт с персональными данными. 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

АспектSingletonPrototype
СозданиеОдин разНа каждый запрос
ПамятьОбщая память на всехКопия для каждого
СостояниеОбщее для всехСобственное для каждого
Thread-safetyНужна синхронизацияОбычно не нужна
Shutdown hookВызываетсяНе вызывается

Prototype scope — мощный инструмент для создания изолированных, независимых объектов в масштабируемых приложениях.

Приведи пример области видимости типа Prototype | PrepBro