Spring的面向切面编程也是基于动态代理来实现的

  • 静态代理:也就是自己手动创建的代理对象
  • 动态代理:也就是在程序运行中通过配置参生的

那么Spring的AOP也就是面向切面编程,就是基于动态代理来实现的,通过代理原始类增加额外功能,我们可以将额外功能一次定义然后配合切点达到多次使用的效果,比如 做日志啊 事物啊 时间啊等等…提高了复用性 开发效率.


那么在Spirng当中动态代理有两种

  • 第一种也就是JDK自带的动态代理
    1.JDK动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理.
    需要指定一个类加载器,然后生成的代理对象实现类的接口或类的类型,接着处理额外功能.
    JDK是基于接口
  • 第二只也就是Cglib的动态代理
    2.Cglib是动态代理利用asm的开源包,对代理对象的Class文件加载进来,通过修改其字节码生成的子类来处理
    Cglib是基于继承父类生成的代理类.

在Spirng当中动态代理的使用
1.如果目标对象实现了接口,默认情况下会采用JDK的动态代理来实现AOP
2.如果目标对象实现了接口,也可以强制使用CGlib来实现AOP
3.如果目标对象没有实现接口,必须采用Cglib库,Spirng会自动在JDK和CGlib用切换

如何强制使用CGlib来实现AOP?
1.添加CGlibjar包:SPRING_HOME/cglib/*.jar
2.在Spring的配置文件中加入 //默认是false 也就是用JDK的 改为true就是用Cglib的

JDK和动态代理和CGlib字节码的生成区别?
1.JDK动态代理制能对实现了接口的类生成代理,而不是针对类
2.CGLIB是针对类实现代理,主要对指定的类生成一个子类,覆盖其中的方法,添加额外功能,因为是继承,所以该类方法不能用final来声明.

代码了解一下:

用户管理接口:

 package com.lf.shejimoshi.proxy.entity;//用户管理接口public interface UserManager {//新增用户抽象方法void addUser(String userName,String password);//删除用户抽象方法void delUser(String userName);}

用户管理接口实现类

     package com.lf.shejimoshi.proxy.entity;//用户管理实现类,实现用户管理接口public class UserManagerImpl implements UserManager{//重写新增用户方法@Overridepublic void addUser(String userName, String password) {System.out.println("调用了新增的方法!");System.out.println("传入参数为 userName: "+userName+" password: "+password);}//重写删除用户方法@Overridepublic void delUser(String userName) {System.out.println("调用了删除的方法!");System.out.println("传入参数为 userName: "+userName);}}

JDK动态代理:

package com.lf.shejimoshi.proxy.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.lf.shejimoshi.proxy.entity.UserManager;
import com.lf.shejimoshi.proxy.entity.UserManagerImpl;//JDK动态代理实现InvocationHandler接口
public class JdkProxy implements InvocationHandler {private Object target ;//需要代理的目标对象
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("JDK动态代理,监听开始!");Object result = method.invoke(target, args);System.out.println("JDK动态代理,监听结束!");return result;
}
//定义获取代理对象方法
private Object getJDKProxy(Object targetObject){//为目标对象target赋值this.target = targetObject;//JDK动态代理只能针对实现了接口的类进行代理,newProxyInstance 函数所需参数就可看出return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);
}public static void main(String[] args) {JdkProxy jdkProxy = new JdkProxy();//实例化JDKProxy对象UserManager user = (UserManager) jdkProxy.getJDKProxy(new UserManagerImpl());//获取代理对象user.addUser("admin", "123123");//执行新增方法
}
}

JDK动态代理运行结果:

Cglib动态代理:(需要导入两个jar包,asm-5.2.jar,cglib-3.2.5.jar。版本自行选择)

package com.lf.shejimoshi.proxy.cglib;
import java.lang.reflect.Method;import com.lf.shejimoshi.proxy.entity.UserManager;
import com.lf.shejimoshi.proxy.entity.UserManagerImpl;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;//Cglib动态代理,实现MethodInterceptor接口
public class CglibProxy implements MethodInterceptor {private Object target;//需要代理的目标对象//重写拦截方法
@Override
public Object intercept(Object obj, Method method, Object[] arr, MethodProxy proxy) throws Throwable {System.out.println("Cglib动态代理,监听开始!");Object invoke = method.invoke(target, arr);//方法执行,参数:target 目标对象 arr参数数组System.out.println("Cglib动态代理,监听结束!");return invoke;
}
//定义获取代理对象方法
public Object getCglibProxy(Object objectTarget){//为目标对象target赋值this.target = objectTarget;Enhancer enhancer = new Enhancer();//设置父类,因为Cglib是针对指定的类生成一个子类,所以需要指定父类enhancer.setSuperclass(objectTarget.getClass());enhancer.setCallback(this);// 设置回调 Object result = enhancer.create();//创建并返回代理对象return result;
}public static void main(String[] args) {CglibProxy cglib = new CglibProxy();//实例化CglibProxy对象UserManager user =  (UserManager) cglib.getCglibProxy(new UserManagerImpl());//获取代理对象user.delUser("admin");//执行删除方法
}
}

Cglib动态代理运行结果:

Spring动态代理的两种区别相关推荐

  1. spring中AOP动态代理的两种方式

    AOP动态代理的两种方式 Spring AOP动态代理的方式(spring的AOP默认是JDK Proxy) 浅谈这两种动态代理 JDK的动态代理,需要有实现接口 动态代理--JDK Proxy ⚫ ...

  2. Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别

    视频功能审核通过了,可以看视频啦!记得点关注啊~ 注意:因为网络原因,视频前一两分钟可能会比较模糊,过一会儿就好了 记得点关注啊,视频里的wx二维码失效了,wx搜索:"聊5毛钱的java&q ...

  3. SpringAop动态代理的两种实现方式

    Spring的面向切面编程也是基于动态代理来实现的 静态代理:也就是自己手动创建的代理对象 动态代理:也就是在程序运行中通过配置参生的 那么Spring的AOP也就是面向切面编程,就是基于动态代理来实 ...

  4. Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理

    Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...

  5. Java动态代理的两种实现方法

    转载自 http://blog.csdn.net/HEYUTAO007/article/details/49738887 AOP的拦截功能是由java中的动态代理来实现的.说白了,就是在目标类的基础上 ...

  6. 动态代理的两种方式_动态代理是基于什么原理?

    代理模式 给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问. 什么是动态代理 运行时动态生成代理类. 动态代理我们需要些什么 1.业务接口(Interface) 业务的抽象表示. 2.业务 ...

  7. 动态代理的两种实现方式

    1.动态代理介绍 动态代理:在不改变目标对象方法的情况下对方法进行增强 组成: 被代理对象:真实的对象 代理对象:内存中的对象 要求:代理对象必须和被代理对象实现相同的接口 代理的实现方式有两种:(1 ...

  8. Java实现动态代理的两种方式

    http://m.blog.csdn.net/article/details?id=49738887

  9. Spring动态代理原理是什么?

    动态代理的两种模式 jdk动态代理    //基于实现接口 Cglib动态代理   //基于方法的继承 ????????啥东西 这就不得不提到 静态代理了: 说得高大上,其实就是写一个增强类继承被增强 ...

  10. 动态代理jdk和cglib区别、注意事项(private,static,final)、spring aop原理

    文章目录 一.代理简聊 二.静态代理 三.动态代理 1.jdk动态代理 2.cglib动态代理 四.动态代理总结.注意事项 1.jdk动态代理与cglib的区别. 2.注意事项及分析. 五.aop原理 ...

最新文章

  1. 帮你排雷Jmeter分布式性能测试那些坑
  2. decode函数_decode函数的妙用网友的两个问题解答
  3. php中this,self,parent三个关键字之间的区别(转载)
  4. 【PC工具】智能抠图软件,绿色免安装抠图神奇抠图工具
  5. WebPart(汇总)[转载]
  6. box-shadow
  7. Bootstrap是什么
  8. laytpl语法_浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
  9. 如何使用PDF编辑器裁剪PDF页面
  10. java即时通讯聊天工具
  11. 0806 07 08 09 12上午数据库
  12. 利用文本挖掘技术来找出《天龙八部》中的“小鲜词”
  13. 获取随机数的n种方法,你知道几种
  14. Java 6-2:收放自如,融汇贯通,让线程不再疯癫——线程的阻塞和关闭
  15. html5悬浮效果,html5悬浮球效果
  16. 《人机交互技术》结课作业:界面调研报告交互界面设计快速原型设计(华科软院)
  17. Oracle中多表查询再按时间倒序
  18. 阿里面试应该注意什么?通过5轮面试的阿里实习生亲述
  19. abaqus html安装,abaqus 2016安装错误
  20. 无刷直流电机自适应模糊PID控制及仿真

热门文章

  1. 有关微信小程序用户登录界面跳转问题
  2. 软考和华为证书的含金量,哪个更适合找工作
  3. 通达信在linux下界面难看,通达信看盘设置小技巧,主力也在用的设置技巧
  4. 关于扫描枪输入英文乱码问题
  5. IDEA jclasslib插件安装
  6. 抛弃手册,开启TongWeb+TongLINK/Q的开发方式
  7. 计算机电源(atx电源),电脑ATX电源各级电压标准
  8. deepin 惠普打印驱动安装
  9. MobileNet-SSD网络解析
  10. Excel或C语言复数运算