这个只是个简单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 }
目标类: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
前置通知: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 }
后置通知:AfterAdvice.java
1/** 2 * 3 */ 4package com.dragon.Advice; 5 6import java.lang.reflect.Method; 7 8import org.springframework.aop.AfterReturningAdvice; 9 10/** 11 * @author dragon 12 * 13 */ 14public 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}
环绕通知:CompareInterceptor.java
1/** 2 * 3 */ 4package com.dragon.Advice; 5 6import org.aopalliance.intercept.MethodInterceptor; 7import org.aopalliance.intercept.MethodInvocation; 8 9 10/** 11 * @author dragon 12 * 13 */ 14public 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}
配置文件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</beans>
现在开始写测试类,Test.java
1/** 2 * 3 */ 4package com; 5 6import org.springframework.context.ApplicationContext; 7import org.springframework.context.support.FileSystemXmlApplicationContext; 8 9import com.dragon.study.IStudent; 10 11/** 12 * @author dragon 13 * 14 */ 15public 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
当然,运行该程序时,要加上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 )