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的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 主要 ...
随机推荐
- Oracle11g的注册表清理
每次卸载了oracle总是有一堆注册表没有清理,麻烦,特地在网上找了一个较为完整的,全文复制过来,存自己这里,如下: <<< Windows Registry Editor Vers ...
- IIS7如何显示详细错误信息
使用Vista或Win7操作系统的用户在不断增加,用Win7旗舰版开发测试程序程序人员也与日俱增,Win7下测试程序时,如果程序出 错,IIS7会提示HTTP Error 500 - Internal ...
- Linq的查询操作符
Linq有表达式语法和调用方法的语法.两者是可以结合使用,通常情况下也都是结合使用.表达式语法看上去比较清晰而调用方法的语法实现的功能更多,在此文章中介绍的是表达式语法.方法语法可以看System.L ...
- codeforces 335A Banana(贪心)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Banana Piegirl is buying stickers for ...
- C++程序设计实践指导1.12数组中数据线性变换改写要求实现
改写要求1:分别用指针pa.pb代替数组 改写要求2:从键盘输入data元素 元素个数任意,输入0结束 #include <cstdlib> #include <iostream&g ...
- (原)Ubuntu16中编译caffe
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5797526.html 参考网址: http://caffe.berkeleyvision.org/in ...
- mysql中函数DISTINCT,group by,CONCAT及GROUP_CONCAT的使用
一:DISTINCT 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是 ...
- JavaScript match 和 exec 备忘笔记
这是一道广为引用的面试题:var someText="web2.0 .net2.0"; var pattern=/(\w+)(\d)\.(\d)/g; var outCome_ex ...
- 处理PHP中字符串的常用操作及函数
1. 确定一个字符串的长度 这是最为常见和基础的例子,对于确定一个字符串的长度,我们应该使用strlen()函数,比如要获取下面字符串$text 的长度: $text = "sunny da ...
- 【Python网络编程】多线程聊天软件程序
课程设计的时候制作的多线程聊天软件程序 基于python3.4.3 import socket import pickle import threading import tkinter import ...