SpringBoot中AOP的应用实例

SpringBoot没有Spring配置AOP那么繁琐  你只需要添加maven到pom文件,使用注解即可

对AOP的理解,如下图,黑线代表正在运行的程序,红线代表AOP的切入

这样看来切入丝毫不影响正在运行的程序,没有耦合,属于插拔式的

SpringBoot中AOP的应用实例_第1张图片

下面代码主要是AOP的环绕通知(@Aspect) 可以应用在用户访问权限之类的

创建控制器代码

package com.example.springboot.controller;

import com.example.springboot.AOP.MyAnnotation;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test/aop")
public class TestAop {
    @RequestMapping("/add1")
    @MyAnnotation
    public String adddata(String deviceid){
        return "成功";
    }
    @RequestMapping("/add2")
    public   String addData2(String deviceid){

            return "成功";

    }
}

其中@RestController注解相当于@ResponseBody + @Controller合在一起的作用

1) 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。

2) 如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
    如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

@RequestMapping  是web路径 

创建切面代码,里面有一个自定义注解,自定义注解让程序变得更加的灵活,比如我只在部分方法上使用这个注解,那么切面的通知也只通知这个方法,当然 切面里的切点也要声明这个自定义注解。

package com.example.springboot.AOP;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class TestAspect {
    @Pointcut("execution(public * com.example.springboot.controller.TestAop.add*(..))&& @annotation(com.example.springboot.AOP.MyAnnotation)")
    public  void addAdvice(){
    }
    @Around("addAdvice()")
    public Object HelloAop(ProceedingJoinPoint pjp){
        Object result = null;
        Object [] args=pjp.getArgs();
        if(args!=null&&args.length>0){
            String deviesid=(String)args[0];
            if(!"03".equals(deviesid)){
                return "no anthorization";
            }

        }
        try {
            result =pjp.proceed();

           // spring aop执行ProceedingJoinPoint.proceed()获取原方法的返回值,类型是void,List,Map,bean等,如何                  打印这些不同类型或不同数据结构的返回值?  用超级父类 Object来接收
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return result;
    }
//    @Before("addAdvice()")
//    public void  before() {
//        System.out.println("方法执行前");
//    }

}

结果展示

SpringBoot中AOP的应用实例_第2张图片

你可能感兴趣的:(java)