Spring4.0学习笔记(10) —— Spring AOP
个人理解:
Spring AOP 与Struts 的 Interceptor 拦截器 有着一样的实现原理,即通过动态代理的方式,将目标对象与执行对象结合起来,降低代码之间的耦合度,主要运用了Proxy这个静态类,通过newProxyInstance方法将目标对象与插入对象进行结合,java中推崇面向接口编程,因此,首先创建一个接口类,定义待实现的方法
package com.spring.aop;
public interface ICaculate {
int add(int i,int j);
int sub(int i,int j);
int mul(int i,int j);
int div(int i,int j);
}
接着,定义实现类,实现接口中的方法
package com.spring.aop;
public class Caculate implements ICaculate{
public int add(int i, int j) {
int result = i + j;
return result;
}
public int div(int i, int j) {
int result = i / j;
return result;
}
public int mul(int i, int j) {
int result = i * j;
return result;
}
public int sub(int i, int j) {
int result = i - j;
return result;
}
}
最核心的部分,建立工厂类,使用动态代理,需要实现InvocationHandler接口,在这里,定义为内部类,直接在内部类中实现Invoke方法
package com.spring.aop; import java.lang.reflect.*;
import java.util.Arrays; /**
* 切面:如验证、前置日志、后置日志
* 通知:切面必须完成的工作
* 目标:被通知的对象,此例为业务逻辑
* 代理:向目标对象应用通知之后创建的对象
* @author 凯
*
*/
public class CaculateLoggingProxy { //代理的对象
private ICaculate target; public CaculateLoggingProxy(ICaculate target) {
this.target = target;
} @SuppressWarnings({"unchecked" })
/**
* 接口也可以定义为返回类型
*/
public ICaculate getLoggingProxy(){
ICaculate proxy = null;
//代理对象由哪一个类加载器加载
ClassLoader loader = target.getClass().getClassLoader();
//代理对象的类型,其中有哪些方法
Class [] interfaces = new Class[]{ICaculate.class}; InvocationHandler h = new InvocationHandler() {
/**
* proxy: 正在返回的那个代理对象,一般情况下,在invoke 方法中都不使用该对象
* method: 正在被调用的方法
* args: 调用方法时传入的参数
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//方法名
String methodName = method.getName();
System.out.println("begin with = ["+methodName+"] params = ["+Arrays.asList(args)+"]");
//执行方法
Object result = method.invoke(target, args);
System.out.println("end with = ["+methodName+"] result = ["+result+"]");
return result;
}
};
proxy = (ICaculate)Proxy.newProxyInstance(loader, interfaces, h);
return proxy;
}
}
写一个测试类,测试是否成功
package com.spring.aop;
public class Main {
public static void main(String[] args) {
ICaculate target = new Caculate();
ICaculate proxy = new CaculateLoggingProxy(target).getLoggingProxy();
int a = proxy.add(1, 1);
System.out.println(a);
int b = proxy.add(1, 2);
System.out.println(b);
}
}
输出结果:
begin with = [add] params = [[1, 1]]
end with = [add] result = [2]
2
begin with = [add] params = [[1, 2]]
end with = [add] result = [3]
3
Spring4.0学习笔记(10) —— Spring AOP的更多相关文章
- Spring 源码学习笔记10——Spring AOP
Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...
- Spring4.0学习笔记(11) —— Spring AspectJ 的五种通知
Spring AspectJ 一.基于注解的方式配置通知 1.额外引入的jar包: a) com.springsource.org.aopalliance-1.0.0.jar b) com.sprin ...
- Spring4.0学习笔记(9) —— Spring泛型依赖注入
1.定义基础仓库 package com.spring.generic.di; public class BaseRepository<T> { } 2.定义基础服务层 package c ...
- 【学习笔记】Spring AOP注解使用总结
Spring AOP基本概念 是一种动态编译期增强性AOP的实现 与IOC进行整合,不是全面的切面框架 与动态代理相辅相成 有两种实现:基于jdk动态代理.cglib Spring AOP与Aspec ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring AOP(面向切面编程)
面向切面编程(AOP)和面向对象编程(OOP)类似,也是一种编程模式.Spring AOP 是基于 AOP 编程模式的一个框架,它的使用有效减少了系统间的重复代码,达到了模块间的松耦合目的. AOP ...
- Spring4.0学习笔记(7) —— 通过FactoryBean配置Bean
1.实现Spring 提供的FactoryBean接口 package com.spring.facoryBean; import org.springframework.beans.factory. ...
- Spring4.0学习笔记(6) —— 通过工厂方法配置Bean
1.静态工厂方法: bean package com.spring.factory; public class Car { public Car(String brand) { this.brand ...
- Spring4.0学习笔记(5) —— 管理bean的生命周期
Spring IOC 容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务 Spring IOC 容器对Bean的生命周期进行管理的过程: 1.通过构造器或工厂方法 ...
- Spring4.0学习笔记(4) —— 使用外部属性文件
1.配置xml文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="htt ...
随机推荐
- 解决weblogic Managed Server启动非常慢的情况
jdk版本:1.7.0_79 查看控制台日志停留在如下地方: . . JAVA Memory arguments: -Xms2048m -Xmx4096m -XX:MaxPermSize=512m . ...
- 【转】处理新版Chrome书签、菜单字体不清晰
原文网址:http://www.nmgwddj.com/share/311.html 昨晚打开Chrome浏览器,忽然感觉有些什么东西变了,仔细看了半天忽然发现,书签中的字体和网页中右键的字体全部都变 ...
- 图论(费用流):BZOJ 4514 [Sdoi2016]数字配对
4514: [Sdoi2016]数字配对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 820 Solved: 345[Submit][Status ...
- VS2010中的自动化测试(5)——Web性能测试
原文地址:http://www.cnblogs.com/heqichang/archive/2011/11/20/2256478.html 类目见这里:http://www.cnblogs.com/h ...
- lightoj 1063 求割点
题目链接:http://lightoj.com/volume_showproblem.php?problem=1063 #include<cstdio> #include<cstri ...
- JavaScript中的[]和{}
最早开始对js中括号的使用有疑问是在交互2值的时候: a = [b,b=a][0]; 详见JavaScript交换两个变量值的七种解决方案 因为 [[]][0] 的意思是:获取 [[]] 的第一个元素 ...
- 自己去看dubbo源码
编译Dubbo源码并测试 2014.09.24 | Comments 转http://blog.javachen.com/2014/09/24/compile-and-test-dubbo.html ...
- php数组和字符串转换
PHP 中由于数组和字符串这两种变量类型是如此常用,以至于 PHP 具有两个函数,可以在字符串和数组之间互相进行转换. $array=explode(separator,$string); $stri ...
- SQL Server不区分大小写的问题
SQL Server不区分大小写的问题 默认情况下,SQL Server不区分大小写,如果数据表TEST的TNAME列中有数据“abcd”和“Abcd”, 如果使用查询语句:select * fr ...
- Java基础知识强化之IO流笔记16:IO流的概述和分类
1. IO流的分类 流向: (1)输入流:读取数据到内存 (2)输出流:写入数据到硬盘(磁盘) 操作的数据类型: (1)字节流:操作的数据是字节 ...