JDK中的AOP、动态代理

AOP(Aspect Oriented Programming,面向切面编程、面向方面编程)应用到项目中能够将与业务逻辑不相关的代码(如:日志、权限等)分离出来,减小相关业务类负担,并能让一些通用需求(如:事务)得到更广泛的复用。 AOP的实现是利用了java的代理机制。

代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 按照代理的创建时期,代理类可以分为两种:

  • 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了;
  • 动态代理:在程序运行时,运用反射机制动态创建而成。

静态代理

要求代理对象与被代理对象都实现同一个接口,以下代码就是通过静态代理实现了AOP,UserManagerProxy代理了UserManagerImpl的addUser方法。但是静态代理一般不能满足我们项目开发的需求,如果业务需求很多它得为每一个业务方法一一做代理。

JDK动态代理

与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。 Java Proxy只能代理接口,不能代理类。

需实现java.lang.reflect.InvocationHandler的接口,重写invoke(Object proxy,Method method,Object[] args)方法,代理对象实例由Proxy.newProxyInstance(ClassLoader loader,Class interfaces,InvocationHandler h)方法生成,当代理对象的方法被执行时,通知执行器(InvocationHandler)执行invoke(Object proxy,Method method,Object[] args)方法,invoke方法内调用了method.invoke(Object obj,Object… args)方法,该方法对带有指定参数的指定对象调用由此 Method 对象表示的基础方法,应该这时才真正代理执行了业务逻辑。

CGLIB动态代理

JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,它的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

JDK动态代理和CGLIB字节码生成的区别?

  • JDK动态代理只能对实现了接口的类生成代理,而不能针对类;
  • CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法。因为是继承,所以该类或方法最好不要声明成final。

发布了52 篇原创文章 · 获赞 3 · 访问量 14万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章