通过一个小例子演视怎么使用 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的更多相关文章

  1. Spring入门(9)-AOP初探

    Spring入门(9)-AOP初探 0. 目录 什么是面向切面编程 AOP常见术语 AOP实例 参考资料 1. 什么是面向切面编程 Aspect Oriented Programming(AOP),即 ...

  2. Spring入门导读——IoC和AOP

    和MyBatis系列不同的是,在正式开始Spring入门时,我们先来了解两个关于Spring核心的概念,IoC(Inverse of Control)控制反转和AOP()面向切面编程. 1.IoC(I ...

  3. Spring入门(二)— IOC注解、Spring测试、AOP入门

    一.Spring整合Servlet背后的细节 1. 为什么要在web.xml中配置listener <listener> <listener-class>org.springf ...

  4. Spring入门4.AOP配置深入

    Spring入门4.AOP配置深入 代码下载 链接: http://pan.baidu.com/s/11mYEO 密码: x7wa 前言: 之前学习AOP中的一些概念,包括连接点.切入点(pointc ...

  5. Spring入门3.AOP编程

    Spring入门3.AOP编程 代码下载: 链接: http://pan.baidu.com/s/11mYEO 密码: x7wa 前言: 前面学习的知识是Spring在Java项目中的IoC或DJ,这 ...

  6. Spring入门IOC和AOP学习笔记

    Spring入门IOC和AOP学习笔记 概述 Spring框架的核心有两个: Spring容器作为超级大工厂,负责管理.创建所有的Java对象,这些Java对象被称为Bean. Spring容器管理容 ...

  7. Spring入门之AOP篇

    听了几节IT黑马营的SPRING课程,照着例程写了一个SPRING 中AOP的例子:  一.准备工作 下载复制或配置JAR包.图方便,我将下载的SPRING包都加上去了.另外还需要aspectj的两个 ...

  8. Spring入门(十):Spring AOP使用讲解

    1. 什么是AOP? AOP是Aspect Oriented Programming的缩写,意思是:面向切面编程,它是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 可以认为AOP是 ...

  9. Spring入门篇——AOP基本概念

    1.什么是AOP及实现方式 什么是AOP AOP:Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 主要 ...

随机推荐

  1. java加载资源文件

    className.class.getResourceAsStream 用法: 第一: 要加载的文件和.class文件在同一目录下,例如:com.x.y 下有类Test.class ,同时有资源文件c ...

  2. YUI Array 之 indexOf(索引值|搜索)

    YUI原码 YUI indexOfYArray.indexOf = Lang._isNative(Native.indexOf) ? function (array, value, from) { r ...

  3. 用实例一步步教你写Jquery插件

    最近Web应用程序中越来越多地用到 了JQuery等Web前端技术.这些技术框架有效地改善了用户的操作体验,同时也提高了开发人员构造丰富客户 端UI的效率.JQuery本身提供了丰富的操作,但是,有时 ...

  4. oc语言--BLOCK和协议

    一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. BOLCK和函数的相似性:(1)可以保存代码(2 ...

  5. iOS开发之网络篇-各种网络状态码

    1xx消息 这一类型的状态码,代表请求已被接受,需要继续处理.这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束.由于HTTP/1.0协议中没有定义任何1xx状态码,所以除非在某些试 ...

  6. Hibernate中3种结果转换的详细说明(转)

    Hibernate中3种结果转换的详细说明 在hibernate使用的过程中.我们通常需要对结果进行解释. Hibernate为我们提供了以下3种解释方法: Transformers.ALIAS_TO ...

  7. C# 反射_基础

    反射用于在程序运行过程中,获取类里面的信息或发现程序集并运行的一个过程.通过反射可以获得.dll和.exe后缀的程序集里面的信息.使用反射可以看到一个程序集内部的类,接口,字段,属性,方法,特性等信息 ...

  8. Fragment销毁时replace和add两个方法的区别

    这个首先从一个bug说起,如图:   我们都知道fragment切换有两种方式: 1. replace方式 transaction.replace(R.id.content, IndexFragmen ...

  9. secureCRT使用VIM 像LINUX中那样对语法高亮

    1.在SecureCRT中 secureCRT使用VIM时对语法高亮 其实不是secureCRT的功能,而是VIM的 设置:Options ->Session Options -> Ter ...

  10. VS Visual Studio connection(); Microsoft Visulal Studio vNext & Azure

    http://www.visualstudio.com/connect-event-vs