通过一个小例子演视怎么使用 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. Cortex-M3知识点

    1.不再像别的ARM7那样从thumb状态和ARM状态来回切换 Thumb-2指令集横空出世,Cortex-M3不支持ARM指令集 2.BKP备份寄存器(42个16位寄存器组成),用来存储用户应用程序 ...

  2. (转) C/C++中结构体(struct)知识点强化

    本文转载于 http://pcedu.pconline.com.cn/empolder/gj/c/0503/567942_all.html#content_page_1 所有程序经过本人验证,部分程序 ...

  3. [Leetcode] Find the minimum in rotated sorted array

    我在Github上新建了一个解答Leetcode问题的Project, 大家可以参考, 目前是Java 为主,里面有leetcode上的题目,解答,还有一些基本的单元测试,方便大家起步. 题目: Su ...

  4. UltraEdit v17.10.0,注册机,注册码

    1,UltraEdit注册机 :点击下载 2,断掉网络,进入UltraEdit软件,依次点击:帮助——注册/激活——激活,会提示你进行脱机激活,点击脱机激活后,将用户码1和用户码2 分别输入注册机的u ...

  5. js抽象类和抽象方法

    js中模拟抽象类:在父类中调用一个未定义的方法,这个方法在子类中必须被实现. 1, 模拟类的工厂模式 //基类 var Class = { //基类的静态方法 creat:function(){ // ...

  6. (转)set集合的应用

    set集合的应用 python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), diffe ...

  7. Onthink_项目后总结

    ---------------------------------------写代码不孤独__小小代(http://www.cnblogs.com/xiaoxiaodai/) 经过一段时间的沉寂,项目 ...

  8. 基于epoll的聊天室程序

    epoll相对于poll和select这两个多路复用的I/O模型更加的高效.epoll的函数很简单,麻烦的地方在于水平触发和边沿触发. 用张图来说明下 ET(边沿)只是在状态反转时触发,比如从不可读到 ...

  9. Socket也有专门的Unicode版本

    https://www.chilkatsoft.com/refdoc/wcppCkSocketWRef.html https://www.chilkatsoft.com/refdoc/vcCkSock ...

  10. 关于MySql链接url参数的设置

    jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=t ...