Spring AOP 两种代理 Cglib、JDK

概念

AOP:AOP是 OOP(面向对象编程)的一种延续,OOP中继承的思想主要是提高代码的重用率,但是继承不能同个类在多个方法的相同位置出现的相同代码的问题

JDK动态代理:AOP的一种实现,仅支持实现了接口的类。性能较好

Cglib:AOP的一种实现,支持实现了接口的类和没有实现接口的类。对比JDK动态代理性能较差

Spring AOP:结合上面2种方式,spring会自动在JDK动态代理和CGLIB之间转换,优先使用JDK(类实现了接口的时候)

AspectJ:只是一个框架,提供更便捷的语法帮我们更好的使用AOP

JDK与Cglib 使用

先建立 2个类,一个没有实现接口,一个是实现了接口的

1public class UserUtil { 2 public void addUser(String id, String password) { 3 System.out.println("UserUtil.addUser() ..."); 4 } 5}

1public interface UseService { 2 void addUser(String id, String password); 3} 4 5 6public class UseServiceImpl implements UseService { 7 @Override 8 public void addUser(String id, String password) { 9 System.out.println("UseServiceImpl.addUser() ..."); 10 } 11}

JDK 动态代理

1/** 2 * JDK动态代理类 3 */ 4public class JDKProxy implements InvocationHandler { 5 6 private Object targetObject; 7 8 public Object newProxy(Object targetObject) { 9 this.targetObject = targetObject; 10 return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); 11 } 12 13 @Override 14 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 15 System.out.println("前置..."); 16 return method.invoke(targetObject, args); 17 } 18 19}

Cglib

1/** 2 * CGlib动态代理类 3 */ 4 public class CGLibProxy implements MethodInterceptor { 5 6 private Object targetObject; 7 8 public Object createProxyObject(Object obj) { 9 this.targetObject = obj; 10 Enhancer enhancer = new Enhancer(); 11 enhancer.setSuperclass(obj.getClass()); 12 enhancer.setCallback(this); 13 return enhancer.create(); 14 } 15 16 @Override 17 public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { 18 System.out.println("前置..."); 19 return method.invoke(targetObject, args); 20 } 21}

测试

1public class ProxyTest { 2 3 public static void main(String[] args) { 4 //cglib 代理:支持没有实现接口的类和实现了接口的类 5 UserUtil userManager = (UserUtil) new CGLibProxy().createProxyObject(new UserUtil()); 6 userManager.addUser("tom", "root"); 7 8 //jdk 动态代理:支持实现了接口的类 9 UseService useServiceJDK = (UseService) new JDKProxy().newProxy(new UseServiceImpl()); 10 useServiceJDK.addUser("tom", "root"); 11 } 12}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

CGLIB介绍与原理(通过继承的动态代理)

一、什么是CGLIB?CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。二、CGLIB原理CGLIB原理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的

Spring的两种代理JDK和CGLIB的区别浅谈

一、原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以

AOP相关概念

1.AOP(面向切面编程)在软件业,AOP为AspectOrientedProgramming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,在软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生泛型.利用AOP