Ответ
Нет, не будет. 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 тут только акушер, блядь, а не гробовщик.