首页 > 编程语言 > 详细

SpringAOP

时间:2019-08-30 09:19:09      阅读:77      评论:0      收藏:0      [点我收藏+]

SpringAOP使用方式

切点表达式

常用的符号:

  • * 通配符,该通配符主要用于匹配单个单词,或者是以某个词为前缀或后缀的单词。
  • ..通配符,表示匹配0个或多个项

一种常用的切点表达式如下:
(1):execution(* com.nuofankj.springdemo.aop.Service.(..))
(2):execution(* com.sample.service.impl..*.*(..))

(1)返回类型为任意类型,以Service开头的方法名,参数为任意参数;
(2)返回类型为任意类型,impl包及其子包(..)下的所有类的所有方法,任意参数类型;

基于切点表达式的使用方式

  • 1 可以通过在切点中配置,拿到入参信息
    //切点方法为:
    @Override
    public String saveUser(String user,Integer age) {
        System.out.println("保存用户信息");
        if (Objects.equals(user,"e")){
            throw new RuntimeException();
        }
        return null;
    }
    /**切点配置为*/
    //方式一:通过pointcut方法中定义参数,拿到切点处的参数
    //通过Pointcut方法配置,拿到入参
    @Pointcut(value = "execution(* com.wht.springaop.USerService.saveUser(..)) && args(cat,dog)")
    public void pointcut2(String cat,Integer dog){
    };
    @Around("pointcut2(cat,dog)")
    public Object aroundExe(ProceedingJoinPoint joinPoint,String cat,Integer dog) throws Throwable {
        System.out.println("around1切面执行。。。");
        try {
            return joinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            throw  throwable;
        }finally {
            System.out.println("around2切面执行。。。");
        }
    }
  • 2 个人感觉最常用的还是这种,通过JoinPoint拿到入参信息
    //通过JoinPoint拿到方法的入参信息
    @After("execution(* com.wht.springaop.USerService.testNormalAop(..))")
    public void AfterExe(JoinPoint point){
        Object[] args = point.getArgs();
        //参见JoinPoint的API介绍
        System.out.println("切点获取传入的参数为:"+ Arrays.asList(args));
        System.out.println("after:测试普通AOP方法");
    }
  • 3 另外可以通过自定义注解的方式使用,更加灵活
    /**首先自定义注解*/
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface Log {
        String value() default "我是注解";
        // int key();
    }

    /**在要切入的方法上使用此注解*/
    @Log(value = "Log注解AOP")
    @Override
    public String testAnnotationAop(String name) {
        System.out.println("测试注解AOP方法");
        return "AOP注解方式";
    }

    /**配置切点,进行功能代码织入,同样有两种方式*/
    //【1】表示切点在Log注解标识的方法上,这种将Log写入参数中的形式能直接拿到Log注解信息
    @Pointcut(value = "@annotation(log)")
    public void pointcut(Log log){
    }
    @Around(value = "pointcut(log)")
    public Object get(ProceedingJoinPoint point,Log log) throws Throwable {
        System.out.println(log.value());//能拿到注解的值
        point.proceed();
        System.out.println("Around02注解AOP");//环绕通知
        return "123";
    }
    //【2】这种方式只能通过获取方法,然后获取方法上的注解的形式拿到,且@annotation需要配置注解的全限定名。
    @Before(value = "@annotation(com.wht.springaop.Log)")
    public void beforeExe(JoinPoint point){
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();
        //获取参数列表
        String[] names = signature.getParameterNames();
        //获取方法上的注解
        Log log = method.getAnnotation(Log.class);
        System.out.println("注解式拦截 " + log.value());
    }

SpringAOP

原文:https://www.cnblogs.com/whtblog/p/11432805.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!