动态代理

Java 动态代理

≯℡__Kan透↙ 提交于 2020-02-17 14:52:03
1、前言   java中代理方式分为静态代理和动态代理,静态代理的代理关系在编译时就确定了,它需要为每一个目标类创建一个代理类,在代理类数量较少时可以选择使用。当代理类较多时,需要使用动态代理,动态代理相对来说提供了很大的灵活性,以下讲解下动态代理的两种实现方式,即 JDK原生动态代理和CGLIB动态代理 。 2、 JDK原生动态代理 2.1 示例代码 定义接口: public interface Fruit { String name(final String name); double price(double price); } 实现接口的具体代理对象类: public class Apple implements Fruit { @Override public String name(String name) { System.out.println("this is " + name); return name; } @Override public double price(double price) { System.out.println("Apple price is " + price); return price; } } 定义实现接口InvocationHandler的类: public class FruitDynamicProxy implements

Cglib动态代理

*爱你&永不变心* 提交于 2020-02-16 21:32:49
JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。 委托类: package com.reflect.proxy; public class GunDog1 { public void info() { System.out.println("我是一只美丽的猎狗"); } public void run() { System.out.println("我非常的奔跑迅速"); } } 通用的方法: package com.reflect.proxy; public class DogUtil { public void method1(){ System.out.println("=====模拟第1个通用方法======"); } public void method2(){ System.out.println("=====模拟第2个通用方法======"); } } 代理类“: interceptor(Object obj,Method method,Object[] args ,MethodProxy

Java动态代理的实现方法

一世执手 提交于 2020-02-16 20:57:34
AOP的拦截功能是由java中的动态代理来实现的。说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执行。不同的切入时机对应不同的Interceptor的种类,如BeforeAdviseInterceptor,AfterAdviseInterceptor以及ThrowsAdviseInterceptor等)。 那么动态代理是如何实现将切面逻辑(advise)织入到目标类方法中去的呢?下面我们就来详细介绍并实现AOP中用到的两种动态代理。 AOP的源码中用到了两种动态代理来实现拦截切入功能:jdk动态代理和cglib动态代理。两种方法同时存在,各有优劣。jdk动态代理是由 Java 内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。还有一点必须注意:jdk动态代理的应用前提,必须是目标类基于统一的接口。如果没有上述前提,jdk动态代理不能应用。由此可以看出,jdk动态代理有一定的局限性,cglib这种第三方类库实现的动态代理应用更加广泛,且在效率上更有优势。。 1、定义接口和实现 package com

Spring AOP(面向切面编程)

一曲冷凌霜 提交于 2020-02-16 02:49:20
1.Spring 的 AOP 简介 1.1 什么是 AOP AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 AOP 是 OOP 的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 1.2 AOP 的作用及其优势 作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强 优势:减少重复代码,提高开发效率,并且便于维护 1.3 AOP 的底层实现 实际上,AOP 的底层是通过 Spring 提供的的动态代理技术实现的。在运行期间,Spring通过动态代理技术动态的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能的增强。 1.4 AOP 的动态代理技术 常用的动态代理技术 JDK 代理 : 基于接口的动态代理技术 cglib 代理:基于父类的动态代理技术 1.5 JDK 的动态代理 ①目标类接口 public interface TargetInterface { public void method ( ) ; } ②目标类 public class

Spring 的学习6_______静态代理和动态代理(AOP的底层实现原理)

六眼飞鱼酱① 提交于 2020-02-15 14:41:15
代理模式可分为静态代理,动态代理。 1.静态代理: 静态代理的角色分析: 1.真实对象; 2.代理真实对象的对象(代理对象)一般会添加一些附加的操作; 3.真实对象和代理对象抽象出来的公共部分(一般为抽象类或者接口); 4.用户(通过代理对象来调用真实对象的方法)。 静态代理的一个代码案例: 情景模型:你(用户)通过租房中介(代理对象)从房东(真实对象)进行租房的活动。 真实对象(Host) //真实对象 public class Host implements Rent { public void rent() { System.out.println("Host 租房子啦!"); } } 代理对象: //代理对象 public class Proxy implements Rent { private Host host; public Proxy(Host host) { this.host = host; } public void rent() { lookHouse(); host.rent(); fare(); } //代理对象添加的额外的操作 public void lookHouse(){ System.out.println("带你一起去看看房子!"); } public void fare(){ System.out.println("交易结束,请按时付款!"

Spring框架的AOP编程,最通俗的语言解释,易懂易学

家住魔仙堡 提交于 2020-02-13 08:22:41
第七章:AOP技术 前言: AOP技术是根据动态代理设计模式进行的技术。动态代理技术分jdk动态代理和cglib动态代理 jdk动态代理特点: (1)继承java.lang.reflect.proxy类 (2)实现了真实类实现的接口 (3)真实类和代理类之间的关系是:他们都实现了相同的接口 cglib动态代理特点: 特点: (1)代理类是真实类的子类 注:本片文章主要理解AOP编程,至于动态代理技术不做过多介绍,有需要的话,可以留言,下篇文章可以进行讲解。 7.1:AOP原理概述 AOP:Aspect Oriented Programming,面向切面编程 传统形式,web项目执行流程: 缺点: (1) Bad Smell现象 ,指一些代码逻辑出现了在了不合适的层次。 例如:在service层有数据库的事务处理代码,不合乎规范 改进: AOP 编程: 本质上,属于动态代理设计模式 切面编程: 类似于在链式程序指定流程中,在service层处进行截断,此处的断层成为切面,此处的service处的程序运行为竖向,可以看作service层的强化操作。 概念: (1)Point(切点): 表示要对哪个方法进行增强 (2)Advice(通知): 表示额外增加的功能 (3)Aspect(切面): 就是代理对象,(切面+切点) (4)Weaving(织入): 将通知添加到切点中的操作

Java实现动态代理的两种方式

大城市里の小女人 提交于 2020-02-12 03:05:20
一般而言,动态代理分为两种,一种是JDK反射机制提供的代理,另一种是CGLIB代理。在JDK代理,必须提供接口,而CGLIB则不需要提供接口,在Mybatis里两种动态代理技术都已经使用了,在Mybatis中通常在延迟加载的时候才会用到CGLIB动态代理。 1.JDK动态代理: public interface Rent { public void rent(); } public class Landlord implements Rent{ @Override public void rent() { System.out.println("房东要出租房子了!"); } } import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class Intermediary implements InvocationHandler{ private Object post; Intermediary(Object post){ this.post = post; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object

设计模式:代理模式

馋奶兔 提交于 2020-02-11 14:21:40
   代理模式:为另一个对象提供一个替身或占位符以访问这个对象。   在我们学习代理模式之前,我们先了解下代理模式中的三个角色。 抽象角色:声明真实对象和代理对象的共同接口。      代理角色:代理对象角色内部含有真实对象的引用,从而可以操作真实对象。 同时代理对象提供与真实对象相同的接口,以便任何时刻都能替代真实对象。并且代理对象可以在执行真实对象操作时,附加自己的操作。 真实角色:代理角色所代表的的真实角色,使我们最终要引用的对象,也是代理对象内部引入的对象。   其中代理分为静态代理和动态代理,什么是静态代理什么是动态代理呢,下面我们通过例子来看看   在我们刚开学学习jdbc操作数据库的时候,业务每个方法都需要进行三步:1.打开数据库连接 2.执行我们想要的操作 3.关闭数据库连接,其实我们主要是在第二步,而每次都需要执行重复的第一步第二步就显得很麻烦不够纯粹了,这时候我们就可以利用代理,把这件事情交给代理来做。看下代码的实现 //一个业务层的接口,里面我们就定义一个方法 public interface UserService { public void saveUser(); } //业务层实现类 public class UserServiceImpl implements UserService{ @Override public void saveUser()

java动态代理的实现以及原理

不羁岁月 提交于 2020-02-11 11:54:46
1.前言 之前对动态代理的技术只是表面上理解,没有形成一个体系,这里总结一下,整个动态代理的实现以及实现原理,以表述的更清楚一些。 2.动态代理的实现应用到的技术 1、动态编译技术,可以使用Java自带的JavaCompiler类,也可以使用CGLIB、ASM等字节码增强技术,Java的动态代理包括Spring的内部实现貌似用的都是这个 2、反射,包括对于类.class和getClass()方法的理解,Method类、Constructor类的理解 3、IO流,主要就是字符输出流FileWriter 4、对于ClassLoader的理解 3.动态代理示例 接口类: public interface UserService { public abstract void add(); public abstract void update(); } 接口实现类: public class UserServiceImpl implements UserService { public void add() { System.out.println("----- add -----"); } public void update(){ System.out.println("----- update-----"); } } 代理处理类MyInvocationHandler.java

JDK动态代理实现机制

故事扮演 提交于 2020-02-11 09:41:45
===========================================     原文链接: JDK动态代理实现机制 转载请注明出处! =========================================== 本文只对JDK动态代理的底层实现进行分析,如需了解代理模式和动态代理的使用请移步: 设计模式—代理模式 动态代理的两种实现方式(JDK/Cglib) 在读代码之前先清楚两个概念:   1、Class类存储的是类的所有信息,包括类的所有方法、属性、实现接口等。每个类对应一个Class对象(单例),Class对象是由classLoader加载出来的,使用双亲委派模型来保证class只会被加载一次。   2、classLoader在加载类的时候不管class文件是从哪里来的,无论是从.class文件、网络、数据库类加载器都不关心。他只关心给他的class二进制流是不是能够通过校验。 说明:以下测试代码和 动态代理的两种实现方式(JDK/Cglib) 相同 使用JDK动态代理需要实现 InvocationHandler 接口,同时实现invoke()方法。 package com.zpj.proxy.jdk; import java.lang.reflect.InvocationHandler; import java.lang.reflect