2019独角兽企业重金招聘Python工程师标准>>>

1.ArithmeticCalculator.java

package com.huanlgiusong.spring.aop.hello;public interface ArithmeticCalculator {int add(int i,int j);int sub(int i,int j);int mul(int i,int j);int div(int i,int j);
}

2.ArithmeticCalculatorImpl.java

package com.huanlgiusong.spring.aop.hello;public class ArithmeticCalculatorImpl implements ArithmeticCalculator {@Overridepublic int add(int i, int j) {int result = i + j;return result;}@Overridepublic int sub(int i, int j) {int result = i - j;return result;}@Overridepublic int mul(int i, int j) {int result = i * j;return result;}@Overridepublic int div(int i, int j) {int result = i / j;return result;}}

3.ArithmeticCalculatorLoggingProxy.java

package com.huanlgiusong.spring.aop.hello;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Arrays;import org.aopalliance.intercept.Invocation;/*** 动态代理* @author Administrator**/
public class ArithmeticCalculatorLoggingProxy {//要代理的对象private ArithmeticCalculator target;public ArithmeticCalculatorLoggingProxy(ArithmeticCalculator target) {this.target=target;}public ArithmeticCalculator getLoggingProxy(){ArithmeticCalculator proxy=null;//代理对象由哪个类加载器加载ClassLoader loader=target.getClass().getClassLoader();//代理对象的类型 即其中那些方法Class[]  interfaces=new Class[]{ArithmeticCalculator.class};//当调用代理对象其中的方法时 需要执行的代码InvocationHandler h=new InvocationHandler() {/*** proxy正在返回的那个代理对象 一般情况下在invoke方法中不适用对象* method:正在被调用的方法* args:正在被调用方式时传入的参数*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("invoke。。。");//日志System.out.println("这个方法是"+method.getName());System.out.println("这个方法参数是:"+Arrays.asList(args));//执行方法Object result=method.invoke(target, args);return result;}};proxy=(ArithmeticCalculator) Proxy.newProxyInstance(loader, interfaces, h);return proxy;}}

4.ArithmeticImpl.java

package com.huanlgiusong.spring.aop.hello;public class ArithmeticImpl implements ArithmeticCalculator {@Overridepublic int add(int i, int j) {System.out.println("这个方法是加法运算<开始>" + i + "+" + j);int result = i + j;System.out.println("这个方法是加法运算<结束>" + i + "+" + j + "=" + result);return result;}@Overridepublic int sub(int i, int j) {System.out.println("这个方法是-法运算<开始>" + i + "+" + j);int result = i - j;System.out.println("这个方法是-法运算<结束>" + i + "-" + j + "=" + result);return result;}@Overridepublic int mul(int i, int j) {System.out.println("这个方法是*法运算<开始>" + i + "+" + j);int result = i * j;System.out.println("这个方法是*法运算<结束>" + i + "*" + j + "=" + result);return result;}@Overridepublic int div(int i, int j) {System.out.println("这个方法是/法运算<开始>" + i + "+" + j);int result = i / j;System.out.println("这个方法是/法运算<结束>" + i + "/" + j + "=" + result);return result;}}

5.TestArithmetic.java

package com.huanlgiusong.spring.aop.hello;import org.junit.Test;public class TestArithmetic {@Testpublic void test1() {int result = 0;ArithmeticCalculator arithmeticCalculator = null;arithmeticCalculator = new ArithmeticCalculatorImpl();result = arithmeticCalculator.add(1, 1);System.out.println("result>>" + result);result = arithmeticCalculator.sub(1, 1);System.out.println("result>>" + result);result = arithmeticCalculator.div(1, 1);System.out.println("result>>" + result);result = arithmeticCalculator.mul(1, 1);System.out.println("result>>" + result);}@Testpublic void test2(){ArithmeticCalculator target=new ArithmeticCalculatorImpl();ArithmeticCalculator proxy=new ArithmeticCalculatorLoggingProxy(target).getLoggingProxy();int result = proxy.add(1, 2);System.out.println("result>>" + result);result = proxy.sub(1, 3);System.out.println("result>>" + result);result = proxy.div(1, 4);System.out.println("result>>" + result);result = proxy.mul(1, 5);System.out.println("result>>" + result);}
}

转载于:https://my.oschina.net/liusonghuang/blog/817747

spring动态代理实现计算器相关推荐

  1. 【Spring AOP】静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)

    AOP 编程 静态代理设计模式 1. 为什么需要代理设计模式 2. 代理设计模式 名词解释 代理开发的核心要素 静态代理编码 静态代理存在的问题 Spring 动态代理开发 搭建开发环境 Spring ...

  2. 【Spring源码三千问】Spring动态代理:什么时候使用的 cglib,什么时候使用的是 jdk proxy?

    Spring动态代理:什么时候使用的 cglib,什么时候使用的是 jdk proxy? 前言 版本约定 正文 例子测试 结论分析 proxyTargetClass 标识的校正 哪些接口不是 Reas ...

  3. 从一个Spring动态代理Bug聊到循环依赖

    文章目录 Bug复现 结论 @PostConstruct的在Bean的生命周期的哪一步 一般代理类的生成时机在生命周期的哪一步 解决办法 两个思路 1.不生成代理类 2.在生成代理类之后再进行数据的初 ...

  4. spring 动态代理_分析动态代理给 Spring 事务埋下的坑

    前言 Spring的声明式事务让我们不在编写获得连接.关闭连接.开启事务.提交事务.回滚事务等代码,通过一个简单的@Transactional注解,就让我们轻松进行事务处理.我们知道Spring事务基 ...

  5. 传统动态代理实现计算器类日志功能

    1 接口 public interface Caculator {public int add(int op1, int op2);public int sub(int op1, int op2);p ...

  6. Spring动态代理机制理解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  7. Spring动态代理原理是什么?

    动态代理的两种模式 jdk动态代理    //基于实现接口 Cglib动态代理   //基于方法的继承 ????????啥东西 这就不得不提到 静态代理了: 说得高大上,其实就是写一个增强类继承被增强 ...

  8. spring动态代理

    学习spring中的动态代理首先你要了解什么是动态代理,例子: 假设我们现在在外工作,要租房子,因为房东不在家里,但是房东找了中介管理房间,只要给我钱就行了,看图,租房是一个接口  ,房东和中介都要实 ...

  9. Spring动态代理使用

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-// ...

最新文章

  1. js判断手机浏览器屏幕方向
  2. QQ远程协助没动静?QQ版本有讲究
  3. urlPatterns映射的规则
  4. 3.2.4 页面分配策略
  5. java collection详解_java 7 collection 详解(一)
  6. POJ 3660 Cow Contest(传递闭包floyed算法)
  7. PHPmysqli的 预处理执行查询语句
  8. margin和padding的区别
  9. Express + Node 爬取网站数据
  10. json、js数组真心不是想得那么简单
  11. Div高度自适应内容高度
  12. 代码雨和N个本地磁盘的制作
  13. 【SAP】-常用简称中英日对照表
  14. 串行口终端乱码的解决.
  15. 电脑找回,怎么找回电脑上删除的文件_怎么找回电脑删除的文件-win7之家
  16. edge怎么开启沉浸式阅读_《幻塔》首测今日开启 探索沉浸式开放世界_网络游戏新闻...
  17. 2018年度获取工作日节假日API
  18. 从txt中读取float数据C++
  19. 简单了解消息中间件及ActiveMQ
  20. [2018-03-06] 基于Django的轻量级CMS Mezzanine搭建笔记

热门文章

  1. JavaScript是如何工作的:使用MutationObserver跟踪DOM的变化
  2. 一对多查询,合并成一条数据
  3. Vue组件中使用Sass或者Less全局变量
  4. 正态随机分布 C++实现
  5. KindEditor富文本编辑器, 从客户端中检测到有潜在危险的 Request.Form 值
  6. PLSQL不能选择数据库问题
  7. Ext.grid.Panel表格分页
  8. (转).Net/C# 获取字节流编码
  9. 微信小程序 用户权限部分
  10. Java 变量声明和赋值