动态代理技术
来源:互联网 发布:翟欣欣 马蓉 知乎 编辑:程序博客网 时间:2024/05/23 18:48
动态代理技术
两种实现方案:
第一种:JDK动态代理技术
实现的InvocationHandler接口,要想实现某个类的动态代理对象,必须有接口有实现类。
第二种:cglib动态代理技术(需要导入spring包–4个核心包)
实现了MethodInterceptor接口,原理是继承要代理的类。
jar包:
代码举例:
//junit测试,jdk动态代理@Testpublic void testJdkProxy(){ //被代理对象 UserService us = new UserServiceImpl(); //代理对象 变厉害了 UserServiceProxy proxy = new UserServiceProxy(us); UserService usProxy = proxy.getUserServiceProxy(); usProxy.save(); //代理对象和被代理对象实现了相同的接口,并且相互之间没有继承关系 System.out.println(usProxy instanceof UserService++usProxy instanceof UserServiceImpl); //true false}
测试方法中的接口UserService 类UserServiceProxy
public interface UserService(){
public void save();
}
测试方法中的实现类UserServiceImpl
public class UserServiceImpl implements UserService(){ public void save(){ syso("保存用户成功"); }}
测试方法中的类UserServiceProxy
//jdk动态代理实现InvocationHandler接口public class UserServiceProxy implements InvocationHandler(){ private UserService us; public UserServiceProxy(us){ this.us = us; } //获得代理对象 public UserService getUserServiceProxy(){ UserService userService = (UserService)Proxy.newProxyInstance(UserServiceProxy.class.getClassLoader,UserServiceImpl.class.getInterface,this); } //对原始对象中的方法进行增强 public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{ System.out.println("打开事务"); Object invoke = method.invoke(us,args); System.out.println("关闭事务"); return invoke; }}
cglib动态代理
测试类:
public void testCglibProxy(){ UserServiceProxy2 proxy = new UseServiceProxy2(); UserServiceImple usProxy = proxy.getUserServiceProxy(); usProxy.save();//代理对象继承了被代理对象,不要使用接口System.out.println(usProxy instanceof UserServiceImpl); //true}
测试类中的UserServiceProxy2
//cglib动态代理实现了MethodInterceptor接口public UserServiceImpl getUserServiceProxy(){ public UserServiceImpl getUserServiceProxy(){ Enhancer en = new Enhancer();//帮我们生成代理对象 en.setSuperclass(UserServiceImpl.class);//设置对谁进行代理 en.setCallback(this);//代理要做什么 UserServiceImpl us = (UserServiceImpl) en.create();//创建代理对象 return us; } //对目标对象增强 public Object intercept(Object prxoyobj, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable { //打开事务 System.out.println("打开事务!"); //调用原有方法 Object returnValue = methodProxy.invokeSuper(prxoyobj, arg); //提交事务 System.out.println("提交事务!"); return returnValue; }}
instanceof 判断某个对象是否属于某个类、或某个接口
判断某个类是否继承了某个接口
阅读全文
0 0
- 动态代理技术
- 动态代理技术
- 动态代理技术
- 动态代理技术
- java动态代理技术
- cglib动态代理技术
- 动态代理技术
- java技术-静态代理到动态代理
- 代理技术简介(二):JDK动态代理
- 代理技术简介(三):CGlib动态代理
- Spring AOP技术--动态代理
- 动态代理(jdk)+cglib技术
- 初探动态代理反射技术
- Java中的动态代理技术
- 动态代理,工厂模式和反射技术
- 黑马程序员_动态代理技术
- JAVA AOP编程之动态代理技术
- 黑马程序员——动态代理技术
- Android Studio jni动态注册步骤
- 访客身份抓取新浪微博视频。Sina Visitor System
- Elasticsearch 入门01
- Android开发----ListView去掉默认分割线 并且加上圆角
- 第三章 授权——《跟我学Shiro》
- 动态代理技术
- BLE广播数据类型(转自Bluetooth SIG)
- 转发自,java编程思想 书中的一个程序
- STM32库开发
- 10月24日云栖精选夜读:2017杭州·云栖大会完美收官 虚拟化平台精彩回顾
- python学习记录:序列
- 图形学
- eclipse常用快捷键
- mybatis的配置元素--properties