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. 克隆虚拟机,如何将克隆虚拟的网卡设置为eth0

    1.先删掉/etc/udev/rules.d/70-persistent-net.rules文件里的eth0,并要记住eth1的那个网卡的mac地址等下要用.2.把那个eth1修改为eth03.编辑网 ...

  2. LINQ 基本子句之三 let

    let子句,可以作为临时变量储存表达式的结果,但是let子句一旦初始化后无法再次进行更改. 1. static void Main(string[] args) { string[] names = ...

  3. js 的try catch

    语法: try { //在此运行代码 } catch(err) { //在此处理错误 } 注意:try...catch 使用小写字母.大写字母会出错. <script language=&quo ...

  4. oracle取分组的前N条数据

    select * from(select animal,age,id, row_number()over(partition by animal order by age desc) row_num ...

  5. GridView事件DataBinding,DataBound,RowCreated,RowDataBound区别及执行顺序分析

    严格的说,DataBinding,DataBound并不是GridView特有的事件,其他的控件诸如ListBox等也有DataBinding,DataBound事件. DataBinding事件MS ...

  6. mysql插入返回当前生成的主键

     1:sql中需要添加属性 keyColumn="base_price_id" keyProperty="basePriceId" useGeneratedKe ...

  7. 用JavaScript将Canvas内容转化成图片的方法

    上周我们花了半天时间开发下一个准备放进Mozilla Marketplace的应用.有一个应用现在非常的火热,那就是Instagram,Facebook花了100万美元收购了它.我们也想有100万美元 ...

  8. HTML5 canvas 在线画笔绘图工具(四)

    HTML5画图命令 图形的绘制是由TDrawHandler与TCommand 协同工作完成. TDrawHandler需要完成以下工作 1.聚集类用于管理绘图的命令 TCommand 2.管理鼠标事件 ...

  9. yii操作数据库(AR)

    模型: 有多少数据表,就建立多少模型 模型其实就是类 我们对数据库进行操作,需要实例化模型类,产生对象 通过对象调用相关的方法,就可以实现数据库的操作   增加记录 [php] $post =newP ...

  10. shopnc数据库 批量修改商品价格

    1.商品价格统一上调50 2.商品价格个别上调50 UPDATE `nc_goods` SET `goods_price` = `goods_price` +50 where goods_id!=10 ...