zoukankan      html  css  js  c++  java
  • 基于@Aspect的AOP配置

    1、Spring除了XML中支持Schema方式配置AOP,还支持注解方式:使用@Aspect来配置

    2、Spring默认不支持@Aspect风格的切面声明,通过如下配置开启@Aspect支持:
    Java代码  

       <aop:aspectj-autoproxy/>  

    3、通过以上配置,Spring就能发现用@Aspect注解的切面内并把它应用到目标对象上。

    4、定义一个切面:

      @Aspect  
        public class AspectStyle {  
          
            @Before("execution(* com.sxit..*.*(..))")  
            public void before(){  
                System.out.println("方法执行前执行.....");  
            }  
        }  

     5、后置返回通知:

        @AfterReturning("execution(* com.sxit..*.*(..))")  
        public void afterReturning(){  
                System.out.println("方法执行完执行.....");  
        } 

     6、后置异常通知:

        @AfterThrowing("execution(* com.sxit..*.*(..))")  
        public void throwss(){  
                System.out.println("方法异常时执行.....");  
        }  

     7、后置最终通知:

        @After("execution(* com.sxit..*.*(..))")  
        public void after(){  
                System.out.println("方法最后执行.....");  
        }  

     8、环绕通知:

        @Around("execution(* com.sxit..*.*(..))")  
        public Object around(ProceedingJoinPoint pjp){  
                System.out.println("方法环绕start.....");  
                try {  
                    pjp.proceed();  
                } catch (Throwable e) {  
                    e.printStackTrace();  
                }  
                System.out.println("方法环绕end.....");  
        }  

     9、按上面的每一个通知都要写一个定义,其实这部分可以抽出来,定义个一个公共的切入点。

        package com.sxit;  
          
        import org.aspectj.lang.ProceedingJoinPoint;  
        import org.aspectj.lang.annotation.After;  
        import org.aspectj.lang.annotation.AfterReturning;  
        import org.aspectj.lang.annotation.AfterThrowing;  
        import org.aspectj.lang.annotation.Around;  
        import org.aspectj.lang.annotation.Aspect;  
        import org.aspectj.lang.annotation.Before;  
        import org.aspectj.lang.annotation.Pointcut;  
          
        @Aspect  
        public class AspectStyle {  
              
            @Pointcut("execution(* com.sxit..*.*(..))")  
            public void init(){  
                  
            }  
          
            @Before(value="init()")  
            public void before(){  
                System.out.println("方法执行前执行.....");  
            }  
              
            @AfterReturning(value="init()")  
            public void afterReturning(){  
                System.out.println("方法执行完执行.....");  
            }  
              
            @AfterThrowing(value="init()")  
            public void throwss(){  
                System.out.println("方法异常时执行.....");  
            }  
              
            @After(value="init()")  
            public void after(){  
                System.out.println("方法最后执行.....");  
            }  
              
            @Around(value="init()")  
            public Object around(ProceedingJoinPoint pjp){  
                System.out.println("方法环绕start.....");  
                Object o = null;  
                try {  
                    o = pjp.proceed();  
                } catch (Throwable e) {  
                    e.printStackTrace();  
                }  
                System.out.println("方法环绕end.....");  
                return o;  
            }  
        }  


     10、打印信息:

        方法before前执行.....  
        方法环绕start.....  
        我看.....................  
        方法after执行.....  
        方法环绕end.....  
        方法afterReurning执行.....  


    参考自:http://jinnianshilongnian.iteye.com/blog/1418598

                  http://ch-space.iteye.com/blog/493956

    示例:

    一些常见的切入点的例子 
    execution(public * * (. .))     任意公共方法被执行时,执行切入点函数。 
    execution( * set* (. .))        任何以一个“set”开始的方法被执行时,执行切入点函数。 
    execution( * com.demo.service.AccountService.* (. .))     当接口AccountService 中的任意方法被执行时,执行切入点函数。 
    execution( * com.demo.service.. (. .))     当service 包中的任意方法被执行时,执行切入点函数。 within(com.demo.service.)在service 包里的任意连接点。 within(com.demo.service. .) 在service 包或子包的任意连接点。 

    this(com.demo.service.AccountService)     实现了AccountService 接口的代理对象的任意连接点。 
    target(com.demo.service.AccountService)    实现了AccountService 接口的目标对象的任意连接点。 
    args(java.io.Serializable)            任何一个只接受一个参数,且在运行时传入参数实现了 Serializable 接口的连接点 
    介绍: 
    @Before:方法前执行 
    @AfterReturning:运行方法后执行 
    @AfterThrowing:Throw后执行 
    @After:无论方法以何种方式结束,都会执行(类似于finally) 
    @Around:环绕执行

  • 相关阅读:
    基础数据类型补充
    编码转换
    is 和 == 的区别
    字典 dict
    列表与元组
    python基础第一节
    poll函数
    基本 TCP 的回射服务器
    文件IO
    base | AtomicIntegerT类
  • 原文地址:https://www.cnblogs.com/liaojie970/p/8042783.html
Copyright © 2011-2022 走看看