代理模式

java开发必学知识:动态代理

点点圈 提交于 2019-12-20 12:42:10
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一句话概括:java动态代理通过反射机制,可在不修改原代码的情况下添加新的功能,应用于多种场景,简单、实用、灵活,是java开发必学知识,本文将对动态代理使用进行详细介绍。 1. 引言 最近开发项目过程中需要使用动态代理来实现功能,趁此机会把动态代理的知识点进行了一次梳理。在java开发过程中,当需要对已有的代码(方法)前后添加新功能,而不想修改或不方便修改原代码的情况下,如需要在执行某个已有的方法前后输出日志,以记录方法执行的记录,这个时候,动态代理就派上用场了。动态代理可以有以下几使用场景: 记录跟踪:对函数执行前后统一输出日志跟踪执行情况 计时:统一对函数执行用时进行计算(前后时间记录之差) 权限校验:统一在函数执行前进行权限校验 事务:统一对函数作为事务处理 异常处理:对某一类函数执行输出的异常进行统一捕获处理 动态切换数据源:多数据源切换或动态添加数据源 动态代理首先是代理,对应的有静态代理,然后是动态代理,在Spring中还有动态代理的应用-AOP(面向切面编程)。本文针对这些内容,梳理了以下几个知识点: 了解代理模式并实现静态代理 针对动态代理,描述它使用到的反射机制,以及JDK、CGLIB两种动态代理的实现 描述如何在在Spring中,使用AOP实现面向切面编程 本文所涉及到的静态代理、反射

夜光带你走进 Java 成神之路(二十六)擅长的领域

好久不见. 提交于 2019-12-20 06:59:29
夜光序言: 你知道,这世界如此寂寞。没有按下的发送键,季风的转向,云雨的流动和鸟的迁徙。以及,没有对你说出口的,再见。 正文: 以道御术 / 以术识道 package 代理模式.静态代理; //接口 public interface ITeacherDao { void teach(); //授课的方法 } package 代理模式.静态代理; public class TeacherDao implements ITeacherDao{ @Override public void teach() { System.out.println(" 老师授课中.... "); } } package 代理模式.静态代理; //代理对象,静态代理 public class TeacherDaoProxy implements ITeacherDao{ //定义一个字段 private ITeacherDao target; //目标对象,通过接口来聚合 //下面写一个构造器 public TeacherDaoProxy(ITeacherDao target) { this.target = target; } @Override public void teach() { System.out.println("代理对象开始代理"); target.teach(); System.out

初识Spring框架的AOP机制

☆樱花仙子☆ 提交于 2019-12-20 01:45:27
  AOP是Spring框架面向切面的编程思想,AOP采用一种称为“横切”的技术,将涉及多业务流程的通用功能抽取并单独封装,形成独立的切面,在合适的时机将这些切面横向切入到业务流程指定的位置中。本篇结合实际案例详细讲述AOP的原理及实现过程。通过本篇的学习,可以达成如下目标。 ● 理解AOP的编程思想及原理 ● 掌握AOP的实现技术   Spring框架的AOP机制可以让开发者把业务流程中的通用功能抽取出来,单独编写功能代码。在业务流程执行过程中,Spring框架会根据业务流程要求,自动把独立编写的功能代码切入到流程的合适位置。   例如,在一个业务系统中,用户登录是基础功能,凡是涉及到用户的业务流程都要求用户进行系统登录。如果把用户登录功能代码写入到每个业务流程中,会造成代码冗余,维护也非常麻烦,当需要修改用户登录功能时,就需要修改每个业务流程的用户登录代码,这种处理方式显然是不可取的。比较好的做法是把用户登录功能抽取出来,形成独立的模块,当业务流程需要用户登录时,系统自动把登录功能切入到业务流程中。 代理模式   我们知道,Spring AOP的主要作用就是不通过修改源代码的方式、将非核心功能代码织入来实现对方法的增强。那么Spring AOP的底层如何实现对方法的增强?实现的关键在于使用了代理模式   代理模式的作用就是为其它对象提供一种代理,以控制对这个对象的访问

设计模式--代理模式C++实现

风流意气都作罢 提交于 2019-12-19 17:08:42
代理模式C++实现 1定义 为其他对象提供一种代理以控制对这个对象的访问 2类图 角色定义: Subject抽象主体角色,抽象类或者接口,是一个普通的业务类型定义 RealSubject具体主体角色,也叫作被委托角色,被代理角色。业务逻辑的具体执行者 Proxy代理主体角色,委托类,代理类。 3实现 class Subject { public:   virtual ~Subject()=0;   virtual void Request()=0;//具体代理的任务 protected:   Subject(); }; class ConcreteSubject:public Subject { public:   ConcreteSubject();   ~ConcreteSubject();   void Request(); }; class Proxy:public Subject { public:   Proxy();   Proxy(Subject* _sub);   void Request()//实现对委托者的委托任务执行与补偿   {     bef();     this->_sub->Request();     end();   }   void bef()   {}   void end()   {}   ~Proxy(); private:  

Spring框架

血红的双手。 提交于 2019-12-19 12:48:43
---恢复内容开始--- Spring框架:Spring框架的核心 代理模式,AOP,JDBC支持 Spring事务管理 Spring与Mybatis整合 传统开发模式 基于项目框架架构:entity/dao/service/action 1、实体类 class user{} 2、dao class userdao{ 访问数据库} 3、Service class UserService{ UserDao userdao=new……(); } 4、action class userAction{ UserService userservice=new ……(); public void setUserService(UserService userservice){ this.userservice=userservice; } //由别人来创建:控制反转 } 用户访问:user.action--->Tomcat(服务器创建Action,Service,dao) 思考:1、对象创建创建能否写死 2、对象创建细节,对象的个数?创建的时间 3、对象之间的依赖 总结:Spring解决对象的创建,以及对象依赖关系管理 Spring框架:了解专业术语 组件/框架设计:侵入式:对现有的类的结构有影响,需要实现或继承 非侵入式:对现有的类的结构没有影响 控制反转(IOC)

Java字节码增强应用(一):动态代理

瘦欲@ 提交于 2019-12-19 11:32:42
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在上一篇文章 Java字节码结构 里,我们了解了字节码文件的结构,其中提到方法代码指令区是我们进行字节码增强的关键地方。从这篇文章开始,我将继续介绍一些字节码增强的技术,有些是我们比较熟悉的比如动态代理,有些是在我们日常业务开发中较少接触到的,比如 Javaagent 技术,APM等。本文主要介绍动态代理的原理以及各类框架 AOP 的实现原理。 动态代理属于代理模式的一种实现方式,代理模式就是,我们需要在一个现有类的方法增加一些功能,我们可以通过代理模式来实现。代理模式可以分为两类: 静态代理 动态代理 静态代理 静态代理是程序员通过编程的方式扩展原有类的功能。大致方式为,编写一个代理类,和目标类实现同样的接口,并持有目标类的实例,在代理方法里先执行需要扩展的逻辑,然后再通过目标类的实例调用目标方法。 如我们有一个 Person 接口,其中有方法 run() ,有个实现类 Tom ,实现了具体的 run() 方法,现在我们需要在 Tom 类的 run() 方法前后增加一些逻辑,我们可以通过新建一个类 PersonProxy 类,实现 Person 接口,并在构造方法里传入具体要代理的目标类,然后在 run 方法里执行增加的逻辑,并调用目标类的 run 方法。具体类图如下: 测试代码如下: public

动态代理三部曲(一):动态代理模式及实现原理

旧时模样 提交于 2019-12-19 04:58:00
一、背景 代理模式,作为常用的设计模式之一,在实际项目中或多或少都会被使用到。当前一些主流的项目框架中,也有不少代理模式的身影。 代理模式中,代理类与主体类实现同样的接口,代理类持有实体类的引用,并接受客户端对代理类中实体引用的外部注入,并代理实体类的功能。 注:描述中的这种外部注入形式有个专有技术名词:依赖注入 代理模式通用的类图为: 按照代理类的产生方式,是在运行期之前就静态的存在还是在运行期动态产生,可以将代理模式分为静态代理和动态代理。 二、静态代理 在真正理解动态代理之前,有必要先简单回顾下静态代理的一般过程。 直接看一个具体的实例。 1,定义接口: package com.corn.proxy.pstatic; public interface Subject { String action(); } 复制代码 2,定义主体类: package com.corn.proxy.pstatic; public class RealSubject implements Subject { @Override public String action() { System.out.println("action in RealSubject"); return "action done"; } } 复制代码 3,定义静态代理类: package com.corn.proxy

设计模式之代理模式

有些话、适合烂在心里 提交于 2019-12-19 03:09:00
代理模式 :为某个对象提供一个代理对象,并且由代理对象控制对原对象的访问。代理对象就像是生活中的中介。当我们去买房时,我们不会直接去找房源,而是通过房产中介,通过沟通,选择我们想要的房子。 结构 主要角色 抽象角色 。通过接口或抽象类声明真实角色实现的业务方法。 代理角色 。实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。 真实角色 。实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。 作用 隔离作用 :代理类隔离了客户类和真实类,使客户类不能直接访问真实类,即客户不直接去寻找房源,只能找中介。这样代理类就可以处理一些逻辑,比例帮用户排除不喜欢的房源,或者帮房产商拒绝某些用户。 开闭原则 :代理类可以扩展真实类的功能而无需修改真实类的内部代码,符合了开闭原则。代理类主要负责为真实类预处理消息、过滤消息、把消息转发给委托类,以及事后对返回结果的处理等。 分类 静态代理 静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类。 //房子类 public class House { private String color ; private String location ; public void setLocation ( String location ) { this .

高性能网站建设指南----笔记

随声附和 提交于 2019-12-19 02:00:28
小概述: 1.只有10%-20%的最终用户响应时间花在了下载HTML文档上,其余的80%-90%的时间花在了下载页面中的所有组件上【js,css,image,flash...】。 2.如果浏览器和服务器都支持的话,可以使用压缩来减小响应的大小。浏览器可以使用Accept-Encoding头来声明它支持的压缩,服务器使用Content-Encoding头来确认响应已被压缩。 3.条件GET请求 如果浏览器在其缓存中保留了组件一个副本,但并不确定它是否仍然有效,就会生成一个条件GET请求,即在请求头中使用If-Modified-Since头将最后修改时间发送给服务器,请求服务器验证该副本从最后修改时间以来有没有被更新过,如果 没有更新过,服务器会返回一个"304 Not Modified"状态码并不再发送响应体,浏览器直接使用缓存中的这个副本,从而得到一个更小且更快的响应。 请求: GET /us.js.yimg.com/lib/common/utils/2/yahoo_2.0.0-b2.js HTTP/1.1 Host: us.js2.yimg.com User-Agent: Mozilla/5.0 (...) Gecko/20061206 Firefox/1.5.0.9 Accept-Encoding: gzip,deflate If-Modified-Since: Wed, 22

java代理模式之静态代理

家住魔仙堡 提交于 2019-12-19 01:44:54
  作为一个初级开发者 ,可能不会接触到代理模式,但是在很多框架的使用中都不知不觉使用了代理模式,比如servlet的过滤器链,spring的AOP,以及spring mvc的拦截器等。所以了解代理模式对于个人的成长是不可避免的。   在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。 原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/6013461.html 通过引入一个新的对象来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式,通过引入代理对象来间接访问一个对象,这就是代理模式的模式动机。 代理模式(Proxy Pattern) :给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy或Surrogate,它是一种对象结构型模式。 代理模式示意结构图比较简单,一般可以简化为如下图所示,但是在现实中要复杂很多。 如下的场景来理解为什么采用聚合而不是继承调用: public interface Moveable { void move(); void stop(); } public class