下面介绍使用Spring框架进行AOP编程。

首先我们需要导入需要的jar包:

1.aspectjrt.jar

2.aspectjweaver.jar

3.cglib-nodep-2.1_3.jar

 

在spring中有两种方式实现面向切面编程,一种是基于XML配置,另一种是使用注解份额方式,在实际开放中我们可以任选其中的一种即可。

 

首先介绍下使用注解方式进行AOP开发。

要使用注解方式,我们需要打开注解处理器


Xml代码  

spring面向切面指定顺序 spring切面注解方法实现_xml

1. <aop:aspectj-autoproxy/>

我们还是使用前面介绍的接口:

 


Java代码  

spring面向切面指定顺序 spring切面注解方法实现_xml


1. package com.szy.spring;  
2.   
3. public interface UserManager  
4. {  
5.   
6. public abstract void addUser(String username, String password);  
7.   
8. public abstract void deleteUser(int userId);  
9.   
10. public abstract String findUser(int userId);  
11.   
12. public abstract void modifyUser(int userId, String username, String password);  
13.   
14. }

 

实现这个接口:


Java代码  

spring面向切面指定顺序 spring切面注解方法实现_xml


    1. package com.szy.spring;  
    2.   
    3. public class UserManagerImpl implements UserManager   
    4. {  
    5.   
    6. public void addUser(String username, String password)  
    7.     {  
    8. "--------UserManagerImpl.addUser()----------");  
    9.     }  
    10.   
    11. public void deleteUser(int userId)  
    12.     {  
    13. "--------UserManagerImpl.deleteUser()----------");  
    14.     }  
    15.   
    16. public String findUser(int userId)  
    17.     {  
    18. "--------UserManagerImpl.findUser()----------");  
    19. return null;  
    20.     }  
    21.   
    22. public void modifyUser(int userId, String username, String password)  
    23.     {  
    24. "--------UserManagerImpl.modifyUser()----------");  
    25.     }  
    26. }


     

    切入点是用来定义我们要拦截的方法。在切入点定义中使用了AOP表达式语言,下面通过实例简单解释一下:

     


    表达式解释代码  

    spring面向切面指定顺序 spring切面注解方法实现_xml


    1. @Pointcut("execution (* com.szy.spring..*.*(..))")  
    2. execution:代表执行  
    3. 第一个*:代表返回值类型,使用*代表任何类型的返回值  
    4. com.szy.spring:代表包名  
    5. ..:代表其底下的子包也进行拦截  
    6. 第二个*:代表对哪个类进行拦截,*代表所有类  
    7. 第三个*:代表方法  
    8. (..):代表方法的蚕食有无都可以

     

    现在我们要对UserManagerImpl类下的所有方法进行拦截,则切入点如下表示:


    Java代码  

    spring面向切面指定顺序 spring切面注解方法实现_xml


    1. @Pointcut("execution (* com.szy.spring.UserManagerImpl.*(..))")  
    2.   
    3. private void anyMethod()  //定义切入点  
    4.  {  
    5.  }

     

    其中切入点的名称是下面方法的名称aynMethod(),包括括号。

     

    下面我们定义通知,通知分为前置通知、后置通知、意外通知、等。通知分为前置通知、后置通知、意外通知、最终通知和环绕通知等。

    演示前置通知,


    Java代码  

    spring面向切面指定顺序 spring切面注解方法实现_xml

    1. @Before("anyMethod()") //括号内为切入点名称  
    2. public void doBefore()  
    3.   {  
    4. "----------------执行前置通知-----------------");  
    5.   }  
    6.    
    7. @AfterReturning("anyMethod()")  
    8. public void doAfterReturning()  
    9.   {  
    10. "----------------执行后置通知-----------------");  
    11.   }

    Java代码  

    spring面向切面指定顺序 spring切面注解方法实现_xml


    1.  @After("anyMethod()")  
    2. public void doAfter()  
    3.  {  
    4. "----------------执行最终通知-----------------");  
    5.  }  
    6.    
    7. @AfterThrowing("anyMethod()")  
    8. public void doAfterThrowing()  
    9.   {  
    10. "----------------执行意外通知-----------------");  
    11.   }  
    12.     
    13. @Around("anyMethod()")  
    14. public Object doAround(ProceedingJoinPoint pjp) throws Throwable  
    15.  {  
    16. "----------------进入判断方法-----------------");  
    17. //该方法必须被执行  
    18. "----------------退出判断方法-----------------");  
    19. return result;  
    20.  }

     

     我们把切面交给spring管理,要交给spring管理我们可以在配置文件同进行bean配置,或者使用扫描的方式。


    Xml代码  

    spring面向切面指定顺序 spring切面注解方法实现_xml


    1. <bean id="interceptor" class="com.szy.spring.Interceptor"/>

     下面我们进行测试


    Java代码  

    spring面向切面指定顺序 spring切面注解方法实现_xml

    1. ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");  
    2. "userManager");  
    3. "coolszy", "kuka");

     

    按照我们的设计,输入的结果应为

    ----------------执行前置通知-----------------
    ----------------进入判断方法-----------------
    --------UserManagerImpl.addUser()----------
    ----------------执行后置通知-----------------
    ----------------执行最终通知-----------------
    ----------------退出判断方法-----------------