【Spring篇】Spring的Aop详解

  

      🧸安清h:个人主页

  🎥个人专栏:【计算机网络】【Mybatis篇】【Spring篇】

🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 

目录

🎯初始Sprig AOP及术语

🎯基于XML的AOP实现

🚦配置Spring AOP的XML元素

✨配置切面

✨配置切入点

🚦示例

✨创建UserDao类

✨创建UserDaoImpl类

✨创建XmlAdvice类

✨applicationContext-xml.xml文件

✨创建测试类

🎯基于注解的AOP实现

🚦Spring提供的注解

🚦代码示例

✨创建UserDao类

✨创建UserDaoImpl类

✨创建AnnoAdvice类

✨applicationConext.xml文件

✨创建测试类


🎯初始Sprig AOP及术语

Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的一个核心模块,它允许开发者将横切关注点(如日志、事务管理、安全等)从业务逻辑中分离出来,以提高代码的模块化和可重用性。以下是一些Spring AOP中常用的术语,根据例子来展示其用法:

LogUtils中的printLog()方法用来输出日志

需求:针对UserService的save和delete方法做日志输出的增强

  1. Join Point(连接点):能够被增强的叫做连接点。特指的是类中的方法,以上四个任何一个方法都可以被叫做连接点

  2. Pointcut(切入点):将要被增强的方法。一个切入点一定是一个连接点,但是一个连接点并不一定是一个切入点。在例子中save()和delete()为切入点。

  3. Advice(增强/通知):将要增强的功能所在的方法。例子中由于要对save和delete方法做日志的增强,所以printLog方法叫做增强advice。

  4. Aspect(切面):用来配置切入点和增强关系的。

  5. Target (目标对象):指的是将要被增强的方法所在的对象。例子中UserService对象就是Target对象。

  6. Weaving(织入):将增强运用到切入点的过程叫做织入。

  7. Proxy(代理):将增强运用到切入点之后形成的对象叫做代理对象。

🎯基于XML的AOP实现

Spring中AOP的代理对象是由IOC容器自动生成,所以开发者只需选择选择连接点,创建切面,定义切点并在XML中添加配置信息即可。Spring提供了一系列配置Spring AOP的XML元素。

AOP配置:在切面中配置切入点和增强的关系

🚦配置Spring AOP的XML元素

元素描述
<aop:config>Spring AOP配置的根元素
<aop:aspect>配置切面
<aop:pointcut>配置切入点
<aop:before>定义一个前置通知
<aop:after>定义一个后置通知
<aop:after-returning>定义一个返回后通知
<aop:around>定义一个环绕通知

✨配置切面

在定义<aop:aspect>元素时,通常会指定id,ref这两个属性。

属性名称描述
id用于定义切面的唯一标识,切面起的名字(可以不设置)
ref用于引用普通的Spring Bean,引用的切面类对象bean的id值

✨配置切入点

在定义<aop:pointcut>元素时,通常会指定id,expression这两个属性。

属性名称描述
id用于指定切入点的唯一标识
expression用于指定切入点关联的切入点的表达式

🚦示例

✨创建UserDao类

定义了用户数据操作的接口,包括增删改查四个方法。

public interface UserDao {
    public void insert();
    public void delete();
    public void update();
    public void select();
}

✨创建UserDaoImpl类

实现了UserDao接口,具体执行数据库操作的打印语句。

public class UserDaoImpl implements UserDao{
    @Override
    public void insert() {
        System.out.println("添加用户信息");
    }

    @Override
    public void delete() {
        System.out.println("删除用户信息");
    }

    @Override
    public void update() {
        System.out.println("修改用户信息");
    }

    @Override
    public void select() {
        System.out.println("查询用户信息");
    }
}

✨创建XmlAdvice类

定义了AOP切面,包含前置、后置、环绕、返回和异常通知方法。

public class XmlAdvice {
    // 前置通知
    public void before(JoinPoint joinPoint) {
        System.out.println("这是前置方法");
        System.out.println("目标类是:" + joinPoint.getTarget());
        System.out.println(",被织入增强处理的目标方法为:" + joinPoint.getSignature().getName());
    }

    // 返回通知
    public void afterReturning(JoinPoint joinPoint) {
        System.out.println("这是返回通知,方法不出现异常时调用");
        System.out.println(",被织入增强处理的目标方法为:" + joinPoint.getSignature().getName());
    }

    // 环绕通知
    public Object around(ProceedingJoinPoint point) throws Throwable {
        System.out.println("这是环绕之前的通知");
        Object object = point.proceed();
        System.out.println("这是环绕之后的通知");
        return object;
    }

    // 异常通知
    public void afterException() {
        System.out.println("异常通知!");
    }

    // 后置通知
    public void after() {
        System.out.println("这是后置通知!");
    }
}

✨applicationContext-xml.xml文件

Spring配置文件,配置了数据源、事务管理器、UserDaoImpl和XmlAdvice的Bean,并定义了AOP的切点和通知。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <aop:aspectj-autoproxy/>
    <context:component-scan base-package="com.xml"/>

    <bean id="userDao" class="com.xml.UserDaoImpl"/>
    <bean id="xmlAdvice" class="com.xml.XmlAdvice"/>

    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(* com.xml.UserDaoImpl.*(..))"/>
        <aop:aspect ref="xmlAdvice">
            <aop:before method="before" pointcut-ref="pointcut"/>
            <aop:after-returning method="afterReturning" pointcut-ref="pointcut"/>
            <aop:around method="around" pointcut-ref="pointcut"/>
            <aop:after-throwing method="afterException" pointcut-ref="pointcut"/>
            <aop:after method="after" pointcut-ref="pointcut"/>
        </aop:aspect>
    </aop:config>
</beans>

✨创建测试类

测试类,通过Spring容器获取UserDao的Bean,并调用其方法来验证AOP功能是否正常工作。

public class TestXml {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-xml.xml");
        UserDao userDao = applicationContext.getBean("userDao", UserDao.class);
        userDao.delete();
        System.out.println();
        userDao.insert();
        System.out.println();
        userDao.select();
        System.out.println();
        userDao.update();
    }
}

这是部分运行出来的结果,由于过长,所以在这里只截取了delete部分的作为参考:

🎯基于注解的AOP实现

🚦Spring提供的注解

注解名称描述
@Aspect配置切面
@Pointcut配置切入点
@Before配置前置通知
@After配置后置通知
@Around配置环绕通知
@AfterReturning配置返回通知
@AfterThrowing配置异常通知

下面将通过一个示例来展现:

🚦代码示例

✨创建UserDao类

声明用户数据操作的接口

public interface UserDao {
    public void insert();
    public void delete();
    public void update();
    public void select();
}

✨创建UserDaoImpl类

实现UserDao接口,标注为Spring管理的Bean,并定义基本的数据库操作打印语句。

@Component("userDao")
public class UserDaoImpl implements UserDao{
    @Override
    public void insert() {
        System.out.println("添加用户信息");
    }

    @Override
    public void delete() {
        System.out.println("删除用户信息");
    }

    @Override
    public void update() {
        System.out.println("修改用户信息");
    }

    @Override
    public void select() {
        System.out.println("查询用户信息");
    }
}

✨创建AnnoAdvice类

定义切面,包括前置、后置、环绕、返回和异常通知,用于增强UserDaoImpl类的方法

@Aspect  //告诉Spring,这个东西是用来做AOP的
public class AnnoAdvice {
    //切点
    @Pointcut("execution(* com.xml.UserDaoImpl.*(..))")
    public void pointcut(){}
    //前置通知
    @Before("pointcut()")  //切入点和通知的绑定
    public void before(JoinPoint joinPoint){
        System.out.println("这是前置通知");
        System.out.println("目标类是:"+joinPoint.getTarget());
        System.out.println(",被织入增强处理的目标方法为:"+joinPoint.getSignature().getName());
    }
    //返回通知
    @AfterReturning("pointcut()")
    public void afterReturning(JoinPoint joinPoint){
        System.out.println("这是返回通知");
        System.out.println(",被织入增强处理的目标方法为:"+joinPoint.getSignature().getName());
    }
    //环绕通知
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        System.out.println("这是环绕通知之前的部分");
        Object object=point.proceed();
        System.out.println("这是环绕通知之后的部分");
        return object;
    }
    //异常通知
    @AfterThrowing("pointcut()")
    public void afterException(){
        System.out.println("这是异常通知");
    }
    //后置通知
    @After("pointcut()")
    public void after(){
        System.out.println("这是后置通知");
    }
}

✨applicationConext.xml文件

配置Spring的AOP命名空间、组件扫描和切面相关的Bean定义

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <aop:aspectj-autoproxy/>
    <context:component-scan base-package="com.xml"/>
    <bean id="annoAdvice" class="com.xml.AnnoAdvice"/>
</beans>

✨创建测试类

通过Spring容器获取UserDao的Bean,并调用其方法,预期将触发AnnoAdvice中定义的AOP通知

public class TestAnnotation {
    public static void main(String[]args){
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao=applicationContext.getBean("userDao", UserDao.class);
        userDao.delete();
        System.out.println();
        userDao.insert();
        System.out.println();
        userDao.select();
        System.out.println();
        userDao.update();
    }
}

以上就是今天要讲的内容了,主要讲解了Spring AOP的术语及其两种实现方式等相关内容,如果您感兴趣的话,可以订阅我的相关专栏。非常感谢您的阅读,如果这篇文章对您有帮助,那将是我的荣幸。我们下期再见啦🧸!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/899499.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过运行窗口呼出Windows功能的快捷命令集合

平时使用电脑需要快速调出Windows的一些功能设置&#xff0c;你们是怎么样操作的呢&#xff1f;今天给大家归集一些通过运行窗口快速调出Windows功能的快捷命令&#xff0c;供朋友们参考。示例如下图&#xff0c;各个功能命令集合见表格.

Python实现贪吃蛇大作战

初始版本 初始版本&#xff0c;只存在基本数据结构——双向队列。 游戏思路 贪吃蛇通过不断得吃食物来增长自身&#xff0c;如果贪吃蛇碰到边界或者自身则游戏失败。 食物是绿色矩形来模拟&#xff0c;坐标为随机数生成&#xff0c;定义一个蛇长变量&#xff0c;判断蛇头坐标和…

需求分析基础指南:从零开始理解需求分析

目录 从零开始理解需求分析什么是需求分析&#xff1f;需求分析的目标需求分析的基本原则需求分析的各个阶段需求分析的常用方法和工具编写需求文档总结 从零开始理解需求分析 需求分析是软件开发过程中不可或缺的一环&#xff0c;它帮助我们明确用户的需求&#xff0c;确保最…

养殖场大型全自动饲料颗粒加工机械设备

随着养殖业的快速发展&#xff0c;对饲料加工设备的需求也日益增长。全自动饲料颗粒机作为现代养殖场的重要制粒设备&#xff0c;其自动化、高效化和智能化特点&#xff0c;不仅提高了饲料生产效率&#xff0c;还保障了饲料质量&#xff0c;为养殖业的可持续发展提供了有力支持…

关于jmeter中没有jp@gc - response times over time

1、问题如下&#xff1a; jmeter没有我们要使用的插件 2、解决方法&#xff1a; 选择下面文件&#xff0c;点击应用&#xff1b; 3、问题解决 ps&#xff1a;谢谢观看&#xff01;&#xff01;&#xff01;

【AIGC】AI如何匹配RAG知识库:混合检索

混合搜索 引言单检索的局限性单检索例子 混合检索拆解实现完整代码 总结 引言 RAG作为减少模型幻觉和让模型分析、回答私域相关知识最简单高效的方式&#xff0c;我们除了使用之外可以尝试了解其是如何实现的。在实现RAG的过程中&#xff0c;最重要的是保证召回的知识的准确性…

红日靶场(三)1、环境介绍及环境搭建

1、靶场介绍 红日靶场03是一个用于安全测试和渗透测试的虚拟化环境&#xff0c;可以帮助用户通过模拟攻击和防御场景来提升网络安全技能。该靶场包含了多个虚拟机和网络配置&#xff0c;用户可以在其中进行各种安全测试活动&#xff0c;如信息收集、漏洞利用、权限提升等。 2…

npm install node-sass安装失败

需求&#xff1a;搭建前端开发环境时&#xff0c;npm install报错&#xff0c;错误提示安装node_modules时&#xff0c;node-sass依赖包安装失败&#xff0c;网上找了好久解决方法&#xff0c;大家提示采用淘宝源等方式安装&#xff0c;都失败了了&#xff0c;尝试了很久终于找…

BUUCTF 之Basic 1(BUU BRUTE 11)

今天我们继续BUUCTF之Basic 1的第二关卡。 1、老规矩&#xff0c;进入地址BUUCTF在线评测 (buuoj.cn)打开对应靶场进行启动&#xff0c;会看一个页面&#xff0c;就代表启动成功。 首先分析一下&#xff0c;看到这个页面我们就可以得出是爆破的题目&#xff0c;常用于登陆&am…

1208. 尽可能使字符串相等

Problem: 1208. 尽可能使字符串相等 题目描述 给定两个相同长度的字符串 s 和 t&#xff0c;将字符串 s 转换为字符串 t 需要消耗开销&#xff0c;开销是两个字符的 ASCII 码差值的绝对值。还有一个最大预算 maxCost&#xff0c;我们需要在这个预算范围内&#xff0c;找到 s 中…

基于知识图谱的诗词推荐系统

你是否曾经想在浩如烟海的古代诗词中找到属于自己的那几首“知己”&#xff1f;现在&#xff0c;借助人工智能与知识图谱&#xff0c;古典诗词不再是玄之又玄的文本&#xff0c;而是变成了让你“个性化定制”的文化体验&#xff01;我们带来的这款基于知识图谱的诗词推荐系统&a…

我准备写一份Stable Diffusion入门指南-part1

我准备写个SD自学指南&#xff0c;当然也是第一次写&#xff0c;可能有点凌乱&#xff0c;后续我会持续更新不断优化&#xff0c;我是生产队的驴&#xff0c;欢迎监督。 Stable Diffusion WebUI 入门指南 Stable Diffusion WebUI 是一款基于 Stable Diffusion 模型的用户界面…

SIP 业务举例之 Transfer - Unattended(无人值守呼叫转移)

目录 1. Transfer - Unattended 简介 2. IP Telephony 特性 3. RFC5359 的 Transfer - Unattended 信令流程 无人值守呼叫转移 隐式订阅 Bob 通知 Alice 呼叫转移完成 - NOTIFY 隐含的订阅和显示的订阅 4. Transfer - Unattended 过程总结 博主wx:yuanlai45_csdn 博主…

重写 CSS Flexible Box

一、是什么? Flex 是 Flexible Box 的缩写, 意为 弹性布局, 用来为盒状模型提供更为灵活的布局能力, 它给 Flexbox 的 子元素 之间提供了强大的 空间分布(伸缩) 和 对齐 能力 二、基础概念 2.1 容器 采用 Flex 布局的元素 (设置了 display: flex | inline-flex 的元素) 称…

轻松上手 Disruptor:两个实例解析并发编程利器

Disruptor 是英国外汇交易公司 LMAX 开发的一个高性能队列。很多知名开源项目里&#xff0c;比如 canal 、log4j2、 storm 都是用了 Disruptor 以提升系统性能 。 这篇文章&#xff0c;我们通过两个例子一步一个脚印帮助同学们入门 Disruptor 。 1 环形缓冲区 下图展示了 Di…

详解Oracle审计(一)

题记&#xff1a; 有段时间没写过oracle了&#xff0c;今天回归。 本文将详细介绍oracle的审计功能&#xff0c;基于11g版本&#xff0c;但对12c&#xff0c;19c也同样适用。 审计&#xff08;Audit&#xff09;用于监视用户所执行的数据库操作&#xff0c;并且 Oracle 会将审…

hadoop的yarn

1.分布式的资源调度-yarn(hadoop的一个组件) 资源服务器硬件资源&#xff0c;如&#xff1a;CPU,内存,硬盘,网络等 资源调度:管控服务器硬件资源&#xff0c;提供更好的利用率 分布式资源调度:管控整个分布式服务器集群的全部资源&#xff0c;整合进行统一调度 总结就是使用yar…

chatGpt4.0Plus,Claude3最新保姆级教程开通升级

如何使用 WildCard 服务注册 Claude3 随着 Claude3 的震撼发布&#xff0c;最强 AI 模型的桂冠已不再由 GPT-4 独揽。Claude3 推出了三个备受瞩目的模型&#xff1a;Claude 3 Haiku、Claude 3 Sonnet 以及 Claude 3 Opus&#xff0c;每个模型都展现了卓越的性能与特色。其中&a…

Blazor WebAssembly 项目部署时遇到 500.19错误

这个错误其实很普遍&#xff0c;在部署 asp.net core 的时候都能解决 无非是安装 这些, 尤其是下面那个 Hosting Bundle 但是遇到 Blazor WebAssembly 项目部署时还得多装一个 “重写模块” 下载地址&#xff0c;安装后重启网址 https://www.iis.net/downloads/microsoft/u…