aop的理解:我们传统的编程方式是垂直化的编程,即A–>B–>C–>D这么下去,一个逻辑完毕之后执行另外一段逻辑。但是AOP提供了另外一种思路,它的作用是在业务逻辑不知情(即业务逻辑不需要做任何的改动)的情况下对业务代码的功能进行增强,这种编程思想的使用场景有很多,例如事务提交、方法执行之前的权限检测、日志打印、方法调用事件等等(http://www.importnew.com/26951.html)
1.添加依赖
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-aop</artifactId>
- </dependency>
2.切面类.
(1)指定切点
(2)这里的涉及的通知类型有:前置通知、后置最终通知、后置返回通知、后置异常通知、环绕通知,在切面类中添加通知
- package com.fcc.web.aop;
-
- import com.fcc.domain.annotation.MyInfoAnnotation;
- 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.context.annotation.Configuration;
- import org.springframework.stereotype.Component;
-
-
-
- @Aspect
- @Component
- public class TestAop {
-
-
-
-
- @Pointcut("@annotation(com.fcc.domain.annotation.MyInfoAnnotation)")
- public void myInfoAnnotation() {
- }
-
-
-
- @Pointcut("execution(* com.fcc.web.controller.*.**(..))")
- public void excudeController() {
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
- @Around(value ="myInfoAnnotation()&&excudeController()&&@annotation(annotation)")
- public Object twiceAsOld(ProceedingJoinPoint thisJoinPoint,
- MyInfoAnnotation annotation
- ) {
- System.out.println(annotation.value());
-
- return null;
- }
-
- }
2.用以指定切点的注解
- package com.fcc.domain.annotation;
-
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
-
- @Retention(RetentionPolicy.RUNTIME)
- @Target({ElementType.METHOD,ElementType.PARAMETER})
- public @interface MyInfoAnnotation {
- String value() default "";
- }
3.测试类
- @Controller
- @RequestMapping("business")
- public class BusinessController {
-
-
- @MyInfoAnnotation(value = "FCC")
- @RequestMapping("/test")
- @ResponseBody
- public String testBusiness(){
-
- return "business";
- }
- }
浏览器请求 localhost:8080/business/test
控制台输出:FCC
注意:这里用到了JoinPoint。通过JoinPoint可以获得通知的签名信息,如目标方法名、目标方法参数信息等。ps:还可以通过RequestContextHolder来获取请求信息,Session信息。