20160126--springaop
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的更多相关文章
- Spring-AOP实践 - 统计访问时间
公司的项目有的页面超级慢,20s以上,不知道用户会不会疯掉,于是老大说这个页面要性能优化.于是,首先就要搞清楚究竟是哪一步耗时太多. 我采用spring aop来统计各个阶段的用时,其中计时器工具为S ...
- Spring-Aop入门
(一)Aop术语定义 1.通知(advice) 通知定义了切面要做什么工作,即调用的方法,同时定义了什么时候做这些工作,即以下五种类型 (1)前置通知(Before) :在目标方法调用之前执行切面方法 ...
- 转-springAOP基于XML配置文件方式
springAOP基于XML配置文件方式 时间 2014-03-28 20:11:12 CSDN博客 原文 http://blog.csdn.net/yantingmei/article/deta ...
- SpringAOP详解(转载大神的)
AOP(Aspect-Oriented Programming)这个东西,名字与 OOP 仅差一个字母,其实它是对 OOP 编程方式的一种补充,并非是取而代之.翻译过来就是"面向方面编程&q ...
- spring-aop学习
SpringAOP学习 author:luojie 1. AOP中的基本概念 AOP的通用术语,并非spring java所特有.很遗憾AOP的术语不是特别的直观.但如果让Spring java来 ...
- SpringAOP之静态代理
一.SpringAOP: ⒈AOP:Aspect Oriented Programming 面向切面编程, 实现的是核心业务和非核心业务之间的的分离,让核心类只做核心业务,代理类只做非核心业务. ⒉ ...
- springaop实现登陆验证
1.首先配置好springmvc和springaop 2.先写好登陆方法,通过注解写代理方法 通过代理获得登陆方法的参数方法名,然后再aop代理方法内进行登陆验证 贴出代码 package com.h ...
- spring-aop示例
具体案例放在github上,主要是jar包在上面 https://github.com/guoyansi/spring-aop-example knights.xml <?xml version ...
- 使用SpringAop 验证方法参数是否合法
(原文地址:http://blog.csdn.net/is_zhoufeng/article/details/7683194) 1.依赖包 aspectjweaver.jar 其中Maven的配 ...
- 关于SpringAOP的XML方式的配置
AOP(XML)[理解][应用][重点] 1.AOP基础实例 A.导入jar包 核心包(4个) 日志(2个) AOP(4个) Spring进行AOP开发(1个) ...
随机推荐
- 常用SQL Server分页方式
假设有表ARTICLE,字段ID.YEAR...(其他省略),数据53210条(客户真实数据,量不大),分页查询每页30条,查询第1500页(即第45001-45030条数据),字段ID聚集索引,YE ...
- linux安装perl模块
查询perl CPAN模块 shell>perl -MCPAN -e shell cpan>install module_name 手动安装perl CPAN模块 从 CPAN(h ...
- CentOS 7 U盘安装解决找不到U盘问题
在使用U盘进入CentOS7系统安装选项时,按下Tab键,在屏幕下方出现:vmlinuz initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x ...
- iOS 生成.a文件
一.新建一个工程,选择Cocoa Touch Static Library. 二. 三. 四. 五. 六. 七. 八. 九. 十. 十一. 十二. 十三.打开终端,输入以下命令将真机和模拟器中的.a合 ...
- Struts2 工作流程
Struts2使用了WebWork的设计核心(XWork),在内部使用拦截器处理用户请求,从而允许用户业务逻辑控制器和ServletAPI分离.Struts2内部是一个MVC架构,Struts2 的核 ...
- mysql 命令
1.查看数据库: mysql> show databases; 2.使用数据库 mysql> use mysqldata; 3.查看数据表 mysql> show tables; 4 ...
- Linux下MySql出现#1036 – Table ‘ ‘ is read only 错误解决方法
本文为转载内容,感谢原作者.原文出自:http://zhaoxiaoru39.blog.163.com/blog/static/609552192012511104730115/ 我遇到的问题是:在n ...
- javaSE读取Properties文件的六种方法
使用JavaSEAPI读取Properties文件的六种方法 1.使用java.util.Properties类的load()方法 示例:InputStreamin=lnewBufferedInput ...
- MYSQL 维护表的常用 5 方法
方法 1. analyze table: 本语句用于分析和存储表的关键字分布.在分析期间,使用一个读取锁定对表进行锁定.这对于MyISAM, BDB和InnoDB表有作用. 方法 2. CHECK T ...
- python学习day12
目录 html结构与标签 css样式 html结构之head <head> 标签用于定义文档的头部,它是所有头部元素的容器.<head> 中的元素可以引用脚本.指示浏览器在 ...