衡水故城贾彦明简历:Spring AOP技术配置语法

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 05:09:04
Spring提供了两种切面使用方式,实际工作中我们可以选用其中一种:
1 基于xml配置方式进行AOP开发
2 基于注解方式进行AOP开发


下面是基于注解的方式

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"     
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
       




Java代码
  1. //@Aspect 表示此类是一个切面,包含切入点和通知   
  2. //@Component 表示将此切面交由spring容器管理,此时必须在配置文件里面开启自动扫描   
  3. //  开启自动扫描      
  4. @Aspect  @Component  
  5. public class MyInterceptor {   
  6. //(1) 切入点的描述   
  7. /**  
  8.      *@Pointcut :表示规定切入点   
  9.      *execution() 语法规范  
  10.      * 第一个“*”表示任意返回结果类型  
  11.      * “cn.itcast.service.impl.PersonServiceBean”:表示对此类进行拦截,  
  12.      * 如果是cn.itcast.service..*.*:表示对包cn.itcast.service以及子包里所  
  13. 有的类的所有方法进行拦截,  
  14.      * (..)表示参数   
  15.      */    
  16. @Pointcut("execution(*    
  17. cn.itcast.service.impl.PersonServiceBean.*(..))")   
  18. //(2)声明一个切入点   
  19. public void anyMethod(){}   
  20.        
  21. //(3) 声明通知及注入方式   
  22. @Before("anyMethod()")   
  23. public void doAccessCheck(){   
  24.         System.out.println("前置通知");   
  25.     }   
  26. @AfterReturning("anyMethod()")   
  27.     public void doAfterReturning(){   
  28.         System.out.println("后置通知");   
  29.     }   
  30.     @After("anyMethod()")   
  31.     public void doAfter(){   
  32.         System.out.println("最终通知");   
  33.     }   
  34.     @AfterThrowing("anyMethod()")   
  35.     public void doAfterThrowing(){   
  36.         System.out.println("异常通知");   
  37.     }   
  38.     @Around("anyMethod()"//环绕通知的方法签名是规定的!!!   
  39.     public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{   
  40.         //if(){适合判断用户权限   
  41.         System.out.println("进入方法");   
  42.         Object result = pjp.proceed();   
  43.         System.out.println("退出方法");   
  44.         //}   
  45.         return result;   
  46.     }      
  47. }  


注册给容器后,如果执行此切面规定拦截的类的方法时,按照@Before等方式加上“通知”

得到的运行结果!!!!!一定注意顺序
前置通知
进入方法
我是save()方法
后置通知
最终通知
退出方法
―――――――――――
如果想在通知中得到拦截方法的参数,该怎么做?
@Before("anyMethod() && args(name)")
public void doAccessCheck(String name){
System.out.println("前置通知");
}
注意:通知方法的参数名一定要和args指定的一致!!!

如果想得到拦截方法的返回结果,该怎么做?


Java代码
  1. @AfterReturning(pointcut="anyMethod()",returning="result")   
  2. public void doAfterReturning(String result){   
  3.         System.out.println("后置通知:"+result);   
  4. }  



如果想得到拦截方法抛出的异常,该怎么做?


Java代码
  1. @AfterThrowing(pointcut="anyMethod()",throwing="e")   
  2. public void doAfterThrowing(Exception e){   
  3.         System.out.println("异常通知:"+e);   
  4. }  


基于xml配置方式进行AOP开发


   
            expression="execution(* cn.itcast.service..*.*(..))"/>
           
           
           
            pointcut-ref="mycut" method="doAfterThrowing"/>
           
         

   


如果只是拦截返回值为String类型的方法,切面可以这样写

如果要求第一个参数为String类型,不管其后面有几个参数

如果要求返回值类型不为void,怎么写?