这个只是个简单AOP例子,包括前置通知,后置通知,环绕通知,和目标对象。写这个例子的主要目标只是想让想学AOP的能更快地入门,了解一下如何去配置AOP里面的东东。
目标对象的接口:IStudent.java
- 1/**
- 2*
- 3*/
- 4packagecom.dragon.study;
- 5
- 6/**
- 7*@authordragon
- 8*
- 9*/
- 10publicinterfaceIStudent{
- 11
- 12publicvoidaddStudent(Stringname);
- 13}
目标类:StudentImpl.java
- 1/**
- 2*
- 3*/
- 4packagecom.dragon.study.Impl;
- 5
- 6importcom.dragon.study.IStudent;
- 7
- 8/**
- 9*@authordragon
- 10*
- 11*/
- 12publicclassStudentImplimplementsIStudent{
- 13
- 14publicvoidaddStudent(Stringname){
- 15System.out.println("欢迎"+name+"你加入Spring家庭!");
- 16}
- 17}
- 18
前置通知:BeforeAdvice.java
- 1/**
- 2*
- 3*/
- 4packagecom.dragon.Advice;
- 5
- 6importjava.lang.reflect.Method;
- 7
- 8importorg.springframework.aop.MethodBeforeAdvice;
- 9
- 10/**
- 11*@authordragon
- 12*
- 13*/
- 14publicclassBeforeAdviceimplementsMethodBeforeAdvice{
- 15
- 16publicvoidbefore(Methodmethod,Object[]args,Objecttarget)
- 17throwsThrowable{
- 18
- 19System.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*/
- 14publicclassAfterAdviceimplementsAfterReturningAdvice{
- 15
- 16publicvoidafterReturning(ObjectreturnValue,Methodmethod,
- 17Object[]args,Objecttarget)throwsThrowable{
- 18System.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*/
- 14publicclassCompareInterceptorimplementsMethodInterceptor{
- 15
- 16publicObjectinvoke(MethodInvocationinvocation)throwsThrowable{
- 17Objectresult=null;
- 18Stringstu_name=invocation.getArguments()[0].toString();
- 19if(stu_name.equals("dragon")){
- 20//如果学生是dragon时,执行目标方法,
- 21result=invocation.proceed();
- 22
- 23}else{
- 24System.out.println("此学生是"+stu_name+"而不是dragon,不批准其加入.");
- 25}
- 26
- 27returnresult;
- 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*/
- 15publicclassTest{
- 16
- 17/**
- 18*@paramargs
- 19*/
- 20publicstaticvoidmain(String[]args){
- 21//TODOAuto-generatedmethodstub
- 22ApplicationContextctx=
- 23newFileSystemXmlApplicationContext("/com/dragon/applicationContext.xml");
- 24
- 25IStudentperson=(IStudent)ctx.getBean("student");
- 26person.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 )