动态代理的深化:承接动态代理2( 对 上级实例进行 深化),也就是 spring 的前身

(必须掌握)实例:

文件说明:1.有一个Waiter接口,该接口有一个 server() 、ShouQian()方法

2.有一个 Waiter接口的实现类,ManWaiter类

3.一个 测试Test类

4. 后置增强接口: AfterAdvice 接口

5.前置增强接口:BeforeAdvice接口

6. 生成代理对象 的 ProxyFactory类

1. Waiter.java 接口

// 服务员

public interface Waiter {

// 服务

public void serve();

//收钱

public void shouQian();

}

2. BeforeAdvice.java 接口,前置增强接口

/**

* 前置增强

* @author cxf

*

*/

public interface BeforeAdvice {

public void before();

}

3. AfterAdvice.java 接口,后置增强接口

/**

* @function: 后置增强

* @author not-bug

*

*/

public interface AfterAdvice {

public void after();

}

4 . ManWaiter.java 类,该类实现了 Waiter接口

//该类实现了 Waiter 接口

public class ManWaiter implements Waiter {

public void serve() {

System.out.println("服务中...");

}

public void shouQian() {

System.out.println("混蛋,给我钱!");

}

}

5. ProxyFactory.java 类,用来生成代理对象的类

/**

* 它用来生成代理对象

* 它需要所有的参数

* * 目标对象

* * 增强

* @author cxf

*/

/**

* 1. 创建代理工厂

* 2. 给工厂设置三样东西:

* * 目标对象:setTargetObject(xxx);

* * 前置增强:setBeforeAdvice(该接口的实现)

* * 后置增强:setAfterAdvice(该接口的实现)

* 3. 调用createProxy()得到代理对象

* * 执行代理对象方法时:

* > 执行BeforeAdvice的before()

* > 目标对象的目标方法

* > 执行AfterAdvice的after()

* @author cxf

*

*/

public class ProxyFactory {

private Object targetObject;//目标对象

private BeforeAdvice beforeAdvice;//前置增强

private AfterAdvice afterAdvice;//后置增强

/**

* 用来生成代理对象

* @return

*/

public Object createProxy() {

/*

* 1. 给出三大参数

*/

ClassLoader loader = this.getClass().getClassLoader();

Class[] interfaces = targetObject.getClass().getInterfaces();

InvocationHandler h = new InvocationHandler() {

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

/*

* 在调用代理对象的方法时会执行这里的内容

*/

// 执行前置增强

if(beforeAdvice != null) {

beforeAdvice.before();

}

Object result = method.invoke(targetObject, args);//执行目标对象的目标方法

// 执行后置增强

if(afterAdvice != null) {

afterAdvice.after();

}

// 返回目标对象的返回值

return result;

}

};

/*

* 2. 得到代理对象

*/

Object proxyObject = Proxy.newProxyInstance(loader, interfaces, h);

return proxyObject;

}

public Object getTargetObject() {

return targetObject;

}

public void setTargetObject(Object targetObject) {

this.targetObject = targetObject;

}

public BeforeAdvice getBeforeAdvice() {

return beforeAdvice;

}

public void setBeforeAdvice(BeforeAdvice beforeAdvice) {

this.beforeAdvice = beforeAdvice;

}

public AfterAdvice getAfterAdvice() {

return afterAdvice;

}

public void setAfterAdvice(AfterAdvice afterAdvice) {

this.afterAdvice = afterAdvice;

}

}

6. Test.java ,测试类

/*

* 目标是让目标对象和增强都可以切换!

*/

public class Demo3 {

@Test

public void fun1() {

ProxyFactory factory = new ProxyFactory();//创建工厂

factory.setTargetObject(new ManWaiter());//设置目标对象

factory.setBeforeAdvice(new BeforeAdvice() {//设置前置增强

public void before() {

System.out.println("您好不好!");

}

});

factory.setAfterAdvice(new AfterAdvice() {//设置后置增强

public void after() {

System.out.println("再见不见!");

}

});

Waiter waiter = (Waiter)factory.createProxy();

//waiter.shouQian();

waiter.serve();

}

//转账方法

public void zhuanZhang() {

/*

* 1.

* 2.

* 3.

*/

}

}

运行结果:

转载于:https://www.cnblogs.com/Prozhu/p/5452962.html

动态代理3之代理工厂实现相关推荐

  1. 第六周 Java语法总结_设计原则_工厂模式_单例模式_代理模式(静态代理_动态代理)_递归_IO流_网络编程(UDP_TCP)_反射_数据库

    文章目录 20.设计原则 1.工厂模式 2.单例模式 1)饿汉式 2)懒汉式 3.Runtime类 4.代理模式 1)静态代理 2)动态代理 动态代理模板 21.递归 22.IO流 1.File 2. ...

  2. 基于Spring AOP的JDK动态代理和CGLIB代理

    一.AOP的概念  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...

  3. 代理模式——静态代理,动态代理(JDK代理和CGLib代理)

    概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问. 这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. Java中的代理按照代理类生成时机不同又分为 ...

  4. Java静态代理、动态代理与CGLib代理

    java的动态代理举足轻重,它同反射原理一直是许多框架的底层实现.今天唠一下. 一.代理模式 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标 ...

  5. Java代理模式——静态代理动态代理

    proxy mode 1. 什么是代理 1.1 例子解释 1.2 作用 2. 静态代理 2.1 优缺点分析 2.2 以厂家卖u盘用代码说明 3. 动态代理 3.1 什么是动态代理 3.2 jdk实现原 ...

  6. Spring系列之静态代理、动态代理、cglib代理与Spring AOP的处理

    本章内容 代理的概念及理解 如何实现静态代理 如何实现动态代理 静态代理与动态代理有什么区别与优缺点 JDK动态代理如何实现 cglib动态代理如何实现 JDK动态代理与cglib动态代理的区别 Sp ...

  7. Java设计模式(五)代理设计模式—静态代理—JDK动态代理—Cglib动态代理

    文章目录 什么是代理模式 代理模式应用场景 代理的分类 静态代理 什么是静态代理 深入解析静态代理 小结 动态代理 什么是动态代理 JDK动态代理 原理和实现方式 代码实现 优缺点 Cglib动态代理 ...

  8. Java中三种代理方式—— 静态代理与两种动态代理的实现机制

    个人博客请访问 http://www.x0100.top 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现 ...

  9. 代理模式 静态代理、JDK动态代理、Cglib动态代理

    1 代理模式 使用代理模式时必须让代理类和被代理类实现相同的接口: 客户端通过代理类对象来调用被代理对象方法时,代理类对象会将所有方法的调用分派到被代理对象上进行反射执行: 在分派的过程中还可以添加前 ...

最新文章

  1. NGINX、PHP-FPM开机自动启动
  2. python numba jit 的效率
  3. MySQL往数据库中存入中文字符时变问号
  4. 【Matlab】到底怎么自定义colorbar/colormap的颜色?
  5. 【数据结构与算法】之深入解析“单词接龙II”的求解思路与算法示例
  6. CodeForces - 432D Prefixes and Suffixes(KMP的next数组性质)
  7. 从理念到实践跳跃式演进! 云的原生“免疫系统”如何有机作战?
  8. Shell脚本基础语法
  9. STM32 J-LINK、ST-Link、CMSIS-DAP
  10. [note]标点符号和数学符号所对应的英文
  11. LUOGU P4281 [AHOI2008]紧急集合 / 聚会 (lca)
  12. python-opencv Harris 角点检测
  13. 雨林木风win7系统下载
  14. 芯片设计里的Multi-Bit FF探究
  15. 门面设计模式(Facade Pattern)
  16. Lambda使用指北(上)
  17. MySQL JDBC PreparedStatement
  18. TPM零知识学习九 —— tpm全安装流程复盘(上)
  19. 飞思卡尔 熟悉小车之 舵机篇
  20. u盘软件怎么安装linux,教你怎么使用u盘安装Linux平台

热门文章

  1. Linux桌面自动挂载,ubuntu分区自动挂载
  2. 数据库SQL语言从入门到精通--Part 6--单表查询(快来PICK)
  3. 疯子的算法总结(七) 字符串算法之 manacher 算法 O(N)解决回文串
  4. RepVGG算法详解
  5. 深度学习基础知识介绍
  6. pytorch 音频分类_Pytorch中音频的神经风格转换
  7. 基于决策树的多分类_R中基于决策树的糖尿病分类—一个零博客
  8. 树莓派 神经网络植入_使用自动编码器和TensorFlow进行神经植入
  9. ubuntu下编译pjsip
  10. 2019年那些匆忙入市的朋友现在都赚到钱了吗?