轉自: http://meiowei.iteye.com/blog/413919
這個只是個簡單AOP例子,包括前置通知,后置通知,環繞通知,和目標對象。寫這個例子的主要目標只是想讓想學AOP的能更快地入門,了解一下如何去配置AOP里面的東東。
目標對象的接口:IStudent.java
- 1 /**
- 2*
- 3*/
- 4 package com.dragon.study;
- 5
- 6 /**
- 7*@authordragon
- 8*
- 9*/
- 10 public interface IStudent{
- 11
- 12 public void addStudent(Stringname);
- 13 }
目標類:StudentImpl.java
- 1 /**
- 2*
- 3*/
- 4 package com.dragon.study.Impl;
- 5
- 6 import com.dragon.study.IStudent;
- 7
- 8 /**
- 9*@authordragon
- 10*
- 11*/
- 12 public class StudentImpl implements IStudent{
- 13
- 14 public void addStudent(Stringname){
- 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*@authordragon
- 12*
- 13*/
- 14 public class BeforeAdvice implements MethodBeforeAdvice{
- 15
- 16 public void before(Methodmethod,Object[]args,Objecttarget)
- 17 throws Throwable{
- 18
- 19 System.out.println( "這是BeforeAdvice類的before方法." );
- 20
- 21 }
- 22 }
后置通知:AfterAdvice.java
- 1 /**
- 2*
- 3*/
- 4packagecom.dragon.Advice;
- 5
- 6importjava.lang.reflect.Method;
- 7
- 8importorg.springframework.aop.AfterReturningAdvice;
- 9
- 10 /**
- 11*@authordragon
- 12*
- 13*/
- 14public class AfterAdvice implements AfterReturningAdvice{
- 15
- 16 public void afterReturning(ObjectreturnValue,Methodmethod,
- 17 Object[]args,Objecttarget) throws Throwable{
- 18 System.out.println( "這是AfterAdvice類的afterReturning方法." );
- 19 }
- 20
- 21
- 22 }
環繞通知:CompareInterceptor.java
- 1 /**
- 2*
- 3*/
- 4packagecom.dragon.Advice;
- 5
- 6importorg.aopalliance.intercept.MethodInterceptor;
- 7importorg.aopalliance.intercept.MethodInvocation;
- 8
- 9
- 10 /**
- 11*@authordragon
- 12*
- 13*/
- 14public class CompareInterceptor implements MethodInterceptor{
- 15
- 16 public Objectinvoke(MethodInvocationinvocation) throws Throwable{
- 17 Objectresult= null ;
- 18 Stringstu_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 }
配置文件applicationContext.xml
- 1 <?xmlversion= "1.0" encoding= "UTF-8" ?>
- 2 <!DOCTYPEbeansPUBLIC "-//SPRING//DTDBEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
- 3
- 4 <beans>
- 5
- 6 <beanid= "beforeAdvice" class = "com.dragon.Advice.BeforeAdvice" ></bean>
- 7 <beanid= "afterAdvice" class = "com.dragon.Advice.AfterAdvice" ></bean>
- 8 <beanid= "compareInterceptor" class = "com.dragon.Advice.CompareInterceptor" ></bean>
- 9 <beanid= "studenttarget" class = "com.dragon.study.Impl.StudentImpl" ></bean>
- 10
- 11 <beanid= "student" class = "org.springframework.aop.framework.ProxyFactoryBean" >
- 12 <propertyname= "proxyInterfaces" >
- 13 <value>com.dragon.study.IStudent</value>
- 14 </property>
- 15 <propertyname= "interceptorNames" >
- 16 <list>
- 17 <value>beforeAdvice</value>
- 18 <value>afterAdvice</value>
- 19 <value>compareInterceptor</value>
- 20 </list>
- 21 </property>
- 22 <propertyname= "target" >
- 23 <refbean= "studenttarget" />
- 24 </property>
- 25
- 26 </bean>
- 27
- 28 </beans>
現在開始寫測試類,Test.java
- 1 /**
- 2*
- 3*/
- 4packagecom;
- 5
- 6importorg.springframework.context.ApplicationContext;
- 7importorg.springframework.context.support.FileSystemXmlApplicationContext;
- 8
- 9importcom.dragon.study.IStudent;
- 10
- 11 /**
- 12*@authordragon
- 13*
- 14*/
- 15public class Test{
- 16
- 17 /**
- 18*@paramargs
- 19*/
- 20 public static void main(String[]args){
- 21 //TODOAuto-generatedmethodstub
- 22 ApplicationContextctx=
- 23 new FileSystemXmlApplicationContext( "/com/dragon/applicationContext.xml" );
- 24
- 25 IStudentperson=(IStudent)ctx.getBean( "student" );
- 26 person.addStudent( "dragon" );
- 27
- 28 //person.addStudent("javadragon");
- 29 }
- 30
- 31 }
- 32
當然,運行該程序時,要加上commons-logging.jar 包
在Spring Appactiocontext.xml配置文件;你定義的前置,后置;環繞等通知在配置文件中實現了代理(org.springframework.aop.framework.ProxyFactoryBean)
以此將通知放入到了原Bean中;這樣才能使原Bean中方法調用時自動執行通知
這是其一》
<property name="proxyInterfaces">
<property name="interceptorNames">
<property name="target">
這三個屬性是一定要配置的
第一是被代理的接口(IStudent)
第二是通知列表(前置,后置;環繞)上面定義的三個類
第三是被代理的原Bean(StudentImpl )
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
