Spring第七天(AOP)

这篇具有很好参考价值的文章主要介绍了Spring第七天(AOP)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

AOP(Aspect Oriented Programing)面向切面编程,一种编程范式,指导开发者如何组织程序结构

作用

不惊动原始设计的基础上为其进行功能增强

Spring理念:无入侵式/无侵入式

基本概念

连接点(JoinPoint) : 程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等

        在SpringAOP中,理解为方法的执行

切入点(Pointcut) : 匹配连接点的式子

        在SpringAOP中,一个切入点只描述一个具体方法,也可以匹配多个方法

                一个具体方法:e.g.:dao类中的save方法

                匹配多个方法:所有的save方法,所有以get开头的方法,所有以Dao结尾的接口中的任                  意方法,所有带有一个参数的方法

通知(Advice) : 在切入点执行的操作,也就是共性功能

        在SpringAOP中,功能最终以方法的形式呈现

通知类:定义通知的类

切面(Aspect) : 描述通知与切入点的对应关系

实现案例

第一步、导入相关坐标

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>
    </dependencies>

第二步、定义dao接口与其实现类

package com.cacb.dao.impl;

import com.cacb.dao.BookDao;
import org.springframework.stereotype.Repository;

@Repository
public class BookDaoImpl implements BookDao {
    @Override
    public void save() {
        System.out.println(System.currentTimeMillis());
        System.out.println("BookDao saving!");
    }

    @Override
    public void update() {
        System.out.println("BookDao updating!");

    }
}

第三步、定义通知类,制作通知

public class MyAdvice {
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

第四步、在通知类中定义切入点

public class MyAdvice {
    @Pointcut("execution(void com.cacb.dao.BookDao.update())")
    private void pt(){}

    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

注:

切入点定义依托一个不具有实际意义的方法进行,即无参数,无返回值,方法体无实际逻辑

第五步、在通知类中绑定切入点预通知关系,并指定通知添加到原始连接点的具体执行位置

public class MyAdvice {
    @Pointcut("execution(void com.cacb.dao.BookDao.update())")
    private void pt(){}


    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

第六步、定义通知类受Spring容器管理,并定义当前类为切面类 

@Component
@Aspect
public class MyAdvice {
    @Pointcut("execution(void com.cacb.dao.BookDao.update())")
    private void pt(){}


    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

第七步、在Spring核心配置文件中开启Spring对AOP注解驱动支持

@Configuration
@ComponentScan("com.cacb")
@EnableAspectJAutoProxy
public class SpringConfig {
}

AOP工作流程

1.Spring容器启动

2.读取所有切面配置中的切入点

3.初始化Bean,判定Bean对应的类中的方法是否匹配到任意切入点

        匹配失败,则创建对象

        匹配成功,则创建原始对象(目标对象)的代理对象

4.获取Bean执行方法

        获取Bean,调用方法并执行,完成操作

        获取的Bean是代理对象时,根据代理对象的运行模式运行原始方法与增强的内容,完成操作

目标对象(Target) : 原始功能去掉共性功能对应的类产生的对象,这种对象是无法直接完成最终工作的

代理(Proxy) : 目标对象无法直接完成工作,需要对其进行功能回填,通过原始对象的代理对象实现

APO切入点表达式

切入点:要进行增强的方式

切入点表达式:要进行增强的方法的描述方式

以上例update()方法为例,共有两种描述方式

方式一:接口方式

@Pointcut("execution(void com.cacb.dao.BookDao.update())")

方式二:实现类方式

@Pointcut("execution(void com.cacb.dao.impl.BookDaoImpl.update())")

切入点表达式标准格式:动作关键字(访问修饰符 返回值 包名.类/接口名.方法名 (参数)异常名)

动作关键字:描述切入点的行为动作,例如execution表示执行到指定切入点

访问修饰符:public,private等,可以省略

异常名:方法定义中抛出指定异常,可以省略

通配符

可以使用通配符描述切入点,快速描述

 * 单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现

execution(public * com.cacb.*.UserService.find* (*))

匹配com.cacb包下的任意包中的UserService类或接口中所有find开头的带有一个参数的方法

.. 多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写

execution(public User com..UserService.findById (..))

匹配com包下的任意包中的UserService类或者接口中的所有名称为findById的方法

+ 专用于匹配子类类型

execution(* * ..*Service+.* (..))

AOP通知类型

AOP通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理的位置

AOP通知共分为五种类型

前置通知

@Before("")

后置通知

@After("")

环绕通知

    @Around("")
    public void around(ProceedingJoinPoint pjp) throws Throwable{
        //..原方法前操作
        pjp.proceed(); //表述对原始操作的调用
        //..原方发后操作
    }

如果原方法有返回值 

    @Around("")
    public Object around(ProceedingJoinPoint pjp) throws Throwable{
        //..原方法前操作
        Object result = pjp.proceed(); //表述对原始操作的调用
        //..原方法后操作
        return result
        
        
    }

返回后通知

@AfterReturning("")

只有在调用方法没有抛出异常,正常运行结束后该通知才会运行 

抛出异常后通知

@AfterThrowing("")

只有在调用方法抛出异常后才会运行

@Around注意事项

1.环绕通知必须依赖形参ProceedingJoinPoint才能实现对原始方法的调用,进而实现原始方法调用前后同时添加通知

2.通知中如果未使用ProceedingJoinPoint对原始方法进行调用将跳过原始方法的执行

3.对原始方法的调用可以不接收返回值,通知方法设置成void即可,如果接收返回值,必须设定为Object类型

4.原始方法的返回值如果是void类型,通知方法的返回值类型可以设置成void,也可以设置成Object

5.由于无法预知原始方法运行后是否会抛出异常,因此环绕通知方法必须抛出Throwable对象

AOP通知获取数据

获取参数

JoinPoint:适用于前置、后置、返回后、抛出异常后通知

Spring第七天(AOP),spring,java,后端

ProceedingJoinPoint:适用于环绕通知

Spring第七天(AOP),spring,java,后端

获取返回值

返回后通知Spring第七天(AOP),spring,java,后端

环绕通知文章来源地址https://www.toymoban.com/news/detail-812300.html

Spring第七天(AOP),spring,java,后端

获取异常

抛出异常后通知

Spring第七天(AOP),spring,java,后端 

环绕通知

到了这里,关于Spring第七天(AOP)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java EE 突击 14 - Spring AOP

    这个专栏给大家介绍一下 Java 家族的核心产品 - SSM 框架 JavaEE 进阶专栏 Java 语言能走到现在 , 仍然屹立不衰的原因 , 有一部分就是因为 SSM 框架的存在 接下来 , 博主会带大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相关知识点 并且带领大家进行环境的配置 , 让大家真正用好

    2024年02月11日
    浏览(44)
  • 8.1Java EE——Spring AOP

            Spring的AOP模块是Spring框架体系中十分重要的内容,该模块一般适用于具有横切逻辑的场景,如访问控制、事务管理和性能监控等 一、AOP概述         AOP的全称是Aspect Oriented Programming,即面向切面编程。和OOP不同,AOP主张将程序中相同的业务逻辑进行横向隔离,

    2024年02月16日
    浏览(45)
  • java Sping aop 以及Spring aop 的应用事务管理

    线程死锁概念和如何避免死锁的发生: 线程的通信 wait notify() notify():---Object类 线程的状态: NEW ---start()---就绪状态---CPU时间片---运行状态 RUNNABLE]- --sleep()--- TIMED_WAITING ---wait()---- WAITING ----sysn---Blocked---- 终止状态[T] 线程池: 常见的线程池种类: 4种和原始 在软件业,AOP为Aspect Ori

    2024年02月12日
    浏览(41)
  • JAVA:使用 Spring AOP 实现面向切面编程

    1、简述 在现代的软件开发中,面向切面编程(AOP)是一种重要的编程范式,它允许我们将横切关注点(如日志记录、性能监控、事务管理等)从应用程序的核心业务逻辑中分离出来,以提高代码的模块化和可维护性。Spring 框架提供了强大的 AOP 支持,使得我们可以轻松地实

    2024年04月13日
    浏览(47)
  • 【Java面试】Spring中的IOC和AOP

    IOC:控制反转也叫依赖注入。利用了工厂模式 将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的

    2024年02月10日
    浏览(50)
  • 【Java 初级】Spring核心之面向切面编程(AOP)

    tip:作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。 💕💕 推荐: 体系化学习Java(Java面试专题) AOP(面向切面编程)是一种编程范式,用于将横切关注点(如日志记录、性能统计等

    2024年02月04日
    浏览(51)
  • Java实战:Spring Boot实现AOP记录操作日志

    本文将详细介绍如何在Spring Boot应用程序中使用Aspect Oriented Programming(AOP)来实现记录操作日志的功能。我们将探讨Spring Boot集成AOP的基本概念,以及如何使用Spring Boot实现AOP记录操作日志。最后,我们将通过一个具体示例来演示整个实现过程。本文适合已经具备Spring Boot基础

    2024年02月22日
    浏览(59)
  • 【Java学习】 Spring的基础理解 IOC、AOP以及事务

        官网: https://spring.io/projects/spring-framework#overview     官方下载工具: https://repo.spring.io/release/org/springframework/spring/     github下载: https://github.com/spring-projects/spring-framework     maven依赖: 1.spring全家桶的结构构图:              最下边的是测试单元   其中spring封装

    2024年02月09日
    浏览(43)
  • Java后端07(Spring)

    ​涉及的设计模式:单例模式,简单工厂模式,代理模式,观察者模式,反射,注解。。。。。 ​在传统模式下,对象的创建和赋值,都是由开发者自己手动完成,事实情况下,开发者只关心如何获取赋值好的对象,但是并不希望自己手动进行创建对象和赋值的事情(sprin

    2024年02月13日
    浏览(36)
  • Java Spring 通过 AOP 实现方法参数的重新赋值、修改方法参数的取值

    我创建的项目项目为 SpringBoot 项目 这里以对前端传递过来的加密数据进行解密为例 注解 控制器方法 方式一:通过环绕通知实现 [个人比较推荐] 方式二:通过前置通知 + 反射实现 Java ReflectUtil 反射相关的工具类 由于 JDK 8 中有关反射相关的功能自从 JDK 9 开始就已经被限制了

    2024年02月04日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包