个人理解:

    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的更多相关文章

  1. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

  2. Spring4.0学习笔记(11) —— Spring AspectJ 的五种通知

    Spring AspectJ 一.基于注解的方式配置通知 1.额外引入的jar包: a) com.springsource.org.aopalliance-1.0.0.jar b) com.sprin ...

  3. Spring4.0学习笔记(9) —— Spring泛型依赖注入

    1.定义基础仓库 package com.spring.generic.di; public class BaseRepository<T> { } 2.定义基础服务层 package c ...

  4. 【学习笔记】Spring AOP注解使用总结

    Spring AOP基本概念 是一种动态编译期增强性AOP的实现 与IOC进行整合,不是全面的切面框架 与动态代理相辅相成 有两种实现:基于jdk动态代理.cglib Spring AOP与Aspec ...

  5. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring AOP(面向切面编程)

    面向切面编程(AOP)和面向对象编程(OOP)类似,也是一种编程模式.Spring AOP 是基于 AOP 编程模式的一个框架,它的使用有效减少了系统间的重复代码,达到了模块间的松耦合目的. AOP ...

  6. Spring4.0学习笔记(7) —— 通过FactoryBean配置Bean

    1.实现Spring 提供的FactoryBean接口 package com.spring.facoryBean; import org.springframework.beans.factory. ...

  7. Spring4.0学习笔记(6) —— 通过工厂方法配置Bean

    1.静态工厂方法: bean package com.spring.factory; public class Car { public Car(String brand) { this.brand ...

  8. Spring4.0学习笔记(5) —— 管理bean的生命周期

    Spring IOC 容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务 Spring IOC 容器对Bean的生命周期进行管理的过程: 1.通过构造器或工厂方法 ...

  9. Spring4.0学习笔记(4) —— 使用外部属性文件

    1.配置xml文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="htt ...

随机推荐

  1. 解决weblogic Managed Server启动非常慢的情况

    jdk版本:1.7.0_79 查看控制台日志停留在如下地方: . . JAVA Memory arguments: -Xms2048m -Xmx4096m -XX:MaxPermSize=512m . ...

  2. 【转】处理新版Chrome书签、菜单字体不清晰

    原文网址:http://www.nmgwddj.com/share/311.html 昨晚打开Chrome浏览器,忽然感觉有些什么东西变了,仔细看了半天忽然发现,书签中的字体和网页中右键的字体全部都变 ...

  3. 图论(费用流):BZOJ 4514 [Sdoi2016]数字配对

    4514: [Sdoi2016]数字配对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 820  Solved: 345[Submit][Status ...

  4. VS2010中的自动化测试(5)——Web性能测试

    原文地址:http://www.cnblogs.com/heqichang/archive/2011/11/20/2256478.html 类目见这里:http://www.cnblogs.com/h ...

  5. lightoj 1063 求割点

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1063 #include<cstdio> #include<cstri ...

  6. JavaScript中的[]和{}

    最早开始对js中括号的使用有疑问是在交互2值的时候: a = [b,b=a][0]; 详见JavaScript交换两个变量值的七种解决方案 因为 [[]][0] 的意思是:获取 [[]] 的第一个元素 ...

  7. 自己去看dubbo源码

    编译Dubbo源码并测试 2014.09.24 | Comments 转http://blog.javachen.com/2014/09/24/compile-and-test-dubbo.html ...

  8. php数组和字符串转换

    PHP 中由于数组和字符串这两种变量类型是如此常用,以至于 PHP 具有两个函数,可以在字符串和数组之间互相进行转换. $array=explode(separator,$string); $stri ...

  9. SQL Server不区分大小写的问题

    SQL Server不区分大小写的问题   默认情况下,SQL Server不区分大小写,如果数据表TEST的TNAME列中有数据“abcd”和“Abcd”, 如果使用查询语句:select * fr ...

  10. Java基础知识强化之IO流笔记16:IO流的概述和分类

    1. IO流的分类   流向:     (1)输入流:读取数据到内存     (2)输出流:写入数据到硬盘(磁盘)   操作的数据类型:    (1)字节流:操作的数据是字节             ...