动态代理

详解 Java 中的三种代理模式!

你离开我真会死。 提交于 2020-03-27 15:25:35
作者:岑宇 https://www.cnblogs.com/cenyu/p/6289209.html 代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法. 举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理人(经纪人)来解决.这就是代理思想在现实中的一个例子. 用图表示如下: 代理模式的关键点是:代理对象与目标对象.代理对象是对目标对象的扩展,并会调用目标对象. 1.1.静态代理 静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类. 下面举个案例来解释: 模拟保存动作,定义一个保存动作的接口:IUserDao.java,然后目标对象实现这个接口的方法UserDao.java,此时如果使用静态代理方式,就需要在代理对象(UserDaoProxy.java)中也实现IUserDao接口.调用的时候通过调用代理对象的方法来调用目标对象. 需要注意的是

AOP的底层实现-CGLIB动态代理和JDK动态代理

大城市里の小女人 提交于 2020-03-27 14:48:57
AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础。它是一种面向切面编程的思想。关于AOP的基础知识,相信多数童鞋都已经了如指掌,我们就略过这部分,来讲解下AOP的核心功能的底层实现机制:如何用动态代理来实现切面拦截。 AOP的拦截功能是由java中的动态代理来实现的。说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执行。不同的切入时机对应不同的Interceptor的种类,如BeforeAdviseInterceptor,AfterAdviseInterceptor以及ThrowsAdviseInterceptor等)。 那么动态代理是如何实现将切面逻辑(advise)织入到目标类方法中去的呢?下面我们就来详细介绍并实现AOP中用到的两种动态代理。 AOP的源码中用到了两种动态代理来实现拦截切入功能:jdk动态代理和cglib动态代理。两种方法同时存在,各有优劣。jdk动态代理是由java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。还有一点必须注意

Spring AOP面向切面编程

独自空忆成欢 提交于 2020-03-27 10:59:28
目录 1.AOP概览 2.Spring AOP的使用举例 PointCut切入点 Advice通知 3.Spring AOP的实现原理 3.1运行时织入 3.1.1代理模式 3.1.2 JDK动态代理 3.1.3 cglib动态代理 3.1.4 Spring如何创建代理bean ProxyFactoryBean的getObject()方法 getSingletonInstance()方法 createAopProxy() DefaultAopProxyFactory的createAopProxy()方法 getProxy(aopProxy) JdkDynamicAopProxy.getProxy()方法 ObjenesisCglibAopProxy.getProxy()方法 4.Spring AOP的实现原理 4.1 链式调用 4.1.1 职责链模式 4.1.1.1 V1 4.1.1.2 V2 4.1.2 Spring内部实现 1)拦截器链是如何生成的 2)拦截器链是如何链式调用的 3)Spring使用职责链模式实现拦截器链链式调用 5. ProxyFactory实现AOP 1.AOP概览 AOP(Aspect Oriented Programming),什么是面向切面编程? 1)AOP是一种编程范式,不是编程语言 编程范式概览 面向过程编程 面向对象编程 函数式编程 事件驱动编程

Spring的两种动态代理:Jdk和Cglib 的区别和实现

让人想犯罪 __ 提交于 2020-03-25 20:43:46
https://www.cnblogs.com/leifei/p/8263448.html 一、原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。 1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 如何强制使用CGLIB实现AOP? (1)添加CGLIB库,SPRING_HOME/cglib/*.jar (2)在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/> JDK动态代理和CGLIB字节码生成的区别? (1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类 (2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法 因为是继承,所以该类或方法最好不要声明成final 二、代码实现 用户管理接口 package com.lf.shejimoshi.proxy.entity; //用户管理接口

JDK动态代理和Cglib的动态代理

匆匆过客 提交于 2020-03-24 13:37:14
3 月,跳不动了?>>> 最简单的是静态代理方法,即代理模式,这里就不多啰嗦了。。 重点说一下JDK的动态代理和Cglib的动态代理吧 先说JDK的,需要被代理的类需要有接口,否则无法实现 package proxy.dynamic; public interface IBook { void add(); } 实现接口的类如下 package proxy.dynamic; public class Book implements IBook { @Override public void add() { System.out.println("Add Method!"); } } 创建一个代理类,需要实现一个接口InvocationHandler接口,里面有一个invoke方法需要实现 同时创建一个生成实例的方法 package proxy.dynamic; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class BookProxy implements InvocationHandler{ private Object target; public Object bind(Object

Java动态代理之一CGLIB详解

我的未来我决定 提交于 2020-03-24 09:59:33
在上篇文章《 Java代理模式及动态代理详解 》中我们介绍了Java中的静态代理模式与动态代理模式,并以JDK原生动态代理作为示例进行讲解。本篇文章我们来介绍一下基于CGLIB实现的动态代理,并与原生动态代理进行对比。 CGLIB介绍 CGLIB(Code Generation Library)是一个开源、高性能、高质量的Code生成类库(代码生成包)。 它可以在运行期扩展Java类与实现Java接口。Hibernate用它实现PO(Persistent Object 持久化对象)字节码的动态生成,Spring AOP用它提供方法的interception(拦截)。 CGLIB的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。但不鼓励大家直接使用ASM框架,因为对底层技术要求比较高。 使用实例 首先,引入CGLIB的依赖: <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.5</version> </dependency> 这里我们以操作用户数据的UserDao为例,通过动态代理来对其功能进行增强(执行前后添加日志)。UserDao定义如下: public class UserDao { public void findAllUsers(){

JDK 动态代理

萝らか妹 提交于 2020-03-21 16:42:35
3 月,跳不动了?>>> JDK 代理 java中的代理是指某个对象的一个替代者,该替代者暂时担任了被代理对象的职责,代理对象包含了原始对象的所有方法,而且还有可能会附加一些额外的方法。代理对象就是在不破坏原始对象的前提下发挥和原始对象相同甚至更多的功能,Java中的代理分为静态代理和动态代理两种。 静态代理: 在为某个对象生成代理对象之前,就已经知道代理对象要实现的功能或者发挥的作用,那么只需要重新写一个代理类,该类和原始类实现了相同的接口,然后在代理类的方法中加入某些附加的处理操作,这种代理类对象的行为是确定的,所以称为静态代理。 public interface Eatable{ void eat(); } class Person implements Eatable{ public void eat(){ System.out.println("吃饭"); } } class ProxyPerson implements Eatable{ private Person person; public ProxyPerson(Person person){ this.person = person; } public void eat(){ System.out.println("吃饭之前先要洗手!"); person.eat(); } } 上述代码中

动态代理(JDK实现)

橙三吉。 提交于 2020-03-21 01:42:30
JDK 动态代理,针对 目标对象 的 接口 进行代理 ,动态生成 接口的实现类 !(必须有接口) public class ProxyDemo { //通过方法的返回值得到代理对象 方法参数是要增强的对象 public Object getProxyObject(final Object target) { Object proxyObj = Proxy.newProxyInstance( //调用Proxy类中的静态方法,创建代理对象 target.getClass().getClassLoader(), //参数1:目标对象的类加载器 target.getClass().getInterfaces(), //参数2:目标对象实现的接口 new InvocationHandler() { //匿名内部类的方式,回调方法,增强对象 @Override //在该方法中写逻辑代码,增强方法 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("前置增强"); Object result = method.invoke(target, args); System.out.println("后置增强"); return result; }

Spring Aop 代理

旧街凉风 提交于 2020-03-20 06:43:33
AOP 面向切面编程 底层就是 动态代理模式 代理模式是java中常用的设计模式。 特点为: 1 委托类和代理类有相同的接口,或共同的父类(保证使用一样的方法) 2 代理类为委托类负责处理消息,并将消息转发给委托类。 3 代理类并不是真正的实现者而是通过调用委托类的方法来实现功能。 代理 分为 静态代理和动态代理。 静态代理: 由程序员或者特定的工具自动生成了源代码,在程序运行之前 .class文件已经存在了。 静态代理实现时:需要一个接口和两个实现类(一个做目标对象,一个为代理对象)。 动态代理:在程序运行期间,通过反射的方法动态的创建出来的! 动态代理分为 GDK动态代理 和 Cglib动态代理。 GDK动态代理可以实现接口。 Cglib可以实现父类和接口。 静态代理 接口 public interface Subject { public void request(); } 实现类(目标对象) public class RealSubject implements Subject { public void request() { System.out.println("okokok"); } } 实现类(代理对象) public class ProxySubject implements Subject { public ProxySubject() { } private

Java 代理模式

断了今生、忘了曾经 提交于 2020-03-18 15:51:09
  在阎宏博士的《JAVA与模式》一书中开头是这样描述代理(Proxy)模式的:代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。   代理模式的结构   代理对象在客户端和目标对象之间起到中介的作用。   代理模式类图如下:      代理模式中的角色:   抽象对象角色:声明了目标对象和代理对象的共同接口,在使用目标对象的地方都可以使用代理对象。   目标对象角色:定义了代理对象代表的目标对象。   代理对象角色:代理对象内部有目标对象的引用,可以操作目标对象。      抽象对象角色: 1 public abstract class AbstractObject { 2 //操作 3 public abstract void operation(); 4 }   目标对象角色: 1 public class RealObject extends AbstractObject { 2 @Override 3 public void operation() { 4 //一些操作 5 System.out.println("一些操作"); 6 } 7 }   代理对象角色: 1 public class ProxyObject extends AbstractObject{ 2 RealObject realObject = new