java中的代理
来源:互联网 发布:diy相册制作软件 编辑:程序博客网 时间:2024/06/06 01:11
对于java业务而言,通常会把主体业务和枝节性代码分开,比如做数据库更新的时候,会把事务的管理和真正的业务逻辑分开,这样既提高了管理类的使用效率,也降低了管理类和业务的耦合。类似的情况还有日志记录、信息监管等。
代理模式:为其它对象提供一种代理以控制对这个对象的访问。代理模式的角色:
- 抽象角色:声明真实对象和代理对象的共同接口
- 代理角色:代理对象内部包含有真实角色的引用,从而可以操作真实角色,同时代理对象 与真实对象有相同的接口,能在任何时候代替真实对象,同时代理对象可以在执行真实对 象前后加入特定的逻辑以实现功能的扩展。
- 真实角色:代理角色所代表的真实对象
java中代理的实现:
1、静态代理,为每一个真实对象特定生成一个代理类
// 接口public interface Int { void doJob(String jobName);}
//实现类public class IntImpl implements Int { private String jobName; public IntImpl() { } public IntImpl(String jobName) { this.jobName = jobName; } public void doJob(String jobName) { System.out.println(this.getClass().getSimpleName()+" start to do job "+ jobName); } public String getJobName() { return jobName; } public void setJobName(String jobName) { this.jobName = jobName; }}
// 静态代理实现类public class StaticProxy implements Int{ private Int intService; public StaticProxy(Int intService) { this.intService = intService; } public void doJob(String jobName) { System.out.println(" proxy class "+this.getClass().getSimpleName()+" do job"); this.intService.doJob(jobName); }}2、动态代理
在运行时生成
public class DynamicProxyHandler implements InvocationHandler{ private Object targetObject; public Object bindProxy(Object targetObject) { this.targetObject = targetObject; return Proxy.newProxyInstance(this.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("dynamic method"); return method.invoke(targetObject,args); }}3、cglib字节码代理
public class CglibProxy implements MethodInterceptor { public Object getInstance(Object target){ Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(target.getClass()); enhancer.setCallback(this); return enhancer.create(); } public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("前置代理"); Object result = methodProxy.invokeSuper(o,objects); System.out.println("后置代理"); return result; }}
cglib和invocationHandler实现区别:
1、jdk动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。jdk代理只能代理接口,会根据接口生成一个与实现类同级的代理接口子类,目标对象作为代理对象的一个属性。
2、cglib代理动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理,方法调用时,通过子类方法覆盖父类方法,所以方法不能是final声明。
阅读全文
0 0
- Java中的代理模式
- JAVA中的代理技术
- Java中的代理模式
- Java中的代理
- Java中的代理模式
- java中的动态代理
- Java 中的代理模式
- java中的动态代理》》》》》
- 浅谈java中的代理
- JAVA 中的 动态代理
- java中的代理
- java中的动态代理
- java中的代理
- Java中的代理
- java中的动态代理
- Java中的动态代理
- Java中的动态代理
- JAVA中的动态代理
- SPI 协议详解
- 第五周项目-建立顺序栈算法库
- MySql在索引优化(排序,复合)
- Js之$.ajax回调函数获取结果的问题-yellowcong
- LNMP all-in-one
- java中的代理
- 如何使用 Spring MVC 进行单文件与多文件上传的三种情况
- LICEcap GIF屏幕录制工具
- IntelliJ Idea 免费激活方法
- 可持久化字典树
- html里嵌套php
- [Spring事务]
- android webview 加载https --忽略证书
- Chrome 及驱动各版本下载地址