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. apache如何在虚拟主机中实现用户验证

    1,在相应的虚拟主机配置文件段,加入<Directory  /data/www.admin.php>                AllowOverride AuthConfig     ...

  2. 三、Mp3帧分析(数据帧)

    一. 帧 帧头长4字节,是的,是4个字节,共32位. 帧头后面可能有两个字节的CRC 校验,这两个字节的是否存在决定于FRAMEHEADER 信息的第16bit, 为0 则帧头后面无校验,为1 则有校 ...

  3. JavaScript 【正则表达式验证数字代码】

    可以看到 Ajax 请求多了个 x-requested-with ,可以利用它,request.getHeader("x-requested-with"); 为 null,则为传统 ...

  4. Opencv--HoughCircles源码剖析

    图形可以用一些参数进行表示,标准霍夫变换的原理就是把图像空间转换成参数空间(即霍夫空间),例如霍夫变换的直线检测就是在距离-角度空间内进行检测.圆可以表示成: (x-a)2+(y-b)2=r2     ...

  5. Android studio教程:[1] 创建app项目

    Android studio作为面市不久的安卓开发工具,越来越受到大家的喜爱,这里我将介绍如何在Android studio中创建一个APP项目,并在以后经验中介绍其他有关Android studio ...

  6. 转:APK反编译

    使用工具:      CSDN上下载地址: apktool (资源文件获取) 下载 dex2jar(源码文件获取) 下载 jd-gui (源码查看) 下载 Android反编译整合工具包(最新) 下载 ...

  7. HttpClient 请求WebApi

    HttpClient client = new HttpClient(); client.BaseAddress = new Uri(ConfigurationManager.AppSettings[ ...

  8. ng-if和ng-show的区别

    angularJS中的ng-show.ng-hide.ng-if指令都可以用来控制dom元素的显示或隐藏.ng-show和ng-hide根据所给表达式的值来显示或隐藏HTML元素.当赋值给ng-sho ...

  9. js Array 学习

    摘抄自<JavaScript权威指南> 1.join()返回生成的字符串.数组元素转化为字符串,拼接.默认分隔符:“,”. 2.reverse()返回逆序的数组,替换.数组中的元素倒序. ...

  10. Django学习(三) Django模型创建以及操作

    在Django中可以建立自己的模型Model,这里对应Java里的实体类,跟数据库表是对应的.其中用到了django.db模块中的models.如下图所示: mysite/news/models.py ...