关于动态代理和静态代理

当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁–代理对象。

按照代理对象的创建时期不同,可以分为两种:

静态代理:事先写好代理对象类,在程序发布前就已经存在了;动态代理:应用程序发布后,通过动态创建代理对象。

动态代理又可分为:JDK动态代理和CGLIB代理。

1.JDK动态代理

此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,可以在调用目标对象相应方法前后加上其他业务处理逻辑。

代理模式在实际使用时需要指定具体的目标对象,如果为每个类都添加一个代理类的话,会导致类很多,同时如果不知道具体类的话,怎样实现代理模式呢?这就引出动态代理。

JDK动态代理只能针对实现了接口的类生成代理。

2.CGLIB代理

CGLIB(CODE GENERLIZE LIBRARY)代理是针对类实现代理,

主要是对指定的类生成一个子类,覆盖其中的所有方法,所以该类或方法不能声明称final的。

JDK动态代理和CGLIB代理生成的区别

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

PS:final 所修饰的数据具有“终态”的特征,表示“最终的”意思:

final 修饰的类不能被继承。
final 修饰的方法不能被子类重写。
final 修饰的变量(成员变量或局部变量)即成为常量,只能赋值一次。
final 修饰的成员变量必须在声明的同时赋值,如果在声明的时候没有赋值,那么只有 一次赋值的机会,而且只能在构造方法中显式赋值,然后才能使用。
final 修饰的局部变量可以只声明不赋值,然后再进行一次性的赋值。

参考代码

CGLIB:


public Object createProxyObject(Object obj) { this.targetObject = obj; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(obj.getClass()); enhancer.setCallback(this); Object proxyObj = enhancer.create(); return proxyObj;// 返回代理对象,返回的对象其实就是一个封装了“实现类”的代理类,是实现类的实例。
}

JDK:

public Object newProxy(Object targetObject) {// 将目标对象传入进行代理 this.targetObject = targetObject;  <br>    //注意这个方法的参数,后面是类实现的接口return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);// 返回代理对象
}

在代码中可以看到,在生成代理类时,传递的是实现类所实现的接口 targetObject.getClass().getInterfaces(),所以JDK只能对于接口进行做代理。如果换成类的话,则会抛java.lang.ClassCastException异常。

在Spring的源码中,可以看到很多生成代理类的代码。

动态代理的应用

AOP(Aspect-OrientedProgramming,面向切面编程),AOP包括切面(aspect)、通知(advice)、连接点(joinpoint),实现方式就是通过对目标对象的代理在连接点前后加入通知,完成统一的切面操作。

实现AOP的技术,主要分为两大类:

一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;

二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。

Spring提供了两种方式来生成代理对象: JDKProxy和Cglib,具体使用哪种方式生成由AopProxyFactory根据AdvisedSupport对象的配置来决定。

默认的策略是如果目标类是接口,则使用JDK动态代理技术,如果目标对象没有实现接口,则默认会采用CGLIB代理。

如果目标对象实现了接口,可以强制使用CGLIB实现代理(添加CGLIB库,并在spring配置中加入<aop:aspectj-autoproxy proxy-target-class=“true”/>)。

转自:http://www.cnblogs.com/binyue/p/4519652.html

JDK和cglib生成代理类相关推荐

  1. spring框架中JDK和CGLIB动态代理区别

    转载:https://blog.csdn.net/yhl_jxy/article/details/80635012 前言 JDK动态代理实现原理(jdk8):https://blog.csdn.net ...

  2. JDK和CGLIB动态代理区别

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 前言 Github:https://github.com/yihonglei/thinking-in ...

  3. 动态代理最全详解系列[2]-Proxy生成代理类对象源码分析

      之前我们通过JDK中的Proxy实现了动态代理,Proxy用起来是比较简便的,但理解起来不是那么清晰,是因为我们并没有看见代理类是怎么生成的,代理类怎么调用的被代理类方法,所以下面我们进入源码看一 ...

  4. JDK和CGLIB动态代理原理

    JDK动态代理原理解析 一.例子: 1.定义基础接口 public interface HttpApi {String get(String url); } 2.实现类 public class Re ...

  5. JDK和cglib动态代理原理详解

    AOP的基础是Java动态代理,了解和使用两种动态代理能让我们更好地理解 AOP,在讲解AOP之前,让我们先来看看Java动态代理的使用方式以及底层实现原理. 转自https://www.jiansh ...

  6. 静态代理、JDK与CGLIB动态代理、AOP+IoC原理

    静态代理.JDK与CGLIB动态代理.AOP+IoC 希望大家认真看完,感谢写这文章的大牛 目录 一.为什么需要代理模式 二.静态代理 三.动态代理,使用JDK内置的Proxy实现 四.动态代理,使用 ...

  7. JDK和cglib动态代理代码示例

    JDK和cglib动态代理代码: package com.zhangxueliang.demo.proxy;import java.lang.reflect.InvocationHandler; im ...

  8. Spring4:没有默认构造函数的基于CGLIB的代理类

    在Spring中,如果要代理的目标对象的类未实现任何接口,则将创建基于CGLIB的代理. 在Spring 4之前,基于CGLIB的代理类需要默认的构造函数. 这不是CGLIB库的限制,而是Spring ...

  9. Spring : 静态代理模式和JDK、CGLIB动态代理

    1.美图 2.概述 为了更好的分析分析Spring的另一个核心功能AOP,需要先温习一下动态代理的知识,如果对java的动态代理无所了解的话,那么对AOP源码的分析就无从谈起.代理模式可分为静态代理和 ...

最新文章

  1. php 500 内部服务器错误,php 500 - 内部服务器错误的解决方法
  2. 部分和模板的复杂嵌套
  3. android多媒体编程题库,android 仿猿题库答题UI
  4. android:windowsoftinputmode=“adjustresize” 无效的解决办法
  5. Java(发布/订阅模式)
  6. 汇编 --- 从磁盘(扇区2到18)上读取数据到内存中
  7. 后端在插入数据发现重复如何正确的弹出警告_前百度面试官整理的——Java后端面试题(一)...
  8. Linux学习-账号管理
  9. python入门指南by许半仙长佩_有哪些好看的耽美文啊?
  10. 使用JavaScript创建Table时,用cellSpacing而不是cellspacing
  11. svchost 100%怎么办==》win
  12. Vue项目实战05:18n实现多语言自动切换-浏览器语言设置
  13. 极致小巧的画图工具,只有548K,有20多种工具,图层功能 类PS
  14. 数据竞赛修炼笔记之快手用户活跃度的预测
  15. 【PA2011】Kangaroos
  16. k8s 的容器command用法相关
  17. 橘子学ES03之Docker安装ELK+cerebro
  18. AutoJs学习-实现抖音采集
  19. WEB前端开发工程师 学习第二天 文字文本
  20. python学习资源整理

热门文章

  1. TJA1050只能RX不能TX
  2. 第五章-分布式并行编程框架MapReduce
  3. Hyperledger Fabric 核心模块(2)configtxgen工具
  4. (chap9 基于HTTP的功能追加协议) Web 服务器管理文件的 WebDAV
  5. MySQL—表的完整性约束(外键约束)(二)
  6. 设计模式C++实现(10)——桥接模式
  7. 142. 前缀统计【trie】
  8. 2021暑假每日一题 【week6 完结】
  9. 第二章 数据结构 【完结】
  10. 260. 只出现一次的数字 III 【位运算】