首页 > 编程语言 >SpringBoot 整合AOP(面向切面编程)其中@Around失效问题

SpringBoot 整合AOP(面向切面编程)其中@Around失效问题

时间:2023-03-28 09:47:32浏览次数:45  
标签:carRun run SpringBoot void --- AOP 执行 public Around

1.AOP实现知识点​

核心思想:动态代理。

​支持技术:反射。

2.官方文档名词解释​

Aspect(切面):关注点的模块化(新增业务的模块化)。为完成新业务而编写的类对象。(带@Aspect注解的类)。

Join point(连接点):新业务的实现,通知到了我们该干点什么。

Advice(通知):告诉新业务是在连接点的什么状态去执行 ,具体请看5. 通知的分类。

Pointcut(切点):我们新增业务执行的地方。(例中的Run())。

Introduction(引入):改变类的情况下,给该类添加属性和方法。

Target object(目标对象):要扩展业务的对象。

AOP proxy(代理):像目标对象通知后创建的对象(动态代理中的代理对象)。

3.通知分类

@Before :在切点方法(Run())执行前。

@After:在切点方法(Run())执行后。

@AfterReturning:切点方法(Run())返回后执行

@AfterThrowing:切点方法(Run())抛异常执行

@Around:环绕增强 ,切入点方法(Run())之前之后都执行。

该增强和其他增强不同,需要将切入点方法传入该方法后执行。注意看代码实现和相关注释。(踩了大坑)。

4.注解方法实现AOP整合

1.引入相关依赖

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

2.目标对象(实现举例)

 //接口类
    public interface CarService {

        /**
         * 汽车跑
         */
        public void run();

    }

  //实现类
    @Service
    public class CarServiceImpl implements CarService {

        @Override
        public void run() {
            System.out.println("汽车跑动了!!!!!!!!!!");
        }

    }

3.切面 (这个要注意下@Aound)

//该注解表示这是个切面
@Aspect
//将该对象交给Spring 的Ico容器管理
@Component
public class CarAop {

    /**
     * 连接点 将CarService接口的所有实现类中的方法作为接入点,绑定到carRun()上。
     * execution 中字符发解释
     * 1.第一个 * 任意返回值
     * 2.中间的是包名
     * 3.第二个*表示server包下的所有对象
     * 4.括号表示接收参数
     * 5.括号中的..表示任意参数
     * 
     * execution 绑定这一个
     * 还有 :execution  within  this  target  args  @target  @args   @within  @annotation
     */
    @Pointcut("execution( * com.qian.exercise_java.aop.service.*(..))")
    public void carRun(){

    }

    /**
     * carRun() 就是上面的接入点。
     * @Before  表示在CarService接口的所有实现类中的方法,执行前将执行runBefore()方法
     */
    @Before("carRun()")
    public void runBefore(){
        System.out.println("runBefore()执行前执行了!!!!!");
    }

    /**
     * 之后执行
     */
    @After("carRun()")
    public void runAfter(){
        System.out.println("runAfter()执行前执行了!!!!!");
    }


    /**
     * 一部分run()之前执行,一部分run()之后执行
     * 这个需要特别注意
     */
    @Around("carRun()")
    public void runAround(ProceedingJoinPoint pj) throws Throwable {
        System.out.println("run()执行---前---执行了runAround()!!!!!!");

        //如果添加了环绕增强,一定要加下面这句,不然远方法都将不执行。
        //执行被增强方法
        pj.proceed();
        System.out.println("run()执行---后---执行了runAround()!!!!!!");
    }

    /**
     * run()***方法返回后***执行
     */
    @AfterReturning("carRun()")
    public void runAfterReturning(){
        System.out.println("runAfterReturning()执行了!!!!!!");
    }

}

4.测试结果

@RunWith(SpringRunner.class)
@SpringBootTest
public class CarAopTest {

    @Autowired
    private CarService carService;

    @Test
    public void carAopTest(){
        carService.run();
    }
}

5.测试输出结果

run()执行---前---执行了runAround()!!!!!!
runBefore()执行前执行了!!!!!
汽车跑动了!!!!!!!!!!
runAfterReturning()执行了!!!!!!
runAfter()执行前执行了!!!!!
run()执行---后---执行了runAround()!!!!!!

 

标签:carRun,run,SpringBoot,void,---,AOP,执行,public,Around
From: https://www.cnblogs.com/mihutao/p/17263881.html

相关文章

  • Aop原理
    AOP相关的概念1)Aspect:切面,切入系统的一个切面。比如事务管理是一个切面,权限管理也是一个切面。2)Joinpoint:连接点,也就是可以进行横向切入的位置。3)Advice:通知,切面在某个......
  • vue2+element-ui+springboot+mybatis-plus获取当前账户进行修改密码详细教程
    以下内容仅供学习使用新建一个dto类,用于专门修改当前账户的使用importlombok.Data;@DatapublicclassUserPasswordDTO{privateStringusername;priva......
  • SpringBoot之任务调度
    SpringBoot之任务调度开启任务调度@SpringBootApplication//开启任务调度@EnableSchedulingpublicclassTaskDemoApplication{ publicstaticvoidmain(String[]......
  • SpringBoot多数据源(自定义注解,动态数据源,事务实现)
    一、数据库配置文件(这里用的是阿波罗配置中心,也可以是application.yml文件)#mysql本地数据源1spring.datasource.db1.driver-class-name=com.mysql.cj.jdbc.Driverspr......
  • Spring AOP、AspectJ、CGLIB
     静态代理和动态代理AOP代理则可分为静态代理和动态代理两大类,其中静态代理是指使用AOP框架提供的命令进行编译,从而在编译阶段就可生成AOP代理类,因此也称为编译时......
  • springboot 整合各种框架
    springboot整合各种框架整合web框架controller导入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</art......
  • SpringBoot 集成微信支付的各种支付产品
    SpringBoot是一款非常流行的Java开发框架,而微信支付则是众多移动支付产品中的佼佼者,整合两者可以让我们更方便地开发各种支付产品。在本篇博客中,我将介绍如何在Spring......
  • SpringBoot Windows 自启动 - 通过 Windows Service 服务实现
    SpringBoot在Windows运行时,有个黑窗体,容易被不小心选中或关闭,或者服务器重启后,不能自动运行,注册为WindowsService服务可实现SpringBoot项目在Windows中随系统自启动......
  • SpringBoot(六)
    5.2任务这里说的任务系统指的是定时任务。定时任务是企业级开发中必不可少的组成部分,如长周期业务数据的计算,如年度报表,如系统脏数据的处理,再比如系统性能监控报告,还有抢......
  • springboot中让sentinel持久化到nacos中报错sentinel持久化报错Error creating bean w
    若依框架报错原因:pom中没有引入依赖:<!--SpringCloudAlibabaSentinel--><dependency><groupId>com.alibaba.cloud</groupId>......