package com.hanqi;

public interface IJiSuanQi {

    public int jia(int a , int b);
public int jian(int a , int b);
public int cheng(int a, int b);
public int chu(int a, int b); }

IJiSuanQi

package com.hanqi;

public class MyJSQ implements IJiSuanQi {

    @Override
public int jia(int a, int b) {
// 记录日志
// System.out.println("加法调用前");
return a + b;
} @Override
public int jian(int a, int b) {
// 记录日志
// System.out.println("减法调用前");
return a - b;
} @Override
public int cheng(int a, int b) {
// 记录日志
// System.out.println("乘法调用前");
return a * b;
} @Override
public int chu(int a, int b) {
// 记录日志
// System.out.println("除法调用前");
return a / b;
} }

MyJSQ

package com.hanqi;

public class Main {

    public static void main(String[] args) {

        IJiSuanQi jsq = new MyJSQ();

        //生成代理
LoggingProxy lo = new LoggingProxy(jsq); jsq = lo.getProxy(); System.out.println("加法 = " + jsq.jia(100, 200));
System.out.println("减法 = " + jsq.jian(100, 200));
System.out.println("乘法 = " + jsq.cheng(100, 200));
System.out.println("除法 = " + jsq.chu(100, 20)); } }

Main

package com.hanqi;

import java.lang.reflect.*;

/*
* 代理类
*/
public class LoggingProxy { public LoggingProxy(IJiSuanQi target) {
super();
this.target = target;
} //要代理的对象,目标对象
private IJiSuanQi target; //应用通知,并产生代理对象
public IJiSuanQi getProxy()
{
IJiSuanQi rtn = null; //应用通知
// ClassLoader //类加载器
ClassLoader cl = target.getClass().getClassLoader(); Class[] al = new Class[] {IJiSuanQi.class}; InvocationHandler ih = new InvocationHandler() { /*
* proxy: 代理对象,一般不使用该对象
* method:正在被调用的方法
* args: 调用方法传入的参数
*/ @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 加通知 日志
System.out.println(method.getName() + "开始调用"); //反射调用
Object obj = method.invoke(target, args); // 加通知 日志
System.out.println(method.getName() + "结束调用"); return obj;
}
}; //产生代理对象
/**
* loader: 代理对象使用的类加载器
* interfaces:指定代理对象的类型,即代理对象中可以有哪些方法
* h: 当具体调节代理对象的方法时,应该如何进行响应,实际上就是调用 InvocationHandler 的 Invocation
*/
rtn = (IJiSuanQi)Proxy.newProxyInstance(cl, al, ih); return rtn; } }

LoggingProxy

20160126--springaop的更多相关文章

  1. Spring-AOP实践 - 统计访问时间

    公司的项目有的页面超级慢,20s以上,不知道用户会不会疯掉,于是老大说这个页面要性能优化.于是,首先就要搞清楚究竟是哪一步耗时太多. 我采用spring aop来统计各个阶段的用时,其中计时器工具为S ...

  2. Spring-Aop入门

    (一)Aop术语定义 1.通知(advice) 通知定义了切面要做什么工作,即调用的方法,同时定义了什么时候做这些工作,即以下五种类型 (1)前置通知(Before) :在目标方法调用之前执行切面方法 ...

  3. 转-springAOP基于XML配置文件方式

    springAOP基于XML配置文件方式 时间 2014-03-28 20:11:12  CSDN博客 原文  http://blog.csdn.net/yantingmei/article/deta ...

  4. SpringAOP详解(转载大神的)

    AOP(Aspect-Oriented Programming)这个东西,名字与 OOP 仅差一个字母,其实它是对 OOP 编程方式的一种补充,并非是取而代之.翻译过来就是"面向方面编程&q ...

  5. spring-aop学习

     SpringAOP学习 author:luojie 1.  AOP中的基本概念 AOP的通用术语,并非spring java所特有.很遗憾AOP的术语不是特别的直观.但如果让Spring java来 ...

  6. SpringAOP之静态代理

    一.SpringAOP: ⒈AOP:Aspect Oriented Programming 面向切面编程, 实现的是核心业务和非核心业务之间的的分离,让核心类只做核心业务,代理类只做非核心业务.  ⒉ ...

  7. springaop实现登陆验证

    1.首先配置好springmvc和springaop 2.先写好登陆方法,通过注解写代理方法 通过代理获得登陆方法的参数方法名,然后再aop代理方法内进行登陆验证 贴出代码 package com.h ...

  8. spring-aop示例

    具体案例放在github上,主要是jar包在上面 https://github.com/guoyansi/spring-aop-example knights.xml <?xml version ...

  9. 使用SpringAop 验证方法参数是否合法

    (原文地址:http://blog.csdn.net/is_zhoufeng/article/details/7683194) 1.依赖包    aspectjweaver.jar 其中Maven的配 ...

  10. 关于SpringAOP的XML方式的配置

    AOP(XML)[理解][应用][重点] 1.AOP基础实例 A.导入jar包 核心包(4个)         日志(2个)             AOP(4个) Spring进行AOP开发(1个) ...

随机推荐

  1. 常用SQL Server分页方式

    假设有表ARTICLE,字段ID.YEAR...(其他省略),数据53210条(客户真实数据,量不大),分页查询每页30条,查询第1500页(即第45001-45030条数据),字段ID聚集索引,YE ...

  2. HTML 5 全局属性和事件属性

    1.HTML 5 全局属性 HTML 属性能够赋予元素含义和语境. 下面的全局属性可用于任何 HTML5 元素. NEW:HTML 5 中新的全局属性. 属性 描述 accesskey 规定访问元素的 ...

  3. 部署sharepointform验证

    1  iis sharepoint v4 提供程序2  web service 验证提供程序3 创建web应用程序(选择基于身份验证模式,配置提供程序)4 创建网站集(空)5 创建网站集

  4. css基础之 语法

    CSS 实例 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明: 选择器通常是您需要改变样式的 HTML 元素. 每条声明由一个属性和一个值组成. 属性(property)是您希望设置的样 ...

  5. Candy Bags

    读懂了题就会发现这是个超级大水题 Description Gerald has n younger brothers and their number happens to be even. One ...

  6. 深入研究B树索引(一)

    摘要:本文对B树索引的结构.内部管理等方面做了一个全面的介绍.同时深入探讨了一些与B树索引有关的广为流传的说法,比如删除记录对索引的影响,定期重建索引能解决许多性能问题等. 1.B树索引的相关概念 索 ...

  7. JQ兼容各种JS库的写法

    来自为知笔记(Wiz)

  8. 解决nginx上传模块nginx_upload_module传递GET参数

    解决nginx上传模块nginx_upload_module传递GET参数的方法总结 最近用户反映我们的系统只能上传50M大小的文件, 希望能够支持上传更大的文件. 很显然PHP无法轻易实现大文件上传 ...

  9. JTextPane 的 undo 、 redo

    实现文本框输入内容的单条记录撤销,重做,通过按钮实现 以及通过JList的多条撤销.重做操作(类似PS) 昨天还在为自己写不出代码怎么办而伤心,没想到今天上午就实现了,并且还完善了功能: 可以在撤销一 ...

  10. 77个常用Linux命令和工具

    77个常用Linux命令和工具 Linux管理员不能单靠GUI图形界面吃饭.这就是我们编辑这篇最实用Linux命令手册的原因.这个指南是特别为Linux管理员和系统管理员 设计的,汇集了最有用的一些工 ...