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

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

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

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

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

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

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

静态代理:

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

//抽象主题
public interface Subject {
public void request();
}

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

//真实主题
public class RealSubject implements Subject{
@Override
public void request() {
System.out.println("Subject RealSubject");
}
}

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

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

JDK动态代理:

  接口:

package cn.Spring.Day14JDKproxy;

public interface ISomeService {
public void request();
}

  目标对象:

package cn.Spring.Day14JDKproxy;

public class SomeService implements ISomeService {
@Override
public void request() {
System.out.println("977+7777");
}
}

  代理对象:

package cn.Spring.Day14JDKproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class JdkProxy {
public static void main(String[] args) {
/*
* 1.使用Proxy点出newProxyInstance方法 方法有三个参数
* ClassLoader loader, 类加载器类型的一个对象
* Class<?>[] interfaces,接口数组对象
* InvocationHandler h InvocationHandler 对象
* 2.实例化目标对象 目标对象去传入参数。
* 3.invoke方法中使用method.invoke传入目标对象,和参数数组。
*
*
* */
final SomeService ss=new SomeService();
ISomeService proxy = (ISomeService)Proxy.newProxyInstance(ss.getClass().getClassLoader(), ss.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("我是增强666666");
method.invoke(ss,args);
return null;
}
});
proxy.request();
}
}
newProxyInstance要传的参数

invoke要传的参数

CGLIB动态代理:

目标对象:

package cn.Spring.Day10cglibProxy;

public class Service {
public void doSome(){
System.out.println("SSSSSService");
}
}

代理对象:

package cn.Spring.Day10cglibProxy;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class ServiceTest {
public static void main(final String[] args) {
final Service service=new Service();
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(Service.class);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("写入日志");
Object invoke = methodProxy.invoke(service, args);
return invoke;
}
});
Service o = (Service)enhancer.create();
o.doSome(); }
}

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. css3(display)

    实现下拉 <!DOCTYPE html><html><head> <meta charset="utf-8"> <style ...

  2. 颜色16进制转为RGB格式

    <script> 2 function getRGB(str){ var arr = str.split(""); var myred = arr[1]+arr[2]; ...

  3. nginx集成环境下载

    https://visual-nmp.en.softonic.com/download

  4. Windows操作系统发展历程

    1964年贝尔实验室(Bell).麻省理工学院(MIT)及美国通用电气公司(GE)为了开发出一套安装在大型主机上多人多工的操作系统开发了Multics系统.Multics是一个全面的,通用编程系统.后 ...

  5. mysql传统主从配置与主从监控

    主从简介 在现代企业中,数据显得尤为重要,而存储数据的数据库选择又五花八门,但无论是何种数据库,均存在着一种隐患. 当数据规模非常大,读写量也很高时,一台数据库已经无法负担全部读写任务,就需要多台数据 ...

  6. PostgreSQL uuid

    --执行一 create extension "uuid-ossp" --执行二 select uuid_generate_v4()

  7. 对 JSON 数据进行序列化和反序列化

    如何:对 JSON 数据进行序列化和反序列化 2017/03/30 作者 JSON(JavaScript 对象符号)是一种高效的数据编码格式,可用于在客户端浏览器和支持 AJAX 的 Web 服务之间 ...

  8. resin4配置之一个resin下多个app的正确配置方法

    可能是因为resin4出来不久的原因,很多人对一个resin配置多个app不是很了解,经过几个小时的研究,有了一些小的成果,在此分享一下: 在开发的时候很多人习惯了一个resin下配置多个app,习惯 ...

  9. Python类——面向对象

    一.有关面向对象的一些知识 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” ...

  10. Git和Eclipse的使用、上传、部署

    https://www.jianshu.com/p/812717c740a2 https://blog.csdn.net/lynn_Kun/article/details/73740400 https ...