读书人

一个容易的spring AOP例子

发布时间: 2012-07-03 13:37:43 作者: rapoo

一个简单的spring AOP例子

转自:http://meiowei.iteye.com/blog/413919

这个只是个简单AOP例子,包括前置通知,后置通知,环绕通知,和目标对象。写这个例子的主要目标只是想让想学AOP的能更快地入门,了解一下如何去配置AOP里面的东东。
目标对象的接口:IStudent.java

Java代码 一个容易的spring AOP例子
  1. 1 /**
  2. 2 *
  3. 3 */
  4. 4 package com.dragon.study;
  5. 5
  6. 6 /**
  7. 7 * @author dragon
  8. 8 *
  9. 9 */
  10. 10 public interface IStudent {
  11. 11
  12. 12 public void addStudent(String name);
  13. 13 }

目标类:StudentImpl.java

Java代码 一个容易的spring AOP例子
  1. 1 /**
  2. 2 *
  3. 3 */
  4. 4 package com.dragon.study.Impl;
  5. 5
  6. 6 import com.dragon.study.IStudent;
  7. 7
  8. 8 /**
  9. 9 * @author dragon
  10. 10 *
  11. 11 */
  12. 12 public class StudentImpl implements IStudent {
  13. 13
  14. 14 public void addStudent(String name) {
  15. 15 System.out.println( " 欢迎 " + name + " 你加入Spring家庭! " );
  16. 16 }
  17. 17 }
  18. 18

前置通知:BeforeAdvice.java

Java代码 一个容易的spring AOP例子
  1. 1 /**
  2. 2 *
  3. 3 */
  4. 4 package com.dragon.Advice;
  5. 5
  6. 6 import java.lang.reflect.Method;
  7. 7
  8. 8 import org.springframework.aop.MethodBeforeAdvice;
  9. 9
  10. 10 /**
  11. 11 * @author dragon
  12. 12 *
  13. 13 */
  14. 14 public class BeforeAdvice implements MethodBeforeAdvice {
  15. 15
  16. 16 public void before(Method method,Object[] args, Object target)
  17. 17 throws Throwable {
  18. 18
  19. 19 System.out.println( " 这是BeforeAdvice类的before方法. " );
  20. 20
  21. 21 }
  22. 22 }

后置通知:AfterAdvice.java

Java代码 一个容易的spring AOP例子
  1. 1/**
  2. 2 *
  3. 3 */
  4. 4package com.dragon.Advice;
  5. 5
  6. 6import java.lang.reflect.Method;
  7. 7
  8. 8import org.springframework.aop.AfterReturningAdvice;
  9. 9
  10. 10/**
  11. 11 * @author dragon
  12. 12 *
  13. 13 */
  14. 14public class AfterAdvice implements AfterReturningAdvice{
  15. 15
  16. 16 public void afterReturning(Object returnValue ,Method method,
  17. 17 Object[] args,Object target) throws Throwable{
  18. 18 System.out.println("这是AfterAdvice类的afterReturning方法.");
  19. 19 }
  20. 20
  21. 21
  22. 22}

环绕通知:CompareInterceptor.java

Java代码 一个容易的spring AOP例子
  1. 1/**
  2. 2 *
  3. 3 */
  4. 4package com.dragon.Advice;
  5. 5
  6. 6import org.aopalliance.intercept.MethodInterceptor;
  7. 7import org.aopalliance.intercept.MethodInvocation;
  8. 8
  9. 9
  10. 10/**
  11. 11 * @author dragon
  12. 12 *
  13. 13 */
  14. 14public class CompareInterceptor implements MethodInterceptor{
  15. 15
  16. 16 public Object invoke(MethodInvocation invocation) throws Throwable{
  17. 17 Object result = null;
  18. 18 String stu_name = invocation.getArguments()[0].toString();
  19. 19 if ( stu_name.equals("dragon")){
  20. 20 //如果学生是dragon时,执行目标方法,
  21. 21 result= invocation.proceed();
  22. 22
  23. 23 } else{
  24. 24 System.out.println("此学生是"+stu_name+"而不是dragon,不批准其加入.");
  25. 25 }
  26. 26
  27. 27 return result;
  28. 28 }
  29. 29}

配置文件applicationContext.xml

Java代码 一个容易的spring AOP例子
  1. 1<?xml version="1.0" encoding="UTF-8"?>
  2. 2<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
  3. 3
  4. 4<beans>
  5. 5
  6. 6<bean id="beforeAdvice" class="com.dragon.Advice.BeforeAdvice"></bean>
  7. 7<bean id="afterAdvice" class="com.dragon.Advice.AfterAdvice"></bean>
  8. 8<bean id="compareInterceptor" class="com.dragon.Advice.CompareInterceptor"></bean>
  9. 9<bean id="studenttarget" class="com.dragon.study.Impl.StudentImpl"></bean>
  10. 10
  11. 11<bean id="student" class="org.springframework.aop.framework.ProxyFactoryBean">
  12. 12 <property name="proxyInterfaces">
  13. 13 <value>com.dragon.study.IStudent</value>
  14. 14 </property>
  15. 15 <property name="interceptorNames">
  16. 16 <list>
  17. 17 <value>beforeAdvice</value>
  18. 18 <value>afterAdvice</value>
  19. 19 <value>compareInterceptor</value>
  20. 20 </list>
  21. 21 </property>
  22. 22 <property name="target">
  23. 23 <ref bean="studenttarget"/>
  24. 24 </property>
  25. 25
  26. 26</bean>
  27. 27
  28. 28</beans>

现在开始写测试类,Test.java

Java代码 一个容易的spring AOP例子
  1. 1/**
  2. 2 *
  3. 3 */
  4. 4package com;
  5. 5
  6. 6import org.springframework.context.ApplicationContext;
  7. 7import org.springframework.context.support.FileSystemXmlApplicationContext;
  8. 8
  9. 9import com.dragon.study.IStudent;
  10. 10
  11. 11/**
  12. 12 * @author dragon
  13. 13 *
  14. 14 */
  15. 15public class Test {
  16. 16
  17. 17 /**
  18. 18 * @param args
  19. 19 */
  20. 20 public static void main(String[] args) {
  21. 21 // TODO Auto-generated method stub
  22. 22 ApplicationContext ctx =
  23. 23 new FileSystemXmlApplicationContext("/com/dragon/applicationContext.xml");
  24. 24
  25. 25 IStudent person = (IStudent)ctx.getBean("student");
  26. 26 person.addStudent("dragon");
  27. 27
  28. 28// person.addStudent("javadragon");
  29. 29 }
  30. 30
  31. 31}
  32. 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 )

读书人网 >软件架构设计

热点推荐