Будет ли вызван метод с аннотацией @PreDestroy у Spring-бина со scope prototype?

Ответ

Нет, не будет. Spring не управляет полным жизненным циклом бинов с областью видимости prototype.

Причина: Spring создает экземпляр prototype-бина, внедряет зависимости и передает его клиенту. Контейнер больше не отслеживает этот экземпляр и не вызывает методы его уничтожения.

Пример:

@Scope("prototype")
@Component
public class PrototypeBean {
    @PreDestroy
    public void cleanup() {
        // Этот метод никогда не будет вызван Spring-контейнером.
    }
}

Решение: Для ручного освобождения ресурсов prototype-бина используйте:

  • Шаблон DisposableBean (не рекомендуется из-за связывания с Spring API).
  • Явный вызов специального метода-очистки клиентским кодом.
  • Использование callback-метода, аннотированного @PreDestroy, в бине-клиенте, который управляет жизнью prototype-бина.

Ответ 18+ 🔞

А, слушай, тут такая засада, блядь! Spring-то, этот хитрожопый, с бинами prototype не работает как с родными, понимаешь?

В чём прикол, ёпта:
Spring рожает тебе новый экземпляр prototype-бина, впендюривает в него зависимости, отдаёт тебе в руки и — хуй с горы! Контейнер дальше про него нихуя не знает и не помнит. Уничтожение? Сам разбирайся, мудила.

Смотри, как это выглядит в коде, блядь:

@Scope("prototype")
@Component
public class PrototypeBean {
    @PreDestroy
    public void cleanup() {
        // Вот эту хуйню Spring никогда не вызовет, забей.
    }
}

И чё делать-то, ёперный театр?
Придётся самому, как взрослому:

  • Либо тупо вызывать свой метод cleanup() руками, когда объект уже не нужен.
  • Либо, если совсем охота извращений, сделать так, чтобы клиентский bean (например, singleton) держал этот prototype и сам вызывал @PreDestroy для него — но это уже такие костыли, ядрёна вошь!
  • Шаблон DisposableBean — в принципе можно, но это ж связывание с Spring API, а нахуй оно надо? Не рекомендую, блядь.

Короче, запомни: prototype — твой личный ребёнок, воспитывай и хорони его сам. Spring тут только акушер, блядь, а не гробовщик.