Spring 入门 AOP
通过一个小例子演视怎么使用 Spring 现实面向切面编程。
导入 Spring 所需要的包
spring-framework-2.5.6 版需要导入以下包:
1.----- spring.jar
2.----- commons-logging.jar
3.----- aspectjrt.jar
4.----- aspectjweaver.jar
5.----- cglib-nodep-2.1_3.jar
spring-framework-3.2.4 版需要导入以下包:
1.----- spring-core-3.2.4.RELEASE.jar
2.----- spring-beans-3.2.4.RELEASE.jar
3.----- spring-context-3.2.4.RELEASE.jar
4.----- spring-expression-3.2.4.RELEASE.jar
5.----- commons-logging.jar
6.----- aspectjweaver.jar
7.----- aspectjrt.jar
8.----- aopalliance.jar(spring项目里不提供,要到网上下)
代码:
Book.java:
public class Book {
private int id;
private String name;
//省略get set方法....
}
BookService.java:
public class BookService {
public void save(Book book){
System.out.println("save:"+book.getName());
}
}
main方法:
public static void main(String[] args) {
ApplicationContext appctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Book b = (Book)appctx.getBean("book");
b.setName("j2ee");
BookService bs = (BookService)appctx.getBean("bookService");
//调用BookService的save方法。
bs.save(b);
((ClassPathXmlApplicationContext)appctx).close();
}
通过使用Spring AOP 在调用BookService的save方法前后各加上一些业务(如记录日志,时间等等)方便起见,这里简单输出两句话。
使用配置文件配置AOP(Schema)
添加切面类 Log.java :
public class Log {
//在目标方法执行前调用此方法,JoinPoint:封装了目标方法的一些信息(如类名,参数等等)
public void before(JoinPoint jp){
System.out.println(jp.getSignature().getName()+":开始执行----------");
// 获取被代理对象
System.out.println("被代理对象:"+jp.getTarget().getClass());
// 获取被代理方法
System.out.println("被代理方法:"+jp.getSignature());
// 获取方法参数
System.out.println("方法参数:"+jp.getArgs());
}
//在目标方法执行完后调用此方法,Object rn:目标方法的返回值(void为null)
public void afterreturning(JoinPoint jp,Object rn){
System.out.println(jp.getSignature().getName()+":执行完毕----------");
System.out.println(rn);
}
}
Spring配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> <bean id="book" class="com.startspring.Book" />
<bean id="bookService" class="com.startspring.BookService" />
<bean id="log" class="com.startspring.aop.Log" /> <aop:config>
<!-- 指定切入点 -->
<aop:pointcut id="bookSave" expression="execution(public void com.startspring.BookService.save(com.startspring.Book))" />
<!-- 指定切面 -->
<aop:aspect id="aspect" ref="log">
<!-- 前置通知(增强):指明切入点方法执行前执行 “before”方法-->
<aop:before method="before" pointcut-ref="bookSave"/>
<!-- 后置通知(增强):指明切入点方法完成后执行 “afterreturning”方法,参数rn是目标方法的返回值-->
<aop:after-returning method="afterreturning" pointcut-ref="bookSave" returning="rn"/>
</aop:aspect>
</aop:config>
</beans>
注:要使用aop:标签要先引入aop命名空间(第4、7、8行)
使注解配置AOP(Annotation)
Spring配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> <context:component-scan base-package="com.startspring" />
<!-- 要使用aspect的注解,先要在配置文件中添加如下代码:启动自动匹配注解类-->
<aop:aspectj-autoproxy /> </beans>
添加切面类 Log.java :
@Component
@Aspect //声明该类为切面类
public class Log {
//前置通知(增强):指明切入点方法执行前执行该方法
//后面参数指定了插入点
@Before("execution(public void com.startspring.BookService.save(com.startspring.Book))")
public void before(JoinPoint jp){
System.out.println(jp.getSignature().getName()+":开始执行----------");
// 获取被代理对象
System.out.println("被代理对象:"+jp.getTarget().getClass());
// 获取被代理方法
System.out.println("被代理方法:"+jp.getSignature());
// 获取方法参数
System.out.println("方法参数:"+jp.getArgs());
} //后置通知(增强):指明切入点方法执行完毕执行该方法
//returning="rn" :声明参数rn是目标方法的返回值(void为null)
@AfterReturning(returning="rn",value="execution(public void com.startspring.BookService.save(com.startspring.Book))")
public void afterreturning(JoinPoint jp,Object rn){
System.out.println(jp.getSignature().getName()+":开始完毕----------");
System.out.println(rn); }
}
这里Bean的声明也采用了注解,要在Book.java和BookService.java里添加相应的注解。或在配置文件中写<bean>也是可以的。
通过现实接口配置AOP
添加切面类 Log.java :
/*
* 通过实现 MethodBeforeAdvice 实现前置处理。AfterReturningAdvice:后置处理。
* 分别重写方法:before,afterReturning
*/
public class Log implements MethodBeforeAdvice,AfterReturningAdvice{ //method:表示切入点方法.args:切入点方法的参数.target:目标对象
public void before(Method method, Object[] args, Object target)throws Throwable {
System.out.println(method.getName()+":开始执行----------");
// 获取被代理对象
System.out.println("被代理对象:"+target);
// 获取被代理方法
System.out.println("被代理方法:"+method);
// 获取方法参数
System.out.println("方法参数:"+args); } //result表示目标方法的返回值
public void afterReturning(Object result, Method method, Object[] args,Object target) throws Throwable {
System.out.println(method.getName()+":执行完毕----------"); System.out.println(result); }
}
Spring配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> <bean id="book" class="com.startspring.Book" />
<bean id="bookService" class="com.startspring.BookService" />
<bean id="log" class="com.startspring.aop.Log" /> <aop:config>
<!-- 指定切入点 -->
<aop:pointcut id="bookSave" expression="execution(public void com.startspring.BookService.save(com.startspring.Book))" />
<!-- advice-ref:指定切面 pointcut-ref:指定切入点-->
<aop:advisor advice-ref="log" pointcut-ref="bookSave"/>
</aop:config>
</beans>
Spring 入门 AOP的更多相关文章
- Spring入门(9)-AOP初探
Spring入门(9)-AOP初探 0. 目录 什么是面向切面编程 AOP常见术语 AOP实例 参考资料 1. 什么是面向切面编程 Aspect Oriented Programming(AOP),即 ...
- Spring入门导读——IoC和AOP
和MyBatis系列不同的是,在正式开始Spring入门时,我们先来了解两个关于Spring核心的概念,IoC(Inverse of Control)控制反转和AOP()面向切面编程. 1.IoC(I ...
- Spring入门(二)— IOC注解、Spring测试、AOP入门
一.Spring整合Servlet背后的细节 1. 为什么要在web.xml中配置listener <listener> <listener-class>org.springf ...
- Spring入门4.AOP配置深入
Spring入门4.AOP配置深入 代码下载 链接: http://pan.baidu.com/s/11mYEO 密码: x7wa 前言: 之前学习AOP中的一些概念,包括连接点.切入点(pointc ...
- Spring入门3.AOP编程
Spring入门3.AOP编程 代码下载: 链接: http://pan.baidu.com/s/11mYEO 密码: x7wa 前言: 前面学习的知识是Spring在Java项目中的IoC或DJ,这 ...
- Spring入门IOC和AOP学习笔记
Spring入门IOC和AOP学习笔记 概述 Spring框架的核心有两个: Spring容器作为超级大工厂,负责管理.创建所有的Java对象,这些Java对象被称为Bean. Spring容器管理容 ...
- Spring入门之AOP篇
听了几节IT黑马营的SPRING课程,照着例程写了一个SPRING 中AOP的例子: 一.准备工作 下载复制或配置JAR包.图方便,我将下载的SPRING包都加上去了.另外还需要aspectj的两个 ...
- Spring入门(十):Spring AOP使用讲解
1. 什么是AOP? AOP是Aspect Oriented Programming的缩写,意思是:面向切面编程,它是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 可以认为AOP是 ...
- Spring入门篇——AOP基本概念
1.什么是AOP及实现方式 什么是AOP AOP:Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 主要 ...
随机推荐
- 1.iOS第一个简单APP
大纲: iOS系统发展 UI和OC 简单的APP程序 程序的生命周期 1.iOS的系统发展 从1983年OC程序开始发展到2015年,30多年的时间,但这依然不是一个十分完善的语言,可以说现在都没 ...
- java学习基础
Q: What if the static modifier is removed from the signature of the main method? A: Program compiles ...
- Eclipse控制台显示Tomcat日志
今天看一篇学习Struts的博文,文章里面提到从生成的日志,结果,怎么鼓捣都看不到.心情也跟着烦躁了.于是晚饭后出去散步,冷静一下,然后决定晚上一定搞掂这个问题.这不,搞掂了,写篇博文记录一下. St ...
- js数组小结
1.js数组使用sort()排序 var a = ["1","12","3","4","0"]; d ...
- android listview Caused by: java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
android listview 适配器在多种类型viewType报错: Caused by: java.lang.ArrayIndexOutOfBoundsException: length=3; ...
- gerrit升级到16.04之后连接不到服务器
升级到ubuntu-16.04后,发现Git-review代码报错: Unable to negotiate with 10.140.110.77 port 29418: no matching ke ...
- [C++程序设计]函数的递归调用
在调用一个函数的过程中又出现直接或间接地调用 该函数本身,称为函数的递归(recursive)调用. 包含递归调用的函数称为递归函数. 在实现递归时,在时间和空间上的开销比较大 求n! #includ ...
- 2015网易校招Java开发工程师(技术架构)在线笔试题
1. 程序和进程的本质区别是? A.在外存和内存存储 B.非顺序和顺序执行机器指令 C.独占使用和分时使用计算机资源 D.静态和动态特征 参考答案分析: 进程与应用程序的区别: 进程(Process ...
- Meteor Shower(POJ 3669)
Meteor Shower Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12816 Accepted: 3451 De ...
- PIL参考手册
Python Imaging Library Handbook http://effbot.org/imagingbook/pil-index.htm 随机验证码的产生 import Image, I ...