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. linux安装perl模块

    查询perl CPAN模块   shell>perl -MCPAN -e shell cpan>install module_name   手动安装perl CPAN模块 从 CPAN(h ...

  3. CentOS 7 U盘安装解决找不到U盘问题

    在使用U盘进入CentOS7系统安装选项时,按下Tab键,在屏幕下方出现:vmlinuz initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x ...

  4. iOS 生成.a文件

    一.新建一个工程,选择Cocoa Touch Static Library. 二. 三. 四. 五. 六. 七. 八. 九. 十. 十一. 十二. 十三.打开终端,输入以下命令将真机和模拟器中的.a合 ...

  5. Struts2 工作流程

    Struts2使用了WebWork的设计核心(XWork),在内部使用拦截器处理用户请求,从而允许用户业务逻辑控制器和ServletAPI分离.Struts2内部是一个MVC架构,Struts2 的核 ...

  6. mysql 命令

    1.查看数据库: mysql> show databases; 2.使用数据库 mysql> use mysqldata; 3.查看数据表 mysql> show tables; 4 ...

  7. Linux下MySql出现#1036 – Table ‘ ‘ is read only 错误解决方法

    本文为转载内容,感谢原作者.原文出自:http://zhaoxiaoru39.blog.163.com/blog/static/609552192012511104730115/ 我遇到的问题是:在n ...

  8. javaSE读取Properties文件的六种方法

    使用JavaSEAPI读取Properties文件的六种方法 1.使用java.util.Properties类的load()方法 示例:InputStreamin=lnewBufferedInput ...

  9. MYSQL 维护表的常用 5 方法

    方法 1. analyze table: 本语句用于分析和存储表的关键字分布.在分析期间,使用一个读取锁定对表进行锁定.这对于MyISAM, BDB和InnoDB表有作用. 方法 2. CHECK T ...

  10. python学习day12

    目录 html结构与标签 css样式   html结构之head <head> 标签用于定义文档的头部,它是所有头部元素的容器.<head> 中的元素可以引用脚本.指示浏览器在 ...