动态代理

java设计模式-代理模式

杀马特。学长 韩版系。学妹 提交于 2020-01-26 03:54:13
1.代理(proxy)模式的定义 给某一个对象提供一个代理,并由代理对象控制对原对象的引用。 代理模式主要分为 静态代理 和 动态代理 。 2.代理模式的主要优缺点 优点: 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用; 代理对象可以扩展目标对象的功能; 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度; 缺点: 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢; 增加了系统的复杂度; 3.代理模式的主要角色 抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。 真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。 4.代理模式的结构图 5. 代理模式的实现,以买票为例 静态代理:由程序员编写的代理类,并在程序运行前就编译好了。 动态代理:代理类在程序运行时创建的代理方式被成为动态代理。 5.1 静态代理 创建买票接口 package com.lw.designpattern.proxy.staticproxy; /** * @Classname Ticket * @Description 买票接口 * @Author

AOP的动态代理机制

吃可爱长大的小学妹 提交于 2020-01-26 02:45:34
在java的动态代理机制中,有两个重要的类或接口,一个是InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。 代理模式的设计思想:是通过代理的方式避免暴露被代理对象或者说代理不容易被取得的对象 public class CalculatorProxy { /** * 为传入的参数对象创建一个动态代理对象 * @param calculator 参数对象 * @return 动态代理对象 */ public static Object getProxy ( final Calculator calculator ) { /* * Proxy:为目标对象创建代理对象;相当于Proxy也是实现了Calculator接口 * * 参数 * loader:目标对象的类加载器 * interfaces:目标对象实现的所有接口;如果没有实现任何接口,就会报错 * InvocationHandler:方法执行器对象 */ return Proxy . newProxyInstance ( calculator . getClass ( ) . getClassLoader ( ) , calculator . getClass ( ) . getInterfaces ( ) , new

Spring AOP的实现机制

北城余情 提交于 2020-01-26 02:33:01
AOP(Aspect Orient Programming),一般称为面向切面编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理,日志,缓存等等.AOP 实现的 关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。静态代理是编译期实现,动态代理是运行期实现,可想而知前者拥有更好的性能。 本文主要介绍Spring AOP的两种代理实现机制,JDK动态代理和CGLIB动态代理。 静态代理是编译阶段生成AOP代理类,也就是说生成的字节码就织入了增强后的AOP对象;动态代理则不会修改字节码,而是在内存中临时生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。 Spring AOP中的动态代理主要有两种方式, JDK动态代理 和CGLIB动态代理.JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口.JDK动态代理的核心是InvocationHandler接口和代理类。 如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类.CGLIB(代码生成库),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理

spring原理

坚强是说给别人听的谎言 提交于 2020-01-25 15:30:18
spring原理 一、spring原理 内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xml Spring的配置文件来动态的创建对象,和调用对象里的方法的 。 Spring还有一个核心就是AOP这个就是面向切面编程,可以为某一类对象 进行监督和控制(也就是 在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过 配置类达到的。 Spring目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的(Spring根据这些配置 内部通过反射去动态的组装对象) 要记住:Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。 Spring里用的最经典的一个设计模式就是:模板方法模式。(这里我都不介绍了,是一个很常用的设计模式), Spring里的配置是很多的,很难都记住,但是Spring里的精华也无非就是以上的两点,把以上两点跟理解了 也就基本上掌握了Spring。 二、Spring AOP与IOC 1、 IoC(Inversion of control): 控制反转 概念:控制权由对象本身转向容器

Spring AOP中的动态代理

我怕爱的太早我们不能终老 提交于 2020-01-25 14:47:33
0 前言 1 动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2 Spring AOP中的动态代理机制 2.1 JdkDynamicAopProxy 2.2 CglibAopProxy 3 总结 0 前言 前一个季度旅游TDC的Thames服务有几次宕机,根据组内原因认真查找发现是数据库事务造成的,后来把服务中的事务配置全部去掉,服务恢复正常。根据这次教训,虽然现在还是很难确定是哪一个方面的真正原因,但是激发了我学习Spring事务方面的兴趣。而Spring事务的实现是根据AOP来实现的,对于我这个小菜鸟,只能一步一步来了,决定先从Spring的AOP开始。 1 动态代理 Spring AOP中使用了两种动态代理,一种是JDK的动态代理,一种CGLIB的动态代理。JDK的动态代理必须指定接口,这些接口都是已经被代理对象实现了的;而CGLIB代理则不需要指定接口。 1.1 JDK动态代理 JDK的动态代理网上有很多资料,这里只说我自己的理解。 JDK动态代理必须实现InvocationHandler接口,然后通过Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)获得动态代理对象。

java的静态代理和动态代理(jdk、cglib)

那年仲夏 提交于 2020-01-25 04:35:44
一、代理模式 代理的概念来自于设计模式中的代理模式,先了解一下代理模式 1、结构图 2、参与者 Subject:接口,定义代理类和实际类的共用接口 RealSubject:实际类,实现Subject这个接口 Proxy:代理类,实现Subject这个接口,内部引用一个RealSubject实际类 3、描述 Proxy实现了Subject接口,内部引用一个RealSubject实际类,RealSubject能做的Proxy都会 于是Proxy代替了RealSubject,实例化到Subject里交给客户端调用,而客户端不知道自己实际用的是谁 客户端调用了Subject接口中的Request()方法,实际上访问的是Proxy Proxy类提供了一个客户端对RealSubject的间接性访问的过程,在这个过程中可以做很多的控制 4、意图 控制对象的访问 5、应用场景 虚代理:根据需要来创建开销很大的对象,该对象只有在需要的时候才会被真正创建 远程代理:用来在不同的地址空间上代表同一个对象,这个不同的地址空间可以是在本机,也可以在其他机器上,在java里面最典型的就是RMI技术 copy-on-write代理:在客户端操作的时候,只有对象确实改变了,才会真的拷贝(或克隆)一个目标对象,算是虚代理的一个分支 保护代理:控制对原始对象的访问,如果有需要,可以给不同的用户提供不同的访问权限

jdk 动态代理的原理

余生颓废 提交于 2020-01-25 04:33:48
一、代理设计模式 代理设计模式是Java常用的设计模式之一。 特点: 01.委托类和代理类有共同的接口或者父类; 02.代理类负责为委托类处理消息,并将消息转发给委托类; 03.委托类和代理类对象通常存在关联关系,一个代理类对象与一个委托类对象关联; 04.代理类本身不是真正的实现者,而是通过调用委托类方法来实现代理功能; 二、静态代理与动态代理 按照代理类创建的时机,代理类分为两种: 01.静态代理: 由我们程序猿或者特定的工具自动生成了源代码,在程序运行之前,class文件已经存在了 ;例如在serviceImpl.java中调用dao.xx(),真正的实现者是dao,service就可以理解为一个代理类; 02.动态代理: 在程序运行期间,通过反射创建出来的代理类 ; 三、jdk动态代理 顾名思义,这种方式是由jdk为我们提供的。下面通过一个例子来演示。 01.创建一个Person接口 public interface Person { void eat(); void sleep(); } 02.创建ZhangSan.java实现Person接口 public class ZhangSan implements Person { public void eat() { System.out.println("吃饭..."); } public void sleep() {

JDK自带动态代理代码逻辑实现

拈花ヽ惹草 提交于 2020-01-25 01:50:53
实现一个计算器工具,定义IMathCalcultor接口,只开发求和,求差两个功能接口。需求:在每次使用方法前后 都要输出日志内容。这里利用JDK动态代理方式之一 -- 通过实现invocationHandle接口来实现这个需求,闲话不多说直接上代码。 package com.travelsky.falcon.controller.testPackage; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Arrays; public class MyProxy { public static void main(String[] args){ //创建被代理的对象,注意被代理的对象是不可变对象 所以用final修饰 final IMathCalcultor math = new MathCalcultorImpl(); //创建一个代理对象(入参说明:1.类加载器要与被代理的对象类加载器一致;2.被代理对象的接口;3.实现InvocationHandler接口的invoke方法,通常写内部类来实现) Object newProxyInstance = Proxy

Spring AOP通俗理解与应用

笑着哭i 提交于 2020-01-23 13:21:04
目录 AOP 图解AOP 概念 通俗理解AOP 作用 实现方式 应用场景 应用 Aop与SpringAOP的关系   关于AOP,一般都会先去了解AOP的基础概念,如切点、通知、连接点、切入点 、引入和织入等,面对晦涩难懂的概念,很容易陷入困境,找了几篇讲解较好的文章,将其整合起来,帮助深入理解AOP AOP   AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容(Spring核心之一),是函数式编程的一种衍生范型。 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 作用   为了更清晰的逻辑,可以让你的业务逻辑去关注自己本身的业务,而不去想一些其他的事情,这些其他的事情包括:安全,事物,日志等。 图解 传统的纵向体系代码复用: 横向抽取机制(AOP思想): 概念 1.通知(Advice)   就是你想要的功能,也就是上面说的安全,事务,日志等。你得先定义好把,然后在想用的地方用一下。 2.连接点(JoinPoint)   这个更好解释了,就是spring允许你使用通知的地方,那可真就多了,基本每个方法的前,后

动态代理设计模式,及实现原理

こ雲淡風輕ζ 提交于 2020-01-22 23:58:29
动态代理模式,前提还是代理模式,只是优化了静态代理的一些不足。 比如,静态代理在一对一关系出现时,创建的代理对象较多,代码量也大,可维护性就会稍差,在一对多的代理关系出现是,可扩展性就更差了。 而动态代理,就是在使用时,才去创建代理类和实例,这样就可以通过一个动态代理类解决创建多个静态代理的问题,更灵活了。 当然动态代理的缺点也是有的,就是相比静态代理直接调用目标对象方法,动态代理效率会低,因为它是通过反射机制,间接调用目标方法的。 所以,在讨论动态代理前,需要先说说静态代理,及反射。 先说反射,通常对一个类对象执行操作时,都要先知道它是什么类,是做什么的,然后去实例化 对象进行操作。 但是,反射则是一开始不知道要初始化的类是什么,无法使用new关键字来创建对象。而是在运行时才知道要操作的类是什么,可以在运行时获取类的完整构造,并调用对应的方法,访问属性。 那反射跟运行时类信息(RTTI)有什么区别呢? 运行时类型识别(Run-Time Type Identification),使得可以在程序运行时发现和使用类型信息。 Java有两种方式可以让我们在运行时识别对象和类的信息,一种是RTTI,它假定在编译时已经知道了所有的类型;另一种就是反射,允许在运行时发现和使用类信息。 RTTI的基本使用 package rtti; import java.util.Arrays; import