У меня есть следующий класс, который не реализует никакого интерфейса:
public class HelloWorld {
...
}
вот моя конфигурация xml:
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:context = "http://www.springframework.org/schema/context"
xmlns:aop = "http://www.springframework.org/schema/aop" xmlns:task = "http://www.springframework.org/schema/task"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
<context:annotation-config/>
<aop:aspectj-autoproxy />
<bean id = "helloBean" name = "helloBean" class = "com.mkyong.core.HelloWorld" autowire = "byName">
<property name = "name" value = "Mkyong"/>
</bean>
<bean id = "log" class = "com.mkyong.core.Log" />
<bean id = "cachedService" class = "org.springframework.aop.framework.ProxyFactoryBean">
<property name = "target" ref = "helloBean"/>
<property name = "proxyTargetClass" value = "true"/>
</bean>
Следующее работает и использует прокси CGLIB:
HelloWorld obj = (HelloWorld) context.getBean("cachedService");
когда я добавляю следующую конфигурацию в XML, она не работает:
<aop:config >
<aop:aspect id = "log" ref = "log">
<aop:pointcut id = "selectAll"
expression = "execution(* com.*.*.*.*(..))"/>
<aop:before pointcut-ref = "selectAll" method = "beforeAdvice"/>
<aop:after pointcut-ref = "selectAll" method = "afterAdvice"/>
</aop:aspect>
</aop:config>
исключение составляет следующее, он пытается использовать прокси JDK: java.lang.ClassCastException: com.sun.proxy. $ Proxy9 нельзя преобразовать в com.mkyong.core.HelloWorld
Меня смущает следующая работа и использование прокси CGLIB:
HelloWorld obj2 = (HelloWorld) context.getBean("helloBean");
по умолчанию используется прокси CGLIB, если нет интерфейса, так почему он не работает?
helloBean работает, cachedService не работает
Обновлять:
Это устраняет проблему:
<aop:aspectj-autoproxy proxy-target-class = "true"/>
proxy-target-class = "true" требуется на aop, даже если класс не реализует интерфейс, который должен использовать прокси CGLIB,
но зачем это нужно?
Думаю, нужно использовать:
<aop:aspectj-autoproxy proxy-target-class = "true"/>
Так что AspectJ знает, как использовать CGLIB. Я не уверен, нужно ли вам помещать зависимости bean-компонентов внутри элемента aop: aspect-autoproxy ... Раздел 11.6 документации Spring описывает это: https://docs.spring.io/spring/docs/4.3.15.RELEASE/spring-framework-reference/html/aop.html
Я предполагаю, что AspectJ по умолчанию не использует CGLIB ... :-(
Тогда почему getBean работал с helloBean? Я не могу найти объяснения
Я знаю, что это решение, по которому я обновил вопрос, но каково объяснение?