Ответ 1
Я думаю, вы неправильно понимаете документацию. Просто говоря Spring не будет управлять жизненным циклом прототипа bean, поэтому методы @PreDestroy (и т.д.) Должны быть вызваны вашим собственным кодом. Spring не сохранит ссылку.
У меня есть singleton bean, у которого есть метод, который создает экземпляры прототипа bean. Я использую метод описанный здесь, чтобы получить экземпляры прототипа bean.
public class SingletonService implements ApplicationContextAware {
private ApplicationContext applicationContext;
public void go() {
MyPrototypeBean prototype = applicationContext
.getBean(MyPrototypeBean.class);
prototype.doSomething();
}
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
}
Сначала я подумал, что это было достаточно хорошо, что мой экземпляр 'prototype' вышел бы из области действия, когда возвращался метод "go", что означает, что экземпляр не будет ссылаться и будет собираться мусор.
Однако один из сверстников указал на следующее выражение документации:
Клиентский код должен очищать объекты с прототипом и выпускать дорогостоящие ресурсы, которые поддерживает прототип bean (s).
Итак, похоже, что Spring сохранит ссылку, и поэтому gc никогда не подберет ее? Если это так, как я могу сообщить Spring о выпуске ссылки? В документации упоминается, что я могу использовать "пользовательский bean постпроцессор", но неясно, куда будет вписываться этот процессор и какой код он будет работать.
Спасибо всем за помощь, Рой
Я думаю, вы неправильно понимаете документацию. Просто говоря Spring не будет управлять жизненным циклом прототипа bean, поэтому методы @PreDestroy (и т.д.) Должны быть вызваны вашим собственным кодом. Spring не сохранит ссылку.