Избегать проблем с пружиной cglib proxy
Использование прокси-серверов cglib весной вызывает:
а) двойной вызов конструктора
б) не позволяет перехватить метод, вызванный из другого метода
но почему весна создает бин, а затем прокси? Можно ли динамически генерировать класс, который расширяет указанный класс бина, а затем вызывать конструктор только один раз? что бы решить а) и б) для публичных и защищенных методов. я что-то пропустил?
1 ответ
Хороший вопрос. Я думаю, это связано с тем, как Spring загружает контекст приложения: сначала он создает все необработанные компоненты, а затем применяет постпроцессоры, например, добавляя AOP (включая транзакции). Эта многоуровневая архитектура требует сначала создать нормальный компонент, а затем обернуть его. Можно утверждать, что этот подход следует композиции по принципу наследования.
Также обратите внимание, что а) не должно быть проблемой. Класс должен выполнять инициализацию не в конструкторе, а в @PostConstruct
метод - который вызывается только один раз. С другой стороны, это приводит к другой проблеме:
в) нельзя использовать конструктор с прокси CGLIB, см. SPR-3150
Но я понимаю ваше разочарование. Думаю, единственный действительный обходной путь - это полное плетение AspectJ.