动态代理

【设计模式自习室】详解代理模式

怎甘沉沦 提交于 2020-01-22 19:26:02
前言 《设计模式自习室》系列,顾名思义,本系列文章带你温习常见的设计模式。主要内容有: 该模式的 介绍 ,包括: 引子、意图(大白话解释) 类图、时序图(理论规范) 该模式的 代码示例 :熟悉该模式的代码长什么样子 该模式的 优缺点 :模式不是万金油,不可以滥用模式 该模式的 应用案例 :了解它在哪些重要的源码中被使用 该系列会逐步更新于我的博客和公众号(博客见文章底部),也希望各位观众老爷能够关注我的个人公众号: 后端技术漫谈 ,不会错过精彩好看的文章。 系列文章回顾 【设计模式自习室】开篇:为什么我们要用设计模式? 【设计模式自习室】建造者模式 【设计模式自习室】原型模式 【设计模式自习室】透彻理解单例模式 【设计模式自习室】理解工厂模式的三种形式 【设计模式自习室】适配器模式 【设计模式自习室】装饰模式 【设计模式自习室】桥接模式 Bridge Pattern:处理多维度变化 【设计模式自习室】门面模式 Facade Pattern 【设计模式自习室】享元模式 Flyweight Pattern:减少对象数量 结构型——代理模式 Proxy Pattern 引子 通俗的来讲,代理模式就是我们生活中常见的 中介 。在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。 为什么要用代理模式 中介隔离作用 :在某些情况下

Spring常见面试题总结(超详细回答)

走远了吗. 提交于 2020-01-22 09:10:26
1、Spring是什么? Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置。 主要由以下几个模块组成: Spring Core:核心类库,提供IOC服务; Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等); Spring AOP:AOP服务; Spring DAO:对JDBC的抽象,简化了数据访问异常的处理; Spring ORM:对现有的ORM框架的支持; Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传; Spring MVC:提供面向Web应用的Model-View-Controller实现。 2、Spring 的优点? (1)spring属于低侵入式设计,代码的污染极低; (2)spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性; (3)Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用。 (4)spring对于主流的应用框架提供了集成支持。 3、Spring的AOP理解: OOP面向对象,允许开发者定义纵向的关系

Java动态代理(invocation handler、cglib)简析

痞子三分冷 提交于 2020-01-21 18:46:43
What 代理模式 Java的一种设计模式, 他的特征是与委托类有相同的接口,但是并不具体实现真正的服务 作用: 消息预处理 过滤消息 把消息转发给委托类 消息的事后处理 代理的分类: 静态代理:把已存在的编译文件重新编译 动态代理:在程序运行的时候通过反射机制动态创建 JAVA的动态代理主要是: JDK自带的proxy cglib (code generation library) 什么是ASM? 一个字节码操控框架,可以增强既有类的功能、生成新的类。 JAVA class被描述成一棵树, asm使用 visitor模式 来遍历整个二进制结构 JDK-InvocationHandler 委托类必须实现接口,不能代理普通类(没有接口的类) 代理类必须实现InvocationHandler的接口,例子如下: public Object invoke ( Object proxy , Method method , Object [ ] args ) throws Throwable { //do something before //execute, target is the real implemation class(Delegate) result = method . invoke ( target , args ) ; //do something after

JAVA实现代理模式的3种方式

≯℡__Kan透↙ 提交于 2020-01-21 05:36:23
什么是代理模式 代理模式是项目中常用的一种设计模式。提供了间接访问目标对象的一种方式;即通过代理对象访问目标对象。 这样做的好处是,可以在不改变原有目标对象的基础上,对目标对象增加额外的扩展功能。 代理模式又分为静态代理、jdk动态代理、cglib动态代理三种实现方式。 三种实现方式各有优点,以及适用的场景。 一、静态代理 被代理对象与代理对象需要实现相同的接口或者是继承相同父类,因此要定义一个接口或抽象类。 /**代理接口*/ public interface IHello { String hi ( String key ) ; } /**代理接口实现类*/ public class HelloImpl implements IHello { @Override public String hi ( String key ) { String str = "hello:" + key ; System . out . println ( "HelloImpl! " + str ) ; return str ; } } /**静态代理类*/ public class HelloStaticProxy implements IHello { private IHello hello ; public HelloStaticProxy ( IHello hello ) { this

Java设计模式9:代理模式

╄→гoц情女王★ 提交于 2020-01-20 14:46:29
代理模式 代理模式的定义很简单: 给某一对象提供一个代理对象,并由代理对象控制对原对象的引用 。 代理模式的结构 有些情况下,一个客户不想或者不能够直接引用一个对象,可以通过代理对象在客户端和目标对象之间起到中介作用。代理模式中的角色有: 1、抽象对象角色 声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象 2、目标对象角色 定义了代理对象所代表的目标对象 3、代理对象角色 代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象 静态代理示例 这里模拟的是作为访问网站的场景,以新浪网举例。我们通常访问新浪网,几乎所有的Web项目尤其是新浪这种大型网站,是不可能采用集中式的架构的,使用的一定是分布式的架构,分布式架构对于用户来说,我们发起链接的时候,链接指向的并不是最终的应用服务器,而是代理服务器比如Nginx,用以做负载均衡。 所以,我们的例子,简化来说就是 用户访问新浪网-->代理服务器-->最终服务器 。先定义一个服务器接口Server,简单定义一个方法,用于获取页面标题: 1 /** 2 * 服务器接口,用于获取网站数据 3 */ 4 public interface Server { 5 6 /** 7 * 根据url获取页面标题 8 */ 9 public

Spring-使用JAVA的方式配置Spring-代理模式

本秂侑毒 提交于 2020-01-20 12:25:29
9、使用Java的方式配置Spring 我们现在要完全不使用Spring的xml配置了,全权交给Java来做! JavaConfig是Spring的一个子项目,在Spring4之后,它成为了一个核心功能 实体类 //这里这个注解的意思,就是说明这个类被Spring接管了,注册到了容器中 @Component public class User { private String name; @Override public String toString() { return "User{" + "name='" + name + '\'' + '}'; } public String getName() { return name; } @Value("尹锐") public void setName(String name) { this.name = name; } } 配置文件 package com.rui.config; import com.rui.pojo.User; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context

Java动态代理

♀尐吖头ヾ 提交于 2020-01-20 03:02:33
动态代理 特点:字节码随用随创建,随用随加载 作用:不修改源码的基础上对方法增强 分类 基于接口的动态代理 Proxy 基于子类的动态代理 Enhancer 创建代理对象 基于接口的动态代理 使用proxy类中的newProxyInstance方法 要求:被代理类最少实现一个接口,若果没有则不能使用 newProxyInstance方法的参数 基于子类的动态代理 使用Ehancer中的create方法 被代理类不能是最终类 newProxyInstance方法的参数 ClassLoader:类加载器 Class[]:字节码数组 InvocationHandler:提供增强的代码 参数 proxy:代理对象的引用 method:当前执行的方法 args:当前执行方法所需的参数 return:被代理方法返回值 create方法参数 Class:字节码 Callback用于提供增强的代码 object:代理对象的引用 method:当前执行的方法 args:当前执行方法所需的参数 methodproxy:当前执行方法的代理对象 接口动态代理 final ProducerImpl producer = new ProducerImpl ( ) ; Producer produceri = ( Producer ) Proxy . newProxyInstance ( producer .

深入理解Java中的代理(Proxy)

岁酱吖の 提交于 2020-01-19 04:32:31
目录 1.代理的概念 2.代理的类型 2.1 静态代理 2.2 动态代理 2.2.1 动态代理需要的要素 2.2.2 创建动态代理的步骤 2.2.3 动态代理示例 引用: 1.代理的概念 代理模式为其他对象提供了一种代理以控制对这个对象的访问,具体实现包括两大类:静态代理和动态代理。Java动态代理机制的出现使得Java开发人员只需要简单地指定一组接口及委托类对象便能动态地获得代理类,并且其所生成的代理类在将所有的方法调用分派到委托对象上反射执行的同时,还可以对方法进行增强,这也正是Spring AOP的实现基础。 2.代理的类型 代理分为静态代理和动态代理 静态代理:在程序运行前,由程序员创建或特定工具类自动生成源代码并对其编译生成.class文件。 动态代理:程序在运行时期动态生成的指定类型对象的行为。 2.1 静态代理 静态代理需要3个部分,接口(要执行的事情)、实现接口的对象、一个代理对象 //功能接口 public interface PersonInterface { public void printName(); } //具体的对象 public class Person implements PersonInterface { private String name; private String tel; private int age; public

java静态代理和动态代理详解

你说的曾经没有我的故事 提交于 2020-01-18 14:28:26
目录 一、静态代理 二、动态代理 (一)JDK动态代理 (二)Cglib动态代理 (三)jdk动态代理和cglib动态代理的区别 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类(被代理类)预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。 为了保持行为的一致性, 代理类和委托类通常会实现相同的接口 ,所以在访问者看来两者没有丝毫的区别。通过代理类这中间一层,能有效控制对委托类对象的直接访问,也 可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间 ,从而在设计上获得了更大的灵活性。Java 动态代理机制以巧妙的方式近乎完美地实践了代理模式的设计理念。 代理,简单来说就是,代理类和委托类都实现相同的接口,代理类代替委托类去执行从相同接口中实现的委托类中的方法,而代理类在代替委托类去执行方法之前和之后可以进行其他相应的处理。 一、静态代理 特点:代理类和委托类在 编译期间 就已经确定好。 静态代理举例 /** * 静态代理: * 特点:代理类和被代理类在编译期间就确定下来 */ interface ClothFactory{ void produceCloth(); } //被代理类 class NikeClothFactory implements ClothFactory{ public

Java框架之Spring02-AOP-动态代理-AspectJ-JdbcTemplate-事务

拈花ヽ惹草 提交于 2020-01-18 13:41:04
AOP 动态代理   代理设计模式的原理: 使用一个代理将原本对象包装起来 ,然后用该代理对象”取代”原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。 代理模式的三要素: 代理主题接口 代理者 被代理者 代理模式的主要优点 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用; 代理对象可以扩展目标对象的功能; 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度; 其主要缺点 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢; 增加了系统的复杂度; 动态代理的方式    静态代理类只能替一个主题接口进行代理工作 基于接口实现动态代理: JDK动态代理 基于继承实现动态代理: Cglib、Javassist动态代理 JDK动态代理步骤: * 1、编写主题接口 * 2、编写被代理类 * 3、编写代理工作处理器:即代理类要替被代理类做什么事情(有参构造器) * 要求:必须实现InvocationHandler,重写 * Object invoke(Object proxy, Method method, Object[] args) * 第一个参数:代理类对象 * 第二个参数:被代理类和代理类 要执行的方法 * 第三个参数:要执行方法的实参列表 * 这个invoke方法不是程序员调用