CGLIB, Spring и внедрение конструктором

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

Tx заранее


person ShinySpiderdude    schedule 27.03.2012    source источник


Ответы (2)


Короткий ответ: вы не можете проксировать такие bean-компоненты. См. SPR-3150 проблему jira.

person Eugene Kuleshov    schedule 27.03.2012
comment
очевидно, мы можем ожидать этого в cglib 4.0 - person Peter Perháč; 27.12.2013
comment
согласно комментарий Юргена Хеллера в SPR-3150, с Spring 4.0 это больше не проблема. - person Rüdiger Schulz; 17.03.2014

Поскольку Юджин, вероятно, прав в своем коротком ответе, другой способ сделать это — использовать адаптер или Шаблон декоратора, использующий композицию вместо наследования. Проксируйте свой декоратор и позвольте ему иметь исходный компонент в качестве зависимости.

Или поступите разумно и переключитесь на интерфейсные прокси.

person Sean Patrick Floyd    schedule 27.03.2012
comment
Как именно? Я должен создать новый класс-оболочку для каждого из моих классов, использующих внедрение конструктора? @Шон Патрик Флойд - person Tomer; 15.08.2013
comment
да, в принципе. или используйте прокси на основе интерфейса, это намного меньше боли - person Sean Patrick Floyd; 15.08.2013
comment
На самом деле это тоже боль. У меня есть сервис, который написан таким особым образом (внедрение конструктора), и я хочу использовать возможности проксирования, не делая таких значительных изменений в моем коде. Я также не могу перейти на прокси-серверы на основе интерфейса. Я пытаюсь создать свой собственный BeanPostProcessor, который будет проксировать bean-компонент с аргументами конструктора, но это довольно сложно, и я ищу более простое решение..:-| @Шон Патрик Флойд - person Tomer; 15.08.2013