1、两种动态代理方式:
java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
java动态代理要求目标类必须实现了接口,cglib动态代理则要求目标类必须有默认的构造方法。
2、Spring下使用动态代理对Controller切面
因为controller没有实现接口,因此必须使用cglib进行动态代理。
<!-- 启动对@AspectJ注解的支持 -->
<aop:aspectj-autoproxy <span style="color:#FF0000;">proxy-target-class="true"</span>/>
proxy-target-class为true则spring会强制使用cglib代理,否则使用java动态代理。
要实现对controller进行代理,需要将aspectj 和springmvc配置放到一个配置文件中,如下:
<!-- 启动扫描所有的controller,service -->
<context:component-scan base-package="com.ec.core.controller"/>
<bean id="methodLog" class="com.ec.base.log.MethodLogAspectJ"/>
<!-- 启动对@AspectJ注解的支持 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>