我有以下类别,该类别未实现任何接口:
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"/>
即使该类未实现应使用CGLIB代理的接口,在aop上也需要proxy-target-class =“ true”
但是为什么需要它?
答案 0 :(得分:0)
我认为您需要使用:
<aop:aspectj-autoproxy proxy-target-class="true"/>
以便AspectJ知道使用CGLIB。我不确定是否需要将bean依赖项放在aop:aspect-autoproxy元素中... Spring文档的11.6节介绍了这一点: https://docs.spring.io/spring/docs/4.3.15.RELEASE/spring-framework-reference/html/aop.html