初探Spring之动态代理的使用
2017-07-23 15:24
260 查看
1.介绍
AOP全称是Aspect Oriented Programming 可以理解为面向切面编程,通过预编译的形式和运行动态代理实现程序功能的统一维护的一种技术。2.实现方式:
预编译:AspectJ
动态代理:
JDK动态代理 ,Cglib 动态代理
3.主要的功能有:
日志记录,性能统计,安全控制,事务处理,异常处理等等;4.动态代理
[b]1)jdk动态代理[/b]jdk是面向接口的,所以一定要写一个接口。
代码结构
接口的方法:
public void productBm(); public void productBc(); public void productAd();
实现类
public void productBm() { System.out.println("生产了宝马"); } public void productBc() { System.out.println("生产了奔驰"); } public void productAd() { System.out.println("生产了奥迪"); }
代理类 实现InvocationHandler:
private Object obj; public Object getObj() { return obj; } public void setObj(Object obj) { this.obj = obj; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("销售前"); //代理的方法注入参数 args Object result=method.invoke(obj, args);method.invoke(obj, args); System.out.println("销售后"); return result; }
测试类:
//创建目标 IcarImpl a=new IcarImpl(); //创建代理 CarProxy cr=new CarProxy(); //设置代理关系 cr.setObj(a); Icar car = (Icar) Proxy.newProxyInstance(a.getClass().getClassLoader(), a.getClass().getInterfaces(), cr); car.productBm();
执行结果:
销售前 生产了宝马 销售后
[b]2)Cglib动态代理[/b]
Cglib不是面向接口的 ,所以不用写接口。这个类继承了 MethodInterceptor 。
这次的目标类和上边的一样
代理类:
public class CglibProxy implements MethodInterceptor { @Override public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable { System.out.println("销售前"); //方法注入参数 Object result=arg3.invokeSuper(arg0, arg2); System.out.println("销售后"); return result; } }
测试类:
//创建目标 IcarImpl icarImpl = new IcarImpl(); //创建代理 CglibProxy cglibProxy = new CglibProxy(); //设置个中介 将两个联系在一起 Enhancer enhancer=new Enhancer(); enhancer.setSuperclass(icarImpl.getClass()); enhancer.setCallback(cglibProxy); //生成了目标的对象 IcarImpl ic= (IcarImpl) enhancer.create(); //调用方法 ic.productBc();
大家有问题还望多多提出,共同进步!
相关文章推荐
- Spring的AOP实现使用的JDK的动态代理必须使用接口
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...
- Spring动态代理使用
- spring 如何决定使用jdk动态代理和cglib(网易面试题)
- spring AOP动态代理使用和配置方式(手打)
- 重温Spring之旅5——AOP代理对象、JDK动态代理、使用cglib生产代理
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...
- Spring_AOP_XML使用Aspect实现动态代理(常用)
- spring 如何决定使用jdk动态代理和cglib(网易面试题)
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...今天
- 关于使用spring的动态代理机制时为什么必须指定接口
- SSH与SSM学习之Spring13——动态代理之通知的使用
- 使用动态代理简易模拟spring aop
- spring 动态代理如何决定使用jdk代理和cglib(网易面试题)
- 为什么SpringAOP使用JDK动态代理时好像没有代理Object.[equals()、hashCode()、toString()]这三个方法
- Spring_AOP_XML使用Aspect实现动态代理(常用) .
- SpringBoot+Mybatis中使用动态代理方式动态切换datasource
- Spring_AOP_Annotation使用Aspect实现动态代理 .
- spring AOP 动态代理 jkd动态代理和cglib动态代理 hibernate使用cglib延迟加载
- jdk动态代理与cglib代理、spring Aop代理原理-代理使用浅析