SpringBoot没有Spring配置AOP那么繁琐 你只需要添加maven到pom文件,使用注解即可
对AOP的理解,如下图,黑线代表正在运行的程序,红线代表AOP的切入
这样看来切入丝毫不影响正在运行的程序,没有耦合,属于插拔式的
下面代码主要是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("方法执行前");
// }
}
结果展示