经过这段日子的学习和使用Spring,慢慢地体会到Spring的优妙之处,正在深入地吸收Spring的精华,
呵呵。现在写的这个只是个简单AOP例子,包括前置通知,后置通知,环绕通知,和目标对象。写这个例子的主要目标只是想让想学AOP的能更快地入门,了解
一下如何去配置AOP里面的东东。
目标对象的接口:IStudent.java
?1
/**
?2 ?*?
?3 ? */
?4 package ?com.dragon.study;
?5
?6 /**
?7 ?*? @author ?dragon
?8 ?*
?9 ? */
10 public ? interface ?IStudent? {
11 ????
12 ???? public ? void ?addStudent(String?name);
13 }
14
?2 ?*?
?3 ? */
?4 package ?com.dragon.study;
?5
?6 /**
?7 ?*? @author ?dragon
?8 ?*
?9 ? */
10 public ? interface ?IStudent? {
11 ????
12 ???? public ? void ?addStudent(String?name);
13 }
14
目标类:StudentImpl.java
?1
/**
?2 ?*?
?3 ? */
?4 package ?com.dragon.study.Impl;
?5
?6 import ?com.dragon.study.IStudent;
?7
?8 /**
?9 ?*? @author ?dragon
10 ?*
11 ? */
12 public ? class ?StudentImpl? implements ?IStudent {
13
14 ????? public ? void ?addStudent(String?name) {
15 ?????????System.out.println( " 欢迎? " + name + " ?你加入Spring家庭! " );
16 ?????}
17 }
18
?2 ?*?
?3 ? */
?4 package ?com.dragon.study.Impl;
?5
?6 import ?com.dragon.study.IStudent;
?7
?8 /**
?9 ?*? @author ?dragon
10 ?*
11 ? */
12 public ? class ?StudentImpl? implements ?IStudent {
13
14 ????? public ? void ?addStudent(String?name) {
15 ?????????System.out.println( " 欢迎? " + name + " ?你加入Spring家庭! " );
16 ?????}
17 }
18
前置通知:BeforeAdvice.java
?1
/**
?2 ?*?
?3 ? */
?4 package ?com.dragon.Advice;
?5
?6 import ?java.lang.reflect.Method;
?7
?8 import ?org.springframework.aop.MethodBeforeAdvice;
?9
10 /**
11 ?*? @author ?dragon
12 ?*
13 ? */
14 public ? class ?BeforeAdvice? implements ?MethodBeforeAdvice {
15
16 ?????? public ? void ?before(Method?method,Object[]?args,?Object?target)
17 ??????????????? throws ?Throwable {
18 ??????????
19 ??????????System.out.println( " 这是BeforeAdvice类的before方法. " );
20 ??????????
21 ??????}
22 }
23
?2 ?*?
?3 ? */
?4 package ?com.dragon.Advice;
?5
?6 import ?java.lang.reflect.Method;
?7
?8 import ?org.springframework.aop.MethodBeforeAdvice;
?9
10 /**
11 ?*? @author ?dragon
12 ?*
13 ? */
14 public ? class ?BeforeAdvice? implements ?MethodBeforeAdvice {
15
16 ?????? public ? void ?before(Method?method,Object[]?args,?Object?target)
17 ??????????????? throws ?Throwable {
18 ??????????
19 ??????????System.out.println( " 这是BeforeAdvice类的before方法. " );
20 ??????????
21 ??????}
22 }
23
后置通知:AfterAdvice.java
?1
/**
?2 ?*?
?3 ? */
?4 package ?com.dragon.Advice;
?5
?6 import ?java.lang.reflect.Method;
?7
?8 import ?org.springframework.aop.AfterReturningAdvice;
?9
10 /**
11 ?*? @author ?dragon
12 ?*
13 ? */
14 public ? class ?AfterAdvice? implements ?AfterReturningAdvice {
15 ????
16 ???? public ? void ?afterReturning(Object?returnValue?,Method?method,
17 ???????????????????Object[]?args,Object?target)? throws ?Throwable {
18 ????????System.out.println( " 这是AfterAdvice类的afterReturning方法. " );
19 ????}
20 ??????
21
22 }
23
?2 ?*?
?3 ? */
?4 package ?com.dragon.Advice;
?5
?6 import ?java.lang.reflect.Method;
?7
?8 import ?org.springframework.aop.AfterReturningAdvice;
?9
10 /**
11 ?*? @author ?dragon
12 ?*
13 ? */
14 public ? class ?AfterAdvice? implements ?AfterReturningAdvice {
15 ????
16 ???? public ? void ?afterReturning(Object?returnValue?,Method?method,
17 ???????????????????Object[]?args,Object?target)? throws ?Throwable {
18 ????????System.out.println( " 这是AfterAdvice类的afterReturning方法. " );
19 ????}
20 ??????
21
22 }
23
环绕通知:CompareInterceptor.java
?1
/**
?2 ?*?
?3 ? */
?4 package ?com.dragon.Advice;
?5
?6 import ?org.aopalliance.intercept.MethodInterceptor;
?7 import ?org.aopalliance.intercept.MethodInvocation;
?8
?9
10 /**
11 ?*? @author ?dragon
12 ?*
13 ? */
14 public ? class ?CompareInterceptor? implements ?MethodInterceptor {
15
16 ?????? public ?Object?invoke(MethodInvocation?invocation)? throws ?Throwable {
17 ??????????Object?result? = ? null ;
18 ?????????String?stu_name? = ?invocation.getArguments()[ 0 ].toString();
19 ????????? if ?(?stu_name.equals( " dragon " )) {
20 ????????????? // 如果学生是dragon时,执行目标方法,
21 ??????????????result = ?invocation.proceed();
22 ??????????????
23 ?????????} ? else {
24 ?????????????System.out.println( " 此学生是 " + stu_name + " 而不是dragon,不批准其加入. " );
25 ?????????}
26 ????????
27 ?????????? return ?result;
28 ??????}
29 }
30
?2 ?*?
?3 ? */
?4 package ?com.dragon.Advice;
?5
?6 import ?org.aopalliance.intercept.MethodInterceptor;
?7 import ?org.aopalliance.intercept.MethodInvocation;
?8
?9
10 /**
11 ?*? @author ?dragon
12 ?*
13 ? */
14 public ? class ?CompareInterceptor? implements ?MethodInterceptor {
15
16 ?????? public ?Object?invoke(MethodInvocation?invocation)? throws ?Throwable {
17 ??????????Object?result? = ? null ;
18 ?????????String?stu_name? = ?invocation.getArguments()[ 0 ].toString();
19 ????????? if ?(?stu_name.equals( " dragon " )) {
20 ????????????? // 如果学生是dragon时,执行目标方法,
21 ??????????????result = ?invocation.proceed();
22 ??????????????
23 ?????????} ? else {
24 ?????????????System.out.println( " 此学生是 " + stu_name + " 而不是dragon,不批准其加入. " );
25 ?????????}
26 ????????
27 ?????????? return ?result;
28 ??????}
29 }
30
配置文件applicationContext.xml
?1
<?
xml?version="1.0"?encoding="UTF-8"
?>
?2 <! DOCTYPE?beans?PUBLIC?"-//SPRING//DTD?BEAN//EN"?"http://www.springframework.org/dtd/spring-beans.dtd" >
?3
?4 < beans >
?5
?6 < bean? id ="beforeAdvice" ?class ="com.dragon.Advice.BeforeAdvice" ></ bean >
?7 < bean? id ="afterAdvice" ?class ="com.dragon.Advice.AfterAdvice" ></ bean >
?8 < bean? id ="compareInterceptor" ?class ="com.dragon.Advice.CompareInterceptor" ></ bean >
?9 < bean? id ="studenttarget" ?class ="com.dragon.study.Impl.StudentImpl" ></ bean >
10
11 < bean? id ="student" ?class ="org.springframework.aop.framework.ProxyFactoryBean" >
12 ?? < property? name ="proxyInterfaces" >
13 ???? < value > com.dragon.study.IStudent </ value >
14 ?? </ property >
15 ?? < property? name ="interceptorNames" >
16 ???? < list >
17 ????? < value > beforeAdvice </ value >
18 ????? < value > afterAdvice </ value >
19 ???? < value > compareInterceptor </ value > ??
20 ???? </ list >
21 ?? </ property >
22 ?? < property? name ="target" >
23 ???? < ref? bean ="studenttarget" />
24 ?? </ property >
25
26 </ bean >
27
28
29
30
31 </ beans >
?2 <! DOCTYPE?beans?PUBLIC?"-//SPRING//DTD?BEAN//EN"?"http://www.springframework.org/dtd/spring-beans.dtd" >
?3
?4 < beans >
?5
?6 < bean? id ="beforeAdvice" ?class ="com.dragon.Advice.BeforeAdvice" ></ bean >
?7 < bean? id ="afterAdvice" ?class ="com.dragon.Advice.AfterAdvice" ></ bean >
?8 < bean? id ="compareInterceptor" ?class ="com.dragon.Advice.CompareInterceptor" ></ bean >
?9 < bean? id ="studenttarget" ?class ="com.dragon.study.Impl.StudentImpl" ></ bean >
10
11 < bean? id ="student" ?class ="org.springframework.aop.framework.ProxyFactoryBean" >
12 ?? < property? name ="proxyInterfaces" >
13 ???? < value > com.dragon.study.IStudent </ value >
14 ?? </ property >
15 ?? < property? name ="interceptorNames" >
16 ???? < list >
17 ????? < value > beforeAdvice </ value >
18 ????? < value > afterAdvice </ value >
19 ???? < value > compareInterceptor </ value > ??
20 ???? </ list >
21 ?? </ property >
22 ?? < property? name ="target" >
23 ???? < ref? bean ="studenttarget" />
24 ?? </ property >
25
26 </ bean >
27
28
29
30
31 </ beans >
? 现在开始写测试类,Test.java
?1
/**
?2 ?*?
?3 ? */
?4 package ?com;
?5
?6 import ?org.springframework.context.ApplicationContext;
?7 import ?org.springframework.context.support.FileSystemXmlApplicationContext;
?8
?9 import ?com.dragon.study.IStudent;
10
11 /**
12 ?*? @author ?dragon
13 ?*
14 ? */
15 public ? class ?Test? {
16
17 ???? /**
18 ?????*? @param ?args
19 ????? */
20 ???? public ? static ? void ?main(String[]?args)? {
21 ???????? // ?TODO?Auto-generated?method?stub
22 ??????ApplicationContext?ctx? = ?
23 ?????????? new ?FileSystemXmlApplicationContext( " /com/dragon/applicationContext.xml " );
24 ??????
25 ??????IStudent?person? = ?(IStudent)ctx.getBean( " student " );
26 ??????person.addStudent( " dragon " );
27 ??????
28 // ??????person.addStudent("javadragon");
29 ????}
30
31 }
32
?2 ?*?
?3 ? */
?4 package ?com;
?5
?6 import ?org.springframework.context.ApplicationContext;
?7 import ?org.springframework.context.support.FileSystemXmlApplicationContext;
?8
?9 import ?com.dragon.study.IStudent;
10
11 /**
12 ?*? @author ?dragon
13 ?*
14 ? */
15 public ? class ?Test? {
16
17 ???? /**
18 ?????*? @param ?args
19 ????? */
20 ???? public ? static ? void ?main(String[]?args)? {
21 ???????? // ?TODO?Auto-generated?method?stub
22 ??????ApplicationContext?ctx? = ?
23 ?????????? new ?FileSystemXmlApplicationContext( " /com/dragon/applicationContext.xml " );
24 ??????
25 ??????IStudent?person? = ?(IStudent)ctx.getBean( " student " );
26 ??????person.addStudent( " dragon " );
27 ??????
28 // ??????person.addStudent("javadragon");
29 ????}
30
31 }
32