首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

spring AOP (六) 基础知识-cglib代理

2013-04-20 
spring AOP (6) 基础知识-cglib代理package spring3.aop.aop4public class Target {public void do1() {S

spring AOP (6) 基础知识-cglib代理
package spring3.aop.aop4;public class Target {public void do1() {System.out.println("Target.do1()");}public void do2(String str) {System.out.println("Target.do2(" + str + ")");}public void exe1() {System.out.println("Target.exe1()");}public void exe2(String str) {System.out.println("Target.exe2(" + str + ")");}public final void exe3() {System.out.println("Target.exe3");}}

?创建代理类 CglibProxy

?

?

package spring3.aop.aop4;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class CglibProxy implements MethodInterceptor {private Enhancer enhancer = new Enhancer();public Object getProxy(Class<?> cls) {// 设定被代理类(目标类)enhancer.setSuperclass(cls);// 实例化代理类enhancer.setCallback(this);return enhancer.create();}@Overridepublic Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {System.out.println("----START----");Object result = proxy.invokeSuper(obj, args);System.out.println("----END----");return result;}}

?测试类:

?

?

package spring3.aop.aop4;public class ProxyMain {public static void main(String[] args) {CglibProxy proxy = new CglibProxy();Target childTarget = (Target) proxy.getProxy(Target.class);childTarget.do1();childTarget.do2("test");childTarget.exe1();childTarget.exe2("test");childTarget.exe3();}}

?测试结果:

?

----START----Target.do1()----END--------START----Target.do2(test)----END--------START----Target.exe1()----END--------START----Target.exe2(test)----END----Target.exe3

?这部分没有什么要讲的,大家知道就可以了。

?

注意,加载cglib时间比jdk的反射时间要长,如果应用中频繁的动态生成新的代理,不建议使用cglib,这个根据具体需求自己判断。

spring的aop是通过jdk动态代理或者cglib动态代理为目标bean织入横切逻辑的。

热点排行