动态代理

Java设计模式——代理模式

百般思念 提交于 2020-01-30 07:56:27
代理模式 学习目标 掌握代理模式的应用场景和实现原理。 应用场景 保护目标对象:客户并不知道对象是如何实现具体业务功能的,只要调用代理对象的接口就行了。 增强目标对象:在实现目标对象的业务功能之前或者之后做一些业务实现。 Spring-AOP 实现原理 静态代理:代理对象持有被代理对象的引用。由被代理对象实现目标业务。 动态代理:代理对象持有被代理对象的引用,代码运行产生一个新的 java 类,并被编译重新加载,然后在新的类中执行目标业务实现动态代理。 了解静态代理和动态代理的区别。 静态代理:被代理对象在代码中被写死了,不易扩展,适用于简单的业务,代码复用性不高,违背开闭原则。 动态代理:只要是实现了同一个接口的被代理类,都可以代理实现,实现了业务扩展。代码复用,遵循开闭原则。 了解 CGLib和JDK-proxy 的区别。 JDK-proxy 动态代理:实现了被代理对象的接口,生成新的class字节码,利用反射调用实现代理。 无法代理不实现代理业务接口的方法。 CGLib 动态代理:继承被代理对象,生成新的class字节码,通过 fastclass 机制调用实现代理。 无法代理被final关键字修饰的方法 代理模式的定义 为其他对象提供一种代理,以控制对这个对象的访问。代理对象在客户端和服务端起到中介的作用。是一种结构型 设计模式 。 静态代理 /** *

spring第三天(下)

此生再无相见时 提交于 2020-01-29 12:47:09
动态代理 专题 这里重新创建一个工程,分别实现基于接口和基于子类的动态代理, 模拟的是生产商(IProducer)和销售商(Producer)的功能,客户(Client)从销售商买商品,销售商从生产商买商品。 基于接口的动态代理 public interface IProducer { /** * 销售 * @param money */ public void saleProduct ( float money ) ; /** * 售后 * @param money */ public void afterService ( float money ) ; } public class Producer { /** * 销售 * @param money */ public void saleProduct ( float money ) { System . out . println ( "销售产品,并拿到钱:" + money ) ; } /** * 售后 * @param money */ public void afterService ( float money ) { System . out . println ( "提供售后服务,并拿到钱:" + money ) ; } } 这里实现的是销售售卖商品的功能,假设客户购买商品付了10000元

Java设计模式——代理模式

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-29 00:29:17
代理模式 学习目标 掌握代理模式的应用场景和实现原理。 应用场景 保护目标对象:客户并不知道对象是如何实现具体业务功能的,只要调用代理对象的接口就行了。 增强目标对象:在实现目标对象的业务功能之前或者之后做一些业务实现。 Spring-AOP 实现原理 静态代理:代理对象持有被代理对象的引用。由被代理对象实现目标业务。 动态代理:代理对象持有被代理对象的引用,代码运行产生一个新的 java 类,并被编译重新加载,然后在新的类中执行目标业务实现动态代理。 了解静态代理和动态代理的区别。 静态代理:被代理对象在代码中被写死了,不易扩展,适用于简单的业务,代码复用性不高,违背开闭原则。 动态代理:只要是实现了同一个接口的被代理类,都可以代理实现,实现了业务扩展。代码复用,遵循开闭原则。 了解 CGLib和JDK-proxy 的区别。 JDK-proxy 动态代理:实现了被代理对象的接口,生成新的class字节码,利用反射调用实现代理。 无法代理不实现代理业务接口的方法。 CGLib 动态代理:继承被代理对象,生成新的class字节码,通过 fastclass 机制调用实现代理。 无法代理被final关键字修饰的方法 代理模式的定义 为其他对象提供一种代理,以控制对这个对象的访问。代理对象在客户端和服务端起到中介的作用。是一种结构型设计模式。 静态代理 /** * @description

Spring---动态代理

心不动则不痛 提交于 2020-01-28 12:23:03
基于接口的动态代理 代理接口 package com . gsau . proxy ; /** * @ Author: WangGQ * @ Date: 2019/12/29 14:43 * @ Version: 1.0 * @ Description: 接口代理 */ public interface IProducer { void method1 ( String name ) ; void method2 ( int id ) ; } 接口实现类 package com . gsau . proxy . impl ; import com . gsau . proxy . IProducer ; import static java . lang . System . out ; /** * @ Author: WangGQ * @ Date: 2019/12/29 14:44 * @ Version: 1.0 * @ Description: 代理接口实现类 */ public class ProducerImpl implements IProducer { @Override public void method1 ( String name ) { out . println ( "ProducerImpl.java--method1--16-" + name +

java动态代理

℡╲_俬逩灬. 提交于 2020-01-27 23:30:09
静态代理是通过实现类去继承接口并实现接口方法来实现;而动态代理并没有这个实现类,动态代理在运行时通过Proxy.newProxyInstance()去动态创建接口对象,然后去调用接口方法。 通过Proxy.newProxyInstance()创建接口实例,该方法的主要源码如下(有删减),其实就是通过接口类和类加载器获得代理类,通过反射得到代理类的构造函数,进而创建一个对象出来。 /** * @param loader the class loader to define the proxy class * @param interfaces the list of interfaces for the proxy class * to implement * @param h the invocation handler to dispatch method invocations to @CallerSensitive public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) { final Class<?>[] intfs = interfaces.clone(); Class<?> cl = getProxyClass0

spring ioc和aop的含义

霸气de小男生 提交于 2020-01-27 12:03:50
自己整理的一些笔记,如有错误欢迎提出指正,谢谢 1.IOC的定义? IOC:另外一种说法叫DI(Dependency Injection),即依赖注入,是一种设计思想。 我们通过IOC将相互依赖对象的创建、协调工作交给Spring容器去处理,每个对象只需要关注其自身的业务逻辑关系就可以了。 作用是为了解耦,降低类之间的耦合度,其设计思想就是设计模式的工厂模式, 我们并不需要知道其生产的具体过程,我们只要其产出的对象即可。 其工作流程就是:在Spring容器启动的时候,Spring会把你在application.xml中配置好的bean都初始化, 在你需要调用的时候,把已经初始化的bean分配给你要调用这些bean的类,而不用去创建一个对象的实例。 2.IOC的传值方式有哪些? 一般的是设值传入和构造方法传入。 3.IOC的容器有哪些? 常见的一般是ApplicationContext和BeanFactory,这两个容器的区别请看这里: http://blog.csdn.net/hi_kevin/article/details/7325554 4.依赖注入的实现方式 就是Java的反射,通俗的来讲就是根据给出的类名来动态地生成对象,用set方法将事先保存在hashmap中的类属性注入到类中。 AOP: 面向切面编程,被定义为促使软件系统实现关注点的分离的技术。

代理模式-CGLIB动态代理

自古美人都是妖i 提交于 2020-01-27 03:04:23
1.JDK动态代理是实现了被代理对象的接口,Cglib是继承了被代理对象。 2.JDK和Cglib都是在运行期生成字节码,JDK是直接写Class字节码,Cglib使用ASM框架写Class字节码,Cglib代理实现更复杂,生成代理类比JDK效率低。 3.JDK调用代理方法,是通过反射机制调用,Cglib是通过FastClass机制直接调用方法。 CGLIB动态代理 : 使用JDK的Proxy实现代理,要求目标类与代理类实现相同的接口。若目标类不存在接口,则无法使用该方式实现。 但对于无接口的类,要为其创建动态代理类,就要使用CGLIB来实现。CGLIB代理的生成原理是生成目标类的子类,而子类是增强过的,这个子类对象就是代理对象。所以,使用CGLIB生成动态代理,要求目标类必须能够被继承,即不能是final的类。 CGLIB(Code Generation Library)是一个开源项目,是一个强大的、高性能的、高质量的代码生成类库。它可以在运行期扩展喝增强Java类。Hibernate用它来实现持久对象的字节码的动态生成,Spring用它来实现AOP编程。 CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM(Java字节码操控框架)来转换字节码并生成新的类。CGLIB是通过对字节码进行增强来生成代理的。 代理实现与解析: 使用CGLIB创建代理步骤: 步骤1

AOP与IOC区别

你。 提交于 2020-01-26 23:34:08
Spring核心知识 Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。 为什么说Spring是一个一站式的轻量级开源框架呢?EE开发可分成三层架构,针对JavaEE的三层结构,每一层Spring都提供了不同的解决技术。 • WEB层:SpringMVC • 业务层:Spring的IoC • 持久层:Spring的JDBCTemplate(Spring的JDBC模板,ORM模板用于整合其他的持久层框架) 从上面的简要介绍中,我们要知道Spring的核心有两部分: • IoC:控制反转

设计模式 - 装饰模式和代理模式

情到浓时终转凉″ 提交于 2020-01-26 03:58:17
参考博客: https://www.cnblogs.com/doucheyard/p/5737366.html https://www.cnblogs.com/zhengbin/p/5618564.html 参考以上博客作出的小总结 写完下面的内容之后的总结 : 要区分装饰模式和代理模式, 不能只从代码结构上区分, 而更要从两个模式的 使用目的 和 使用方式 区分 比如装饰器模式的目的, 是为了增强代码 , 为了让装饰之前的类具有更多的功能. 在使用方式上, 装饰器可以一层一层叠加使用 而代理模式 是为了控制对被代理的对象的访问的同时能使用其功能, 使用方式上, 使用者是看不到被代理的对象的 一. 装饰模式 装饰模式没有被装饰类的控制权, 装饰类只是将被装饰类的功能拓展, 两个类都实现同一接口, 也就是装饰类可以装饰实现了这一接口的任何其他类 装饰器模式的特点就是, 我们常常将被装饰类作为参数传递进装饰器中, 如IO流的各种装饰器类 这里我们举个栗子: (1) 首先实现一个女孩接口, 她有一个特点就是漂亮 public interface Girl { void beauty(); } (2)然后你的女朋友实现了这个接口, 而且你女票长得很漂亮 public class GirlFriend implements Girl { @Override public void

java代理机制

陌路散爱 提交于 2020-01-26 03:56:38
Table of Contents 1 引言 2 常见的代理 3 代理模式UML图 4 代理模式实例 5 java动态代理 5.1 java动态代理UML图 6 代理模式与装饰者模式的区别 6.1 装饰者模式UML图 6.2 形象说明 1 引言 我们书写执行一个功能的函数时,经常需要在其中写入与功能不是直接相关但很有必要的代 码,如日志记录,信息发送,安全和事务支持等,这些枝节性代码虽然是必要的,但它会带 来以下麻烦: 枝节性代码游离在功能性代码之外,它下是函数的目的,这是对OO是一种破坏 枝节性代码会造成功能性代码对其它类的依赖,加深类之间的耦合,而这是OO系统所竭 力避免的 枝节性代码带来的耦合度会造成功能性代码移植困难,可重用性降低 从法理上说,枝节性代码应该`监视'着功能性代码,然后采取行动,而不是功能性代码 `通知'枝节性代码采取行动,这好比吟游诗人应该是主动记录骑士的功绩而不是骑士主 动要求诗人记录自己的功绩 2 常见的代理 毫无疑问,枝节性代码和功能性代码需要分开来才能降低耦合程度,符合现代OO系统的要 求,我们可以使用代理模式完成这个要求。 代理模式的作用是:为其它对象提供一种代理以控制对这个对象的访问。在某些情况下,一 个客户不想直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介作用。 代理模式一般涉及到三个角色: 抽象角色