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 ...
随机推荐
- 【REST API】
微信公众平台开发者文档 RESTful API 设计最佳实践 登录判断写去接口里 PUT 新建一个资源POST 更新一个资源GET 查看一个资源DELETE 删除一个资源
- javascript 基础学习整理
1. javascript是动态语言,脚本语言,弱类型语言. 2. javascript代码在html文件中的位置安排,放在<body></body>内部与外部的区别.如何引用 ...
- 根据标点符号分行,StringBuilder的使用;将字符串的每个字符颠倒输出,Reverse的使用
一:根据标点符号分行,上图,代码很简单 二:代码 using System; using System.Collections.Generic; using System.ComponentModel ...
- FZYZOJ-1880 【UFO】水管
P1880 -- [ufo]水管 时间限制:1000MS 内存限制:131072KB 通过/提交人数:32/100 状态: 标签: 数学问题-组合数学 无 ...
- HDOJ(HDU) 2504 又见GCD(利用最大公约数反推)
Problem Description 有三个正整数a,b,c(0 import java.util.Scanner; public class Main{ public static void ma ...
- 动态规划——B 最大高度问题
B - LIS Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Stat ...
- loadrunner11有效的license
下载安装deletelicense.exe先1)退出程序,把下载文件中的lm70.dll和mlr5lprg.dll覆盖掉..\HP\LoadRunner\bin下的这两个文件 2)注意,win7的话一 ...
- Template 使用注意问题和范例
1. 基本定义 模板是 2. 分类 2.1 函数模板 (1) 作用: 函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计. (2)申明方法: template ...
- Apache-Tika解析XML文档
通常在使用爬虫时,爬取到网上的文章都是各式各样的格式处理起来比较麻烦,这里我们使用Apache-Tika来处理XML格式的文章,如下: package com.mengyao.tika.app; im ...
- openfire for mac 无法启动
http://blog.csdn.net/winer888/article/details/49886281 ①:sudo chmod -R 777 /usr/local/openfire/bin ② ...