Spring Aop组成部分及实现步骤
作者:将船买酒白云边
Spring Aop
(Aspect orirnted Programming)面向切面编程,是对面向对象编程的一种补充,是一种编程思想,是对某一类的事情的集中处理。
比如用户登录状态的验证状态,在之前写servlet版本的博客系统,这里就有一个登录验证而且是在每一个页面都添加了一个登录验证,在使用Aop后,只需要写一个类就可以解决这个问题。
Aop 组成
1.切面( Aspect
)
定义的是事件,
Aop
实现了某个功能的集合。ex:用户登录校验
2.切点( Pointcut
)
定义事件的规则。
ex:定义用户登录拦截规则,那些接口判断用户登录权限
3.通知( Advice
)
AOP
具体的执行方法。
- 前置通知
- 后置通知
- 环绕通知
- 异常通知
- 返回通知
ex:获取用户登录信息,如果已经获取说明已经是登陆状态,否则未登录。
4.链接点( Jion Poit
)
有可能触发切点的所有点,这个点可以是方法调用,也可以是抛出异常或者是修改字段。
ex:所有接口
实现 AOP 步骤:
1.添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
2.定义切面
@Aspect //定义切面 @Component public class UserAspect { }
3.定义切点
@Aspect //定义切面 @Component public class UserAspect { @Pointcut("execution(* com.example.demo.controller.UserController.*(..)))") //空方法,主要是一个标识作用 public void pointcut(){} }
定义目录语法格式是 AspectJ
支持三种通配符
*
:匹配任意字符,只可以匹配一个元素。
..
:匹配任意字符,可以匹配多个元素,表示类时,必须和*
联合使用。
+
:表示按照类型匹配指定所有类,必须跟在类的后面。如:com.java.Car+
表示继承该类的所有方法
4.通知
具体实现方法
@RestController @RequestMapping("/user") public class UserController { @RequestMapping("/grtUser") public String getUser(){ System.out.println("do getUser"); return "get User"; } @RequestMapping("/delUser") public String delUser(){ System.out.println("do delUser"); return "delUser"; } }
实现通知
@Aspect //定义切面 @Component public class UserAspect { @Pointcut("execution(* com.example.demo.controller.UserController.*(..)))")//切点,括号中填写目录名称,在执行时会自动扫描方法,这⾥使⽤ AspectJ 表达式语法 public void pointcut(){ //目标方法,这⾥是空方法,主要是一个标识作用 } //前置通知 @Before("pointcut()") public void doBefore(){ System.out.println("执行了前置通知"); } //后置通知 @After("pointcut()") public void doAfter(){ System.out.println("执行了后置通知"); } //环绕通知 @Around("pointcut()") public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("环绕通知之前"); //执行目标方法 Object object = joinPoint.proceed(); System.out.println("环绕通知之后"); return object; } @AfterReturning("pointcut()") public void doAfterReturning(){ System.out.println("执行了返回方法"); } @AfterThrowing("pointcut()") public void doAfterThrowing(){ System.out.println("执行了抛出异常方法"); } }
四种通知方法:
前置通知:在执行方法之前执行的方法
后置通知:在执行完前面所有方法之后执行
环绕通知:通知包裹内被通知的方法,在被通知的方法之后和调用之前执行的自定义的行为。
返回通知:通知方法会在目标方法返回之后执行
异常通知:通知方法会在目标方法抛出异常后执行
AOP动态代理(实现原理)
Spring 动态代理组成:
JDK Proxy ------》 代理对象必须实现接口,才可以使用 JDK Proxy
CGLIB ------》通过实现代理类的子类来实现动态代理------》注意:被final修饰的类是不能被代理的
课件
两个代理区别
来源不同 :JDK来源于Java本地资源,CGLib是第三方资源实现不同 :JDK proxy 需要代理类实现接口才可以实现代理 CGLIB是通过实现代理类的子类来完成动态代理性能不同 : JDK 7+ JDK proxy 性能高与CGlib 。
到此这篇关于Spring Aop组成部分的文章就介绍到这了,更多相关Spring Aop组成内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!