动态代理

java框架学习日志-7(静态代理和JDK代理)

╄→гoц情女王★ 提交于 2020-03-17 15:12:23
某厂面试归来,发现自己落伍了!>>> 静态代理 我们平时去餐厅吃饭,不是直接告诉厨师做什么菜的,而是先告诉服务员点什么菜,然后由服务员传到给厨师,相当于服务员是厨师的代理,我们通过代理让厨师炒菜,这就是代理模式。代理模式需要三个东西: 真实对象——厨师(chef),用户真正需要去用到的对象。 调用者——客人(Client),需要用到真实对象的对象。 代理对象——服务员(waiter),代理真实对象与调用者沟通的对象。 厨师需要有个炒菜的方法,服务员负责代理厨师,所以也需要有一个炒菜方法,为了保证两个对象的炒菜方法一致,需要一个接口。 public interface Cook { public void cook(String name);//传入菜品名字 } 然后chef实现这个接口 public class Chef implements Cook{ @Override public void cook(String name) { System.out.println("正在炒"+name); } } waiter也需要实现这个接口 public class Waiter implements Cook{ Chef chef; public Waiter(Chef chef) { //通过构造函数与获取chef的实例对象 this.chef = chef; }

静态代理和动态代理的区别

[亡魂溺海] 提交于 2020-03-17 06:28:46
静态代理 举个例子: 有个接口A 创建AImpl类实现接口 创建AProxy类来隐藏和保护A和AImpl,并且可以在其中添加新的功能 优点是:保护和隐藏了要代理的类 缺点是:感觉代码繁多,类很多,并且随着接口和实现接口的类变多,那么需要代理的类也就越多。 案例: public interface UserService { void login ( ) ; void regist ( ) ; } public class UserServiceImpl implements UserService { @Override public void login ( ) { System . out . println ( "登录方法" ) ; try { Thread . sleep ( 1000 ) ; } catch ( InterruptedException e ) { e . printStackTrace ( ) ; } } @Override public void regist ( ) { System . out . println ( "注册功能" ) ; try { Thread . sleep ( 1000 ) ; } catch ( InterruptedException e ) { e . printStackTrace ( ) ; } } }

设计模式——代理模式

霸气de小男生 提交于 2020-03-16 14:46:28
平时我们使用的框架中非常频繁地使用了动态代理。可以说如果一个框架不使用动态代理的话,这个框架不太可能做成一个通用的框架。因此动态代理的知识是我们必须要掌握的知识。 本博客是网络转载的,原文请点击 这里 代理模式简介 Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题。(某些对象只想提供部分方法让外部对象访问) 代理模式是一种常用的结构型设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息( beforeAdvice ),过滤消息并转发消息,以及进行消息被委托类执行后的后续处理( afterAdvice ) 为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。 通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间,从而在设计上获得了更大的灵活性 。 更通俗的说,代理解决的问题当两个类需要通信时,引入第三方代理类,将两个类的关系解耦,让我们只了解代理类即可,而且代理的出现还可以让我们完成与另一个类之间的关系的统一管理,但是切记,代理类和委托类要实现相同的接口,因为代理真正调用的还是委托类的方法。 使用场景 方法增强(添加注解实现一些额外的功能) AOP 等 代理模式分类 按照代理的创建时期

代理模式:利用JDK原生动态实现AOP

会有一股神秘感。 提交于 2020-03-15 09:01:54
目录 概述与模型 1、概述   含义:控制对对象的访问。   作用:详细控制某个(某类)某对象的方法,在调用之前做前置处理,调用之后做后置处理,从而实现将统一流程代码放在代理类中处理。   举例:我们在学习JDBC的时候,在批量处理的时候遇到过事务。流程:设置提交方式为手动提交-开启事务-批量处理-关闭事务-设置提交方式为默认。从这里我们清晰可以看见,每次进行批处理的时候,唯有增删改操作变化,其他的操作都是一样的。那么,我们可不可以把一样的操作提取出来交给一个类处理,批量操作提取出来交给一个类实现?带着疑问,我们来看一下代理模式的模型,你就有所明白了。 2、模型       Subject(抽象角色):定义代理角色和真实角色的公共对外方法。   RealSubject(真实角色):实现抽象角色,定义真实角色所要实现的真实业务逻辑,供代理角色调用。   Proxy(代理角色):实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。   最终目标:将统一的流程控制放到代理角色处理。 应用场景描述   1、安全代理:屏蔽对真实角色的直接访问,由代理角色控制,等业务真实需要的时候,才由代理对象调用真实对象方法。   2、远程代理:通过代理类处理远程方法调用(RMI)。   3、延迟代理:先加载轻量级的代理对象,真正需要再加载真实对象。例如加载图片

反射与动态代理的关系

陌路散爱 提交于 2020-03-12 02:29:56
先展示下mybatis的动态代理是怎样的 结合上一篇文章实践的 String resource = "mybatis.xml" ; InputStream resourceAsStream = Resources . getResourceAsStream ( resource ) ; SqlSessionFactory factory = new SqlSessionFactoryBuilder ( ) . build ( resourceAsStream ) ; SqlSession sqlSession = factory . openSession ( ) ; // 不使用动态代理的情况下 try { List < User > userList = sqlSession . selectList ( "com.wyl.mybatis.dao.UserDao.getUserList" ) ; System . out . println ( "**********" + JSON . toJSON ( userList ) ) ; } finally { sqlSession . close ( ) ; } // 使用动态代理的情况下 try { UserDao userDao = sqlSession . getMapper ( UserDao . class ) ;

Java的动态代理

我怕爱的太早我们不能终老 提交于 2020-03-11 01:01:21
1.什么是代理? 看图吧 2.JAVA中基于接口的动态代理 一个定义了生产商应该干什么活的接口 public interface IProductor { /** * 生产 * @param money */ public void saleProduct ( double money ) ; /** * 售后 * @param money */ public void afterService ( double money ) ; } 一个生产商 public class Producter implements IProductor { /** * 生产 * @param money */ public void saleProduct ( double money ) { System . out . println ( "销售产品,并赚了" + money + "钱" ) ; } /** * 售后 * @param money */ public void afterService ( double money ) { System . out . println ( "提供了售后服务,并赚了" + money + "钱" ) ; } } 我们的小明 public class Client { public static void main ( final String [

spring05

瘦欲@ 提交于 2020-03-09 20:51:02
title: spring05 date: 2020-03-09 19:31:42 tags:代理模式 该部分学习了动态代理。 1、概述 该部分摘抄自秦老师的博客 静态代理 可以使得我们的真实角色更加纯粹 . 不再去关注一些公共的事情 . 公共的业务由代理来完成 . 实现了业务的分工 。 公共业务发生扩展时变得更加集中和方便 . 缺点 : 类多了 , 多了代理类 , 工作量变大了 . 开发效率降低 . 动态代理 动态代理的角色和静态代理的一样 . 动态代理的代理类是动态生成的 . 静态代理的代理类是我们提前写好的 动态代理分为两类 : 一类是基于接口动态代理 , 一类是基于类的动态代理 基于接口的动态代理----JDK动态代理 基于类的动态代理--cglib 现在用的比较多的是 javasist 来生成动态代理 . 百度一下javasist 我们这里使用JDK的原生代码来实现,其余的道理都是一样的! 2、环境 接口 package com.nevesettle.dongtai; public interface Userdao { public void addUser(); public void deleteUser(); public void queryUser(); public void updateUser(); } 实现类 package com

java动态代理cglib基于子类代码增强案例

可紊 提交于 2020-03-09 15:39:33
相对于Proxy不同的是,Proxy是基于接口的动态代理,而cglib是子类的 第一步导入cglib的jar包 < dependencies > < dependency > < groupId > cglib < / groupId > < artifactId > cglib < / artifactId > < version > 3.2 .12 < / version > < / dependency > < / dependencies > 普通类 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 ) ; } } 测试类 /** * 模拟一个消费者 * @author DELL */ public class Client { public static void main ( String [ ] args )

easySpring | 手写SpringIOC、AOP

被刻印的时光 ゝ 提交于 2020-03-08 18:49:49
easySpring 在学到Java的Spring容器概念这里,我参考网上的博客和自己的理解实现了一个简易的Spring容器也就是这个项目。该项目分为 up 和 down 两部分。 up 模块只实现了最简单的IOC和AOP功能,两者并没有联系起来。 后来在 down 中实现了更复杂的IOC、AOP功能,并使两者能够很好地进行协作。 1. 简单的IOC和AOP的实现 1.1 简单的IOC容器实现 先从简单的 IOC 容器实现开始,最简单的 IOC 容器只需4步即可实现,如下: 加载 xml 配置文件,遍历其中的 标签 获取标签中的 id 和 class 属性,加载 class 属性对应的类,并创建 bean 遍历 标签中的 标签,获取属性值,并将属性值填充到 bean 中 将 bean 注册到 bean 容器中 代码结构如下: SimpleIOC // IOC 的实现类,实现了上面所说的4个步骤 SimpleIOCTest // IOC 的测试类 Car // IOC 测试使用的 bean Wheel // 同上 ioc . xml // bean 配置文件 容器实现类 SimpleIOC 的代码: package easySpring . up . ioc ; import org . w3c . dom . Document ; import org . w3c . dom .

代理与动态代理

删除回忆录丶 提交于 2020-03-07 17:42:19
概述 代理 生活中的代理: 比如暴雪又新出了一款游戏,作为一个中国用户,没有很好的方式直接从美国拿到游戏产品,就需要等到中国的某个代理商被暴雪授权代理,才可以玩上暴雪新出的这款游戏,那么代理的作用也就显而易见了,就是为了方便的适应一些不同地区的用户而产生的中间媒介,通过代理,可以更有效的将一些产品发行出去,生活中这样代理的例子比比皆是 程序中的代理: 如果一些实现了同一接口的类在实现方法的时候,有了新的需求,需要增加一些异常处理、日志、计算方法的运行时间、事务管理等操作,但是我们又不能去修改源代码,这样严重影响了程序的扩展性,这个时候,我们就可以使用代理,代理与目标类实现同一个接口,代表着代理类与目标类具有同名的方法,调用者不需要直接调用目标对象,而是使用代理间接调用目标对象的方法,并在这个过程中加入自己的处理代码,这就是程序中的代理 代理实现图示 代理可以处理的问题 系统中存在交叉业务,一个交叉业务就是要切入到系统中的一个方面,如下所示: 用具体的程序代码描述交叉业务: 交叉业务的编程问题即为面向方面的编程(Aspect oriented program ,简称AOP),AOP的目标就是要使交叉业务模块化。 可以采用将切面代码移动到原始方法的周围,这与直接在方法中编写切面代码的运行效果是一样的,如下所示: 使用代理技术正好可以解决这种问题,代理是实现AOP功能的核心和关键技术。