代理分为两种:静态代理  动态代理

静态代理:本质上会在硬盘上创建一个真正的物理类

动态代理:本质上是在内存中构建出一个类。

如果多个类需要进行方法增强,静态代理则需要创建多个物理类,占用磁盘空间。而动态代理则是在内存中创建,不会对磁盘进行影响。

静态代理和JDK动态代理需要有接口。  CGLIB动态代理无需有接口的情况下进行代理。实质:内存中构建出了目标类型的子类。

JDK动态代理是JDK提供的,CGLIB动态代理是Spring提供的。

代理模式的三个组件:抽象主题  真实主题  代理主题

静态代理:

   接口(抽象主题)的代码:

  1. //抽象主题
  2. public interface Subject {
  3. public void request();
  4. }

  目标对象(真实主题)的代码:

  1. //真实主题
  2. public class RealSubject implements Subject{
  3. @Override
  4. public void request() {
  5. System.out.println("Subject RealSubject");
  6. }
  7. }

  代理对象(代理主题)的代码:

  1. package cn.Spring.Day09Staticporxy;
  2. //代理主题
  3. public class ProxySubject implements Subject {
  4. //把真实主题当成代理主题的成员变量
  5. private RealSubject rs=new RealSubject();
  6. @Override
  7. public void request() {
  8. System.out.println("proxy");//在调用真实主题要增强的方法前进行增强
  9. rs.request();
  10. System.out.println("ProxySubject");//在调用真实主题要增强的方法后进行增强
  11. }
  12. }

JDK动态代理:

  接口:

  1. package cn.Spring.Day14JDKproxy;
  2.  
  3. public interface ISomeService {
  4. public void request();
  5. }

  目标对象:

  1. package cn.Spring.Day14JDKproxy;
  2.  
  3. public class SomeService implements ISomeService {
  4. @Override
  5. public void request() {
  6. System.out.println("977+7777");
  7. }
  8. }

  代理对象:

  1. package cn.Spring.Day14JDKproxy;
  2.  
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Method;
  5. import java.lang.reflect.Proxy;
  6.  
  7. public class JdkProxy {
  8. public static void main(String[] args) {
  9. /*
  10. * 1.使用Proxy点出newProxyInstance方法 方法有三个参数
  11. * ClassLoader loader, 类加载器类型的一个对象
  12. * Class<?>[] interfaces,接口数组对象
  13. * InvocationHandler h InvocationHandler 对象
  14. * 2.实例化目标对象 目标对象去传入参数。
  15. * 3.invoke方法中使用method.invoke传入目标对象,和参数数组。
  16. *
  17. *
  18. * */
  19. final SomeService ss=new SomeService();
  20. ISomeService proxy = (ISomeService)Proxy.newProxyInstance(ss.getClass().getClassLoader(), ss.getClass().getInterfaces(), new InvocationHandler() {
  21. @Override
  22. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  23. System.out.println("我是增强666666");
  24. method.invoke(ss,args);
  25. return null;
  26. }
  27. });
  28. proxy.request();
  29. }
  30. }
  1. newProxyInstance要传的参数

invoke要传的参数

CGLIB动态代理:

目标对象:

  1. package cn.Spring.Day10cglibProxy;
  2.  
  3. public class Service {
  4. public void doSome(){
  5. System.out.println("SSSSSService");
  6. }
  7. }

代理对象:

  1. package cn.Spring.Day10cglibProxy;
  2.  
  3. import org.springframework.cglib.proxy.Enhancer;
  4. import org.springframework.cglib.proxy.MethodInterceptor;
  5. import org.springframework.cglib.proxy.MethodProxy;
  6.  
  7. import java.lang.reflect.Method;
  8.  
  9. public class ServiceTest {
  10. public static void main(final String[] args) {
  11. final Service service=new Service();
  12. Enhancer enhancer=new Enhancer();
  13. enhancer.setSuperclass(Service.class);
  14. enhancer.setCallback(new MethodInterceptor() {
  15. @Override
  16. public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
  17. System.out.println("写入日志");
  18. Object invoke = methodProxy.invoke(service, args);
  19. return invoke;
  20. }
  21. });
  22. Service o = (Service)enhancer.create();
  23. o.doSome();
  24.  
  25. }
  26. }

Spring 静态代理+JDK动态代理和CGLIB动态代理的更多相关文章

  1. java的静态代理、jdk动态代理和cglib动态代理

    Java的代理就是客户端不再直接和委托类打交道,而是通过一个中间层来访问,这个中间层就是代理.使用代理有两个好处,一是可以隐藏委托类的实现:二是可以实现客户与委托类之间的解耦,在不修改委托类代码的情况 ...

  2. 代理模式之静态代理,JDK动态代理和cglib动态代理

    代理模式,顾名思义,就是通过代理去完成某些功能.比如,你需要购买火车票,不想跑那么远到火车站售票窗口买,可以去附近的火车票代售点买,或者到携程等第三方网站买.这个时候,我们就把火车站叫做目标对象或者委 ...

  3. 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。

    基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别. 我还是喜欢基于Schema风格的Spring事务管理,但也有很多人在用基于@Tras ...

  4. Spring -- <tx:annotation-driven>注解基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)的区别。

    借鉴:http://jinnianshilongnian.iteye.com/blog/1508018 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional ...

  5. Spring <tx:annotation-driven>注解 JDK动态代理和CGLIB动态代理 区别。

    基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别. 我还是喜欢基于Schema风格的Spring事务管理,但也有很多人在用基于@Tras ...

  6. jdk动态代理和cglib动态代理底层实现原理详细解析(cglib动态代理篇)

    代理模式是一种很常见的模式,本文主要分析cglib动态代理的过程 1. 举例 使用cglib代理需要引入两个包,maven的话包引入如下 <!-- https://mvnrepository.c ...

  7. JDK动态代理和CGLib动态代理简单演示

    JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...

  8. jdk动态代理和cglib动态代理的区别

    一.原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 而cglib动态代理是利用asm开源包,对代理对象类的class文件 ...

  9. jdk 动态代理和 cglib 动态代理

    原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 而cglib动态代理是利用asm开源包,对代理对象类的class文件加载 ...

  10. 动态代理:jdk动态代理和cglib动态代理

    /** * 动态代理类:先参考代理模式随笔,了解代理模式的概念,分为jdk动态代理和cglib,jdk动态代理是通过实现接口的方式创建代理类的,cglib是通过继承类的方式实现的代理类的 * jdk动 ...

随机推荐

  1. BZOJ1270或洛谷1107 [BJWC2008]雷涛的小猫

    BZOJ原题链接 洛谷原题链接 \(DP\)水题. 定义\(f[i][j]\)表示小猫在高度\(i\),位于第\(j\)棵树时最多能吃到的柿子的数量.分为直接往下跳和跳到另一棵树两个决策. 那么很容易 ...

  2. Dynamics AX 中的图片处理

    1.从本地读取图片文件,并判断格式是否附合要求. FilenameFilter filter = [‘Image Files‘,‘*.bmp;*.jpg;*.gif;*.jpeg‘]; BinData ...

  3. ----regular expression in js----

    正则表达式:Regular Expression,在代码中常简写为regex.regexp或RE)使用单个字符串来描述.匹配一系列符合某个句法规则的字符串搜索模式. 搜索模式可用于文本搜索和文本替换. ...

  4. 微信for linux

    http://blog.csdn.net/sunxiang_520/article/details/51637551

  5. java -相关技术

    地址:      http://www.codeyyy.com/java/11-35-52.html

  6. #pragma常用预处理指令

    #pragma pack(1):1字节对齐#pragma once:指定头文件被编译一次#pragma message("message"):编译时输出message文本#prag ...

  7. Unity3D编辑器扩展(五)——常用特性(Attribute)以及Selection类

    前面写了四篇关于编辑器的: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)——使用GUI绘制窗口 Unity3D ...

  8. Unity加载外部图片

    在这里记录一下在 Unity3D 中分别使用 WWW 和 IO 流加载外部图片 使用 WWW 加载 /// <summary> /// 使用 WWW 加载图片,并赋值给 _rawImage ...

  9. eclipse新建的项目,也添加到tomcat上了,地址栏访问的时候就是访问不到。。。怎么办

    其实是可以访问的,目前我遇到以下两种可能出现这种现象的原因: 1.这个项目在你写的过程中改了名字,这样你访问改后的名字是不行的,需要在下图,也就是server服务器的server.xml文件中修改访问 ...

  10. Kotlin基础语法学习

    Kotline简介 Kotlin是一门与Swift类似的静态类型JVM语言,由JetBrains设计开发并开源.与Java相比,Kotlin的语法更简洁.更具表达性,而且提供了更多的特性,比如,高阶函 ...