spring默认使用jdk的代理方式,
使用jdk的代理方式我们知道,代理的类需要实现一个接口,若果没有就会报,java.lang.NoSuchMethodException: com.sun.proxy.$Proxy83.loginPage()异常,
这时候我们可以使用<aop:aspectj-autoproxy proxy-target-class="true"/>让spring使用cglib的代理方式,
cglib的时候需要有默认的构造方法,class不能为final的,
如果你对项目中的action就是contorller层代理这就会报这个异常,因为contorller这层没有实现接口,
我们使用<aop:aspectj-autoproxy proxy-target-class="false"/>来指定让他来使用cglib的代理方式,但是: Could not generate CGLIB subclass of class [class com.sun.proxy.$Proxy22]: Common causes of this problem include using a final class or a non-visible class; 可能会报这个异常,它的意思不能代理final的或后类,我觉的这个是使用的baseDaoImpl的问题,全部继承了basedaoImpl在这个里面使用了
ParameterizedType pt = (ParameterizedType) this.getClass()
.getGenericSuperclass();
this.clazz = (Class<T>) pt.getActualTypeArguments()[0];
Caused by: net.sf.cglib.core.CodeGenerationException: java.lang.ClassCastException-->java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
需要这个类不实现接口,
解决方案值配置<aop:aspectj-autoproxy /> 现在发现应该是spring会自动在JDK动态代理和CGLIB之间转换。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Spring除了支持Schema方式配置AOP,还支持注解方式:使用@AspectJ风格的切面声明。
1 启用对@AspectJ的支持
Spring默认不支持@AspectJ风格的切面声明,为了支持需要使用如下配置:
java代码:
<aop:aspectj-autoproxy/>
这样Spring就能发现@AspectJ风格的切面并且将切面应用到目标对象。
2 声明切面
@AspectJ风格的声明切面非常简单,使用@Aspect注解进行声明:
java代码:
@Aspect()
Public class Aspect{
……
}
然后将该切面在配置文件中声明为Bean后,Spring就能自动识别并进行AOP方面的配置:
java代码:
<bean , defaultImpl=cn.javass.spring.chapter6.service.impl.IntroductiondService.class)
private IIntroductionService introductionService;
其中测试代码与Schema方式几乎一样,在此就不演示了,如果需要请参考AopTest.java中的testAnnotationIntroduction测试方法。
---------------------