SpringBoot项目怎么使用aop
来源:亿速云
时间:2024-04-22 11:24:40 209浏览 收藏
哈喽!大家好,很高兴又见面了,我是golang学习网的一名作者,今天由我给大家带来一篇《SpringBoot项目怎么使用aop》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!
前言
IOC和AOP是Spring中的两个核心的概念,简单介绍一下我的理解:
IOC:控制反转,就是将以前由我们自己手动创建对象的过程交给了Spring,Spring帮助我们生产对象、管理对象、管理对象和对象之间的依赖关系。降低了代码的耦合度,方便我们后期对项目做维护。举个通俗一点的例子:
正常情况下,我们在家,饿了,自己做饭。
使用IOC情况下,我们在家,饿了,打电话给商家,饭送过来。
IOC就相当于商家,做饭就相当于创建对象。
也就是说正常情况下,当一个类需要调用其他类的方法时,我们手动通过new、工厂或者其他方式创建对象。
使用IOC情况下,我们只需要注入对象即可。
AOP:面向切面(方便)编程,可以对某一类对象进行监督和控制,在调用这类对象方法的前后去调用指定的代码,从而对一个方法进行扩展,从而达到增强模块功能的效果。举个通俗一点的例子:
正常情况下,直接吃饭。
使用AOP情况下,有个保姆关注着,吃饭前帮忙洗手,吃饭后帮忙收拾碗筷。
AOP就相当于保姆,吃饭就相当于带调用具体的方法。
也就是说,当我们想对方法进行补充时,并不去直接修改方法,而是通过AOP去补充。当我们不想补充或者需要更换补充的时候,直接操作AOP即可。
1、Pointcut: 切点,用于定义哪个方法会被拦截,例如 execution(* cn.springcamp.springaop.service..(…))
2、Advice: 拦截到方法后要执行的动作
3、Aspect: 切面,把Pointcut和Advice组合在一起形成一个切面
4、Join Point: 在执行时Pointcut的一个实例
4、Weaver: 实现AOP的框架,例如 AspectJ 或 Spring AOP
一、SpringBoot项目引入AOP依赖
org.springframework.boot spring-boot-starter-aop
启动类加上@EnableAspectJAutoProxy注解,可以省略。因为在AOP的默认配置属性中,spring.aop.auto属性默认是开启的。
也不需要再引入AspectJ依赖了。
二、普通方式
切面类代码:
package com.example.myblog.test; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; @Component @Aspect public class AOPTest { //定义切入点 @Pointcut("execution(public * com.example.myblog.test.AOPTestClient.*(..))") public void aspectTest(){} //前置通知,切入点执行之前执行 @Before("aspectTest()") public void doBefore(JoinPoint joinPoint){ System.out.println("前置通知"); } //后置通知,切入点执行之后执行 @After("aspectTest()") public void doAfter(JoinPoint joinPoint){ System.out.println("后置通知"); } //最终通知,,切入点执行之后执行 @AfterReturning("aspectTest()") public void doAfterReturning(JoinPoint joinPoint){ System.out.println("最终通知"); } //异常通知,切入点抛出异常执行 @AfterThrowing("aspectTest()") public void deAfterThrowing(JoinPoint joinPoint){ System.out.println("异常通知"); } //环绕通知,切入点执行前、后执行 @Around("aspectTest()") public Object deAround(ProceedingJoinPoint joinPoint) throws Throwable{ System.out.println("未执行"); Object result = joinPoint.proceed(); System.out.println("已执行"); //返回结果 return result; } }
切点类代码:
package com.example.myblog.test; import org.springframework.stereotype.Component; @Component public class AOPTestClient { public void test(){ System.out.println("正在测试AOP"); } }
测试类代码:
package com.example.myblog; import com.example.myblog.test.*; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @SpringBootTest @RunWith(SpringJUnit4ClassRunner.class) public class MyblogApplicationTests { @Autowired private AOPTestClient aopTestClient; @Test public void testAOP(){ aopTestClient.test(); } }
测试结果:
三、注解方式
自定义注解代码:
package com.example.myblog.test; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //表示次注解可以标注在类和方法上 @Target({ElementType.METHOD, ElementType.TYPE}) //运行时生效 @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { //定义一个变量,可以接受参数 String desc() default " "; }
切面类代码:
package com.example.myblog.test; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; @Component @Aspect public class AOPAnnotationTest { //定义切入点 @Pointcut("@annotation(com.example.myblog.test.MyAnnotation)") public void aspectTest(){} //前置通知,切入点执行之前执行 @Before("aspectTest()") public void doBefore(JoinPoint joinPoint){ System.out.println("前置通知"); } //后置通知,切入点执行之后执行 @After("aspectTest()") public void doAfter(JoinPoint joinPoint){ System.out.println("后置通知"); } //最终通知,,切入点执行之后执行 @AfterReturning("aspectTest()") public void doAfterReturning(JoinPoint joinPoint){ System.out.println("最终通知"); } //异常通知,切入点抛出异常执行 @AfterThrowing("aspectTest()") public void deAfterThrowing(JoinPoint joinPoint){ System.out.println("异常通知"); } //环绕通知,切入点执行前、后执行 @Around("aspectTest()") public Object deAround(ProceedingJoinPoint joinPoint) throws Throwable{ System.out.println("未执行"); Object result = joinPoint.proceed(); System.out.println("已执行"); //返回结果 return result; } }
切点类代码:
package com.example.myblog.test; import org.springframework.stereotype.Component; @Component public class AOPAnnotationTestClient { @MyAnnotation public void test(){ System.out.println("正在测试AOP"); } }
测试类代码:
@Test public void testAOPAnnotation(){ aopAnnotationTestClient.test(); }
测试结果:
今天关于《SpringBoot项目怎么使用aop》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
418 收藏
-
132 收藏
-
354 收藏
-
193 收藏
-
430 收藏
-
377 收藏
-
331 收藏
-
182 收藏
-
371 收藏
-
178 收藏
-
438 收藏
-
408 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习