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

 



posted @ 2012-05-19 19:52  qx.zhong  阅读(217)  评论(0编辑  收藏  举报