Spring AOP — как передать прокси-бин?

Я настроил Spring-AOP на bean-компоненте.

Когда я обращаюсь к этому bean-компоненту, он возвращает мне прокси-класс spring вместо фактического bean-компонента.

Есть ли способ получить настоящую фасоль?

applicationContext.xml

<bean id="abc" class="abc.java" />

некоторые.java

abc a = (abc)applicationContext.getBean("abc")

это бросает:

java.lang.ClassCastException: $Proxy19


person hakish    schedule 29.05.2009    source источник
comment
Можете ли вы предоставить конфигурацию весны этого компонента?   -  person dfa    schedule 29.05.2009
comment
‹tx:advice id=txAdvice transaction-manager=someTransactionManager› ‹tx:attributes›‹tx:method name=call* /›‹tx:attributes› ‹aop:pointcut id=concurrentProcessOperation expression=execution(* java.util.concurrent .Callable.*(..)) /› ‹aop:config› ‹aop:advisor консультация-ref=txAdvice pointcut-ref=concurrentProcessOperation /› ‹/aop:config›   -  person hakish    schedule 29.05.2009
comment
Является ли «abc» конкретным классом или интерфейсом?   -  person Gandalf    schedule 29.05.2009


Ответы (2)


Для начала вам обязательно нужно будет передать его прокси-объекту. Затем попробуйте:

Proxy.getTargetSource().getTarget

На самом деле я понятия не имею, сработает ли это, документация АОП очень неоднозначна при описании возвращаемых типов для прокси-классов, в ней говорится что-то вроде «Возвращает

person Gandalf    schedule 29.05.2009
comment
Спасибо, чувак, твое решение частично верно. Класс org.springframework.aop.framework.Advised делает свое дело. Советовал советовал = (Советовал) прокси; Целевая цель = proxy.getTargetSource().getTarget(); - person hakish; 01.06.2009
comment
Однако это не тот подход, за который выступали бы ребята из Spring, поскольку он инвазивный. Правильно настроенные прокси-серверы AOP прозрачны для приложения. Если это не так, то это не совсем АОП. - person skaffman; 02.06.2009
comment
Я думаю, что одной из его проблем может быть тот факт, что в АОП вы можете прокси-классы, которые не реализуют какой-либо интерфейс. Таким образом, AOP с самого начала нарушает правила использования прокси. - person Gandalf; 02.06.2009
comment
@hakish Как мне получить переменный прокси? Когда я делаю myAutowiredBean.getTargetSource(), он говорит, что не может разрешить метод. - person flow2k; 10.05.2017

В зависимости от иерархии классов целевого компонента Spring сгенерирует либо прокси-сервер, расширяющий класс целевого компонента (подача в суд на CGLIB), либо сгенерирует прокси-сервер, реализующий только интерфейсы целевого компонента.

Если ваш целевой компонент реализует какие-либо интерфейсы, будет выбран последний вариант. Обычно это предпочтительнее. Я предполагаю, что ваш целевой класс действительно реализует хотя бы один интерфейс. Может ли ваш код, который получает bean-компонент, ссылаться на тип интерфейса вместо класса?

Однако вы можете заставить Spring AOP генерировать прокси, которые расширяют класс целевого компонента, используя параметр proxy-target-class. Точный синтаксис зависит от того, как вы настроили AOP, и вы не указываете это в своем вопросе.

person skaffman    schedule 01.06.2009
comment
я мог бы решить свою проблему, используя класс org.springframework.aop.framework.Advised. Это позволило мне получить доступ к целевому классу, который является фактическим компонентом. Спасибо за ваш вклад. - person hakish; 02.06.2009