文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot项目怎么使用aop

2023-07-05 20:55

关注

这篇“SpringBoot项目怎么使用aop”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringBoot项目怎么使用aop”文章吧。

前言

IOC和AOP是Spring中的两个核心的概念,简单介绍一下我的理解:

IOC:控制反转,就是将以前由我们自己手动创建对象的过程交给了Spring,Spring帮助我们生产对象、管理对象、管理对象和对象之间的依赖关系。降低了代码的耦合度,方便我们后期对项目做维护。举个通俗一点的例子:
正常情况下,我们在家,饿了,自己做饭。
使用IOC情况下,我们在家,饿了,打电话给商家,饭送过来。
IOC就相当于商家,做饭就相当于创建对象。
也就是说正常情况下,当一个类需要调用其他类的方法时,我们手动通过new、工厂或者其他方式创建对象。
使用IOC情况下,我们只需要注入对象即可。

AOP:面向切面(方便)编程,可以对某一类对象进行监督和控制,在调用这类对象方法的前后去调用指定的代码,从而对一个方法进行扩展,从而达到增强模块功能的效果。举个通俗一点的例子:
正常情况下,直接吃饭。
使用AOP情况下,有个保姆关注着,吃饭前帮忙洗手,吃饭后帮忙收拾碗筷。
AOP就相当于保姆,吃饭就相当于带调用具体的方法。
也就是说,当我们想对方法进行补充时,并不去直接修改方法,而是通过AOP去补充。当我们不想补充或者需要更换补充的时候,直接操作AOP即可。
1、Pointcut: 切点,用于定义哪个方法会被拦截,例如 execution(* cn.springcamp.springaop.service..(…))

Advice: 拦截到方法后要执行的动作

Aspect: 切面,把Pointcut和Advice组合在一起形成一个切面

Join Point: 在执行时Pointcut的一个实例

Weaver: 实现AOP的框架,例如 AspectJ 或 Spring AOP

一、SpringBoot项目引入AOP依赖

<!--aop-->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-aop</artifactId>        </dependency>

启动类加上@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@Aspectpublic 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;@Componentpublic 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();    }}

测试结果:

SpringBoot项目怎么使用aop

三、注解方式

自定义注解代码:

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@Aspectpublic 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;@Componentpublic class AOPAnnotationTestClient {    @MyAnnotation    public void test(){        System.out.println("正在测试AOP");    }}

测试类代码:

@Test    public void testAOPAnnotation(){        aopAnnotationTestClient.test();    }

测试结果:

SpringBoot项目怎么使用aop

以上就是关于“SpringBoot项目怎么使用aop”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯