Избегать проблем с пружиной cglib proxy

Использование прокси-серверов cglib весной вызывает:

а) двойной вызов конструктора

б) не позволяет перехватить метод, вызванный из другого метода

но почему весна создает бин, а затем прокси? Можно ли динамически генерировать класс, который расширяет указанный класс бина, а затем вызывать конструктор только один раз? что бы решить а) и б) для публичных и защищенных методов. я что-то пропустил?

1 ответ

Решение

Хороший вопрос. Я думаю, это связано с тем, как Spring загружает контекст приложения: сначала он создает все необработанные компоненты, а затем применяет постпроцессоры, например, добавляя AOP (включая транзакции). Эта многоуровневая архитектура требует сначала создать нормальный компонент, а затем обернуть его. Можно утверждать, что этот подход следует композиции по принципу наследования.

Также обратите внимание, что а) не должно быть проблемой. Класс должен выполнять инициализацию не в конструкторе, а в @PostConstruct метод - который вызывается только один раз. С другой стороны, это приводит к другой проблеме:

в) нельзя использовать конструктор с прокси CGLIB, см. SPR-3150

Но я понимаю ваше разочарование. Думаю, единственный действительный обходной путь - это полное плетение AspectJ.

Другие вопросы по тегам