Spring的AOP实例
*
* Date: 2012-05-19
*
* Project: AOPSample
*
* Titile: Spring使用AOP
*
1. Spring对AOP的支持有N种配置方法,包括:
(1). 手动配置advice, advisor, proxyBean等【优点:可以使用POJO切面; 缺点;XML配置冗余繁杂】
(2). 使用org.aopalliance支持的@Aspectj配置【优点:简化XML配置; 缺点:要将切面手动用@Aspect声明】
(3). 基于上述(2)方法的改进,使用<aop:config>元素配置【优点:XML配置明朗,接受POJO切面;缺点:XML配置语法较(2)方法多】
通过对每点方法的优劣分析,(3)的配置方法脱颖而出,建议成为日后开发首选配置方案。
2. 实体项目(AOP)设计思路
a. 项目背景:
上班族每天上班流程:首先打卡签到(check in)->工作(work)->下班打卡签离(check out)
b. 切面抽象思考:
上班族专注的领域业务是work,而签到checkIn和checkOut是公共模块,故将Checker抽象为一个切面类,包含checkIn( )和checkOut( )两个行为;
上班族是个各种职业集合的群体,故科抽象为一个接口Worker,含有一个行为work( ):void;
接口Worker可以由多种职业具体实现,本例用Programmer和Teacher两个类实现。
3. 项目实例:
3.1项目文件组织架构
3.2具体源码:
3.2.1Checker.java源码:
1 package aopsample.aspect; 2 3 /** 4 * 切面类Checker,负责工人的签到签离业务 5 */ 6 public class Checker { 7 //签到 8 public void checkIn() { 9 System.out.println("check in"); 10 } 11 //签离 12 public void checkOut() { 13 System.out.println("check out"); 14 } 15 16 }
3.2.2Worker.java源码:
1 package aopsample.target; 2 3 /** 4 * 工人接口 5 */ 6 public interface Worker { 7 void work(); 8 }
3.2.3 WorkerImplProgrammer.java源码:
1 package aopsample.target.impl; 2 3 import aopsample.target.Worker; 4 5 public class WorkerImplProgrammer implements Worker { 6 7 @Override 8 public void work() { 9 System.out.println("Typing codes ..."); 10 } 11 12 }
3.2.4 WorkerImplTeacher.java源码:
1 package aopsample.target.impl; 2 3 import aopsample.target.Worker; 4 5 public class WorkerImplTeacher implements Worker { 6 7 @Override 8 public void work() { 9 System.out.println("having cource for students..."); 10 } 11 12 }
3.2.5 WorkerTest.java源码:
1 package aopsample.target; 2 3 import org.junit.Before; 4 import org.junit.Test; 5 import org.springframework.context.ApplicationContext; 6 import org.springframework.context.support.ClassPathXmlApplicationContext; 7 8 import aopsample.target.Worker; 9 10 11 /** 12 * Junit测试类,用于调用测试Worker中的切面运行。 13 */ 14 public class WorkerTest { 15 16 private ApplicationContext context; 17 18 @Before 19 public void setUp() throws Exception { 20 context = new ClassPathXmlApplicationContext("applicationContext.xml"); 21 } 22 23 @Test 24 public void test() { 25 //programmer 26 Worker w1 = (Worker)context.getBean("xyz"); 27 w1.work(); 28 29 //teacher 30 Worker w2 = (Worker)context.getBean("ff"); 31 w2.work(); 32 33 } 34 35 }
3.2.6 applicationContext.xml配置内容:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 7 http://www.springframework.org/schema/aop 8 http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> 9 10 <!-- Aspect --> 11 <bean id="checker" class="aopsample.aspect.Checker" /> 12 13 <!-- TargetBean --> 14 <bean id="xyz" class="aopsample.target.impl.WorkerImplProgrammer" /> 15 <bean id="ff" class="aopsample.target.impl.WorkerImplTeacher" /> 16 17 <!--AOP configuration --> 18 <aop:config> 19 <aop:aspect ref="checker"> 20 <aop:pointcut id="working" 21 expression="execution(* *.work(..))" /> 22 <aop:before 23 pointcut-ref="working" method="checkIn" /> 24 <aop:after-returning 25 pointcut-ref="working" method="checkOut" /> 26 </aop:aspect> 27 </aop:config> 28 </beans>
4. 测试WorkerTest.java结果:
check in
Typing codes ...
check out
check in
having cource for students...
check out
5. 项目jar包引用说明
5.1 spring部分
(1) springframework - 3.1
(2) aopalliance-1.0.jar (调用当中的org.aopalliance.aop.Advice类)
(3) commons-logging-1.1.1.jar
5.2 Junit部分
junit-4.10.jar