LINUX.ORG.RU

История изменений

Исправление stevejobs, (текущая версия) :

Очень просто: сейчас все приложения используют Spring. Мы просто добавляем делаем метод контейнера delete и вызываем его на всех @Autowired переменных, когда в цепочке закончится последний под-метод проаннатированный как @UnmanagedResources (аннотация будет работать аналогично @Transactional, скоуп ресурсу допустим можно будет указывать опцией - закрываться сразу после первого же @UnmanagedResources-метода или после последнего метода в цепочке)

У него уже есть вполне детерминированный «тройной конструктор» (1 - конструктор класса в Java, 2 - init-method в XML, 3 - аннотация @PostConstruct в Java). Он уже может удалять бины со скопом singleton с помощью DefaultListableBeanFactory.destroySingleton и .removeBeanDefinition (и создавать их назад через .registerSingleton). @PreDestroy срабатывает детерминированно в момент исключения бина из контейнера.

Вопрос, что делать с бинами со скопом prototype (аналогом обычных переменных) - либо сделать для них кастомную обработку @PreDestroy, либо симулировать «особые прототипы» поверх синглтонов с автогенерящимися именами (но тогда придется подшаманить в @Autowired чтобы оно связывало не только непосредственно по имени, но и искало имя+автогенернный_префикс, либо в виртуальной таблице переменных).

При этом и @PostConstruct, и @PreDestroy - это часть стандарта JSR-250, поэтому метафора понятна примерно всем.

Короче, проблем нет никаких. Но и смысла тоже не видно никакого :)

Вероятно поэтому создатели Spring и не стали прорабатывать метафору лайфсайкла до конца, и ограничились только той её частью где ресурсы получаются. Если кто-то сильно захочет их освободить - ну что ж, он найдет способ как сделать это, и не используя автоматики

Исходная версия stevejobs, :

Очень просто: сейчас все приложения используют Spring. Мы просто добавляем делаем метод контейнера delete и вызываем его на всех @Autowired переменных, когда в цепочке закончится последний под-метод проаннатированный как @UnmanagedResources (аннотация будет работать аналогично @Transactional, скоуп ресурсу допустим можно будет указывать опцией - закрываться сразу после первого же @UnmanagedResources-метода или после последнего метода в цепочке)

У него уже есть вполне детерминированный «тройной конструктор» (1 - конструктор класса в Java, 2 - init-method в XML, 3 - аннотация @PostConstruct в Java). Он уже может удалять бины со скопом singleton с помощью DefaultListableBeanFactory.destroySingleton и .removeBeanDefinition (и создавать их назад через .registerSingleton). @PreDestroy срабатывает детерминированно в момент исключения бина из контейнера.

Вопрос, что делать с бинами со скопом prototype (аналогом обычных переменных) - либо сделать для них кастомную обработку @PreDestroy, либо симулировать «особые прототипы» поверх синглтонов с автогенерящимися именами (но тогда придется подшаманить в @Autowired чтобы оно связывало не только непосредственно по имени, но и искало имя+автогенернный_префикс, либо в виртуальной таблице переменных).

При этом и @PostConstruct, и @PreDestroy - это часть стандарта JSR-250, поэтому метафора понятна примерно всем.

Короче, проблем нет никаких. Но и смысла тоже не видно никакого :)