irpas技术客

【Spring】AOP_亚太地区百大最帅面孔第101名

未知 7858

?? Author: 老九 ?? 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏:Spring框架系列

文章目录 AOP什么是Spring AOP为什么要用AOP?AOP的组成Spring AOP的实现导入依赖定义切面和切点定义通知Advice(5类) Spring AOP实现原理动态代理织入JDK和CGLIB实现的区别

AOP 什么是Spring AOP AOP是面向切面编程。OOP是面向对象编程,AOP是一种思想,它是针对程序中的某一类的功能做统一的处理。比如用户登录权限的校验,没学AOP之前,我们所有需要判断用户登录的页面,AOP可以自动帮我们实现登录验证,不再需要每个方法中都写相同的用户登录的验证了。Spring AOP是一种框架,提供了一种对AOP 思想的实现,他们的关系和IoC与DI类似。利用AOP可以对各个业务进行隔离, 从而是得业务各逻辑之间的耦合性降低, 提高了程序的可重用性, 同时提高开发效率 为什么要用AOP? 之前处理用户登录的状态验证,每个Controller都要写一遍用户登录,然而当你的功能越来越多的时候,你要写的登录验证也越来越多,而这些方法都是相同的,对于这种功能统一,且使用的地方较多的功能,就可以考虑AOP来统一处理除了统一的用户登录的判断之外,AOP还可以实现:统一日志记录,统一方法执行时间的统计,统一的返回格式设置,统一的异常处理,事务的开启和提交 AOP的组成

切面:切面由切点和通知组成,针对于某一个功能的具体定义(相当于一个类),某一个功能可能是登录验证功能(一个AOP一个数据库),也可能是日志记录功能,一个功能对应一个切面。切点:切点是切面中的某一个方法,用户登录验证方法就是一个切点。连接点:调用这些切点(方法)的页面就是连接点通知: 切点是一个空方法,通知是具体实现了这个方法,通知相当于切点的方法体。通知包括:前置通知,后置通知,返回之后通知,抛异常后的通知,环绕通知 Spring AOP的实现 添加Spring AOP框架支持定义切面和切点定义通知 导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 定义切面和切点 类注解:@Aspect,@Component方法注解:@Pointcut @Component @Aspect //定义切面 public class UserAspect { @Pointcut("execution(* com.example.demo.controller.UserController.*(..))") public void pointcut(){} } 定义通知Advice(5类) 通知是描述拦截执行的时机和具体的方法实现注意环绕通知的写法,可以记录执行接口的时间AspectJ表达式(定义拦截的规则):execution(<返回类型>< 包.类.方法(参数)><异常>) @Component @Aspect //定义切面 public class UserAspect { @Pointcut("execution(* com.example.demo.controller.UserController.*(..))") public void pointcut(){} // 前置通知(要带一个括号) @Before("pointcut()") public void doBefore(){ //业务代码 System.out.println(); System.out.println("执行了前置通知"); System.out.println(); } } @Around("pointcut()") public Object doAround(ProceedingJoinPoint joinPoint){ Object result = null; //执行前置业务代码 System.out.println("执行环绕通知的前置方法"); try { //执行(拦截的)业务方法 result = joinPoint.proceed(); } catch (Throwable throwable) { throwable.printStackTrace(); } //执行后置业务代码 System.out.println("执行环绕通知的后置方法"); return result; } Spring AOP实现原理 动态代理 Spirng AOP是构建在动态代理上,Spring对AOP的支持局部于方法级别的拦截。动态代理分为两类:1.JDK Porxy(JDK动态代理机制,这个需要实现了接口的类),几乎都是依赖字节码框架(ASM)实现的2.CGLIB生成动态代理类(这个不需要实现接口的类),但这种生成代理类不能代理final的类,例如String类 织入 织入是代理的生成时机,在目标对象的生命周期里有多个点可以进行织入:**1.编译器:**切面在目标类编译时被织入,AspectJ的织入编译器就是以这种方式织入切面的。**2.类加载器:**切面在目标类加载到JVM时被织入。**3.运行期:**切面在应用运行的某一时刻被织入。SpringAOP就是以这种方式织入切面的,这种设计模式叫做动态代理模式,都是在class代码运行期,动态的织入了字节码。 JDK和CGLIB实现的区别 JDK实现,要求被代理类必须实现接口,之后通过invocationHandler和proxy,在运行时动态的在内存中生成了代理类对象CGLIB实现,被代理类可以不实现接口,是通过实现被代理类,在运行时动态的生成代理类对象JDK和CGLIB的底层实现都是用的反射

———————————————————————— ???码字不易,大家的支持就是我坚持下去的动力??? 版权声明:本文为CSDN博主「亚太地区百大最帅 面孔第101名」的原创文章


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #SpringAOP #Spring #AOP