1.5 初探Spring AOP

news2024/11/18 16:55:12

一、提出游吟诗人唱赞歌任务

骑士执行任务前和执行任务后,游吟诗人唱赞歌

1、采用传统方式实现

修改day04子包的勇敢骑士类
在这里插入图片描述
修改day04子包里的救美骑士类
在这里插入图片描述
执行测试类 - TestKnight
在这里插入图片描述

二、采用配置方式使用AOP

1、创建本讲所需子包

在net.hf.spring包里创建day05.aop_xml子包
在这里插入图片描述

2、创建杀龙任务类

在aop_xml子包里创建杀龙任务类 - SlayDragonQuest
在这里插入图片描述

package net.hf.spring.day05.aop_xml;

import org.springframework.stereotype.Component;

/**
 * 功能:杀龙任务类
 * 作者:hf
 * 日期:2023年02月22日
 */
@Component
public class SlayDragonQuest {
    public void embark() {
        System.out.println("执行杀龙任务……");
    }
}

3、创建勇敢骑士类

在aop_xml子包里创建勇敢骑士类 - BraveKnight
在这里插入图片描述

package net.hf.spring.day05.aop_xml;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 功能:勇敢骑士类
 * 作者:hf
 * 日期:2023年02月22日
 */
@Component("RobinHood")
public class BraveKnight {
    @Value("罗宾汉")
    private String name;
    @Autowired
    private SlayDragonQuest slayDragonQuest;

    public void embarkOnQuest() {
        System.out.print("勇敢骑士[" + name + "]");
        slayDragonQuest.embark();
    }
}

4、创建游吟诗人类

在aop_xml子包里创建游吟诗人类 - Minstrel
在这里插入图片描述

package net.hf.spring.day05.aop_xml;

import org.springframework.stereotype.Component;

/**
 * 功能:游吟诗人类
 * 作者:hf
 * 日期:2023年02月22日
 */
@Component
public class Minstrel {
    /**
     * 骑士出发前唱赞歌
     */
    public void singBeforeQuest() {
        System.out.println("啦啦啦,骑士出发了~");
    }

    /**
     * 骑士凯旋时唱赞歌
     */
    public void singAfterQuest() {
        System.out.println("真棒啊!骑士完成了任务~");
    }
}

5、创建Spring配置文件

在resources里创建aop_xml目录,在里面创建spring-config.xml配置文件
在这里插入图片描述

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

    <!--组件扫描-->
    <context:component-scan base-package="net.hf.spring.day05.aop_xml"/>

    <!--配置AOP-->
    <aop:config>
        <!--定义切面-->
        <aop:aspect ref="minstrel">
            <!--定义切点-->
            <aop:pointcut id="embark" expression="execution(* net.hf.spring.day05..*.embarkOnQuest(..))"/>
            <!--声明前置通知-->
            <aop:before method="singBeforeQuest" pointcut-ref="embark"/>
            <!--声明后置通知-->
            <aop:after method="singAfterQuest" pointcut-ref="embark"/>
        </aop:aspect>
    </aop:config>
</beans>

6、添加AOP相关依赖

在pom.xml文件里添加AOP相关依赖
在这里插入图片描述

<!--Spring AOP-->                                         
<dependency>                                              
    <groupId>org.springframework</groupId>                
    <artifactId>spring-aop</artifactId>                   
    <version>5.3.25</version>                  
</dependency>                                             
<!--AspectJ支持-->                                          
<dependency>                                              
    <groupId>aspectj</groupId>                            
    <artifactId>aspectjrt</artifactId>                    
    <version>1.5.4</version>                              
</dependency>                                             
<dependency>                                              
    <groupId>org.aspectj</groupId>                        
    <artifactId>aspectjweaver</artifactId>                
    <version>1.9.19</version>                              
    <scope>runtime</scope>                                
</dependency>                                             

注意:添加新的依赖之后,记得更新
在这里插入图片描述

7、创建测试类 - TestKnight

在test/java里创建net.hf.spring.day05.aop_xml包,在包里创建TestKnight类
在这里插入图片描述

package net.hf.spring.day05.aop_xml;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 功能:测试骑士类
 * 作者:hf
 * 日期:2023年02月22日
 */
public class TestKnight {
    private ClassPathXmlApplicationContext context; // 基于类路径XML配置文件的应用容器

    @Before 
    public void init() {
        // 基于Spring配置文件创建应用容器
        context = new ClassPathXmlApplicationContext("aop_xml/spring-config.xml");        
    }
    
    @Test
    public void testBraveKnight() {
        // 根据名称从应用容器里获取勇敢骑士对象
        BraveKnight braveKnight = (BraveKnight) context.getBean("RobinHood");
        // 勇敢骑士执行任务
        braveKnight.embarkOnQuest();
    }

    @After 
    public void destroy() {
        // 关闭应用容器
        context.close();        
    }
}

运行testBraveKinght()方法,查看结果
在这里插入图片描述

三、采用注解方式使用AOP

1、创建子包

在net.hf.spring包里创建day05.aop_annotation子包
在这里插入图片描述

2、创建杀龙任务类

在aop_annotation子包里创建杀龙任务类 - SlayDragonQuest
在这里插入图片描述

package net.hf.spring.day05.aop_annotation;

import org.springframework.stereotype.Component;

/**
 * 功能:杀龙任务类
 * 作者:hf
 * 日期:2023年02月28日
 */
@Component
public class SlayDragonQuest {
    public void embark() {
        System.out.println("执行杀龙任务……");
    }
}

3、创建勇敢骑士类

在aop_annotation子包里创建勇敢骑士类 - BraveKnight
在这里插入图片描述

package net.hf.spring.day05.aop_annotation;

import net.hf.spring.day05.aop_xml.SlayDragonQuest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 功能:勇敢骑士类
 * 作者:hf
 * 日期:2023年02月28日
 */
@Component("RobinHood")
public class BraveKnight {
    @Value("罗宾汉")
    private String name;
    @Autowired
    private SlayDragonQuest slayDragonQuest;

    /**
     * 勇敢骑士执行杀龙任务
     */
    @Action(name = "动作拦截器")
    public void embarkOnQuest() {
        System.out.print("勇敢的[" + name + "]");
        slayDragonQuest.embark();
    }
}

4、创建游吟诗人切面

在aop_annotation子包里创建游吟诗人切面 - MinstrelAspect
在这里插入图片描述

package net.hf.spring.day05.aop_annotation;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * 功能:游吟诗人切面类
 * 作者:hf
 * 日期:2023年02月28日
 */
@Aspect // 声明为切面类
@Component("minstrel") // 声明为Spring组件
public class MinstrelAspect {
    // 注解声明切入点
    @Pointcut("execution(* net.h分、
    .spring.day05..*.embarkOnQuest(..))")
    public void embark() {
    }

    // 注解声明前置通知
    @Before("embark()")
    public void singBeforeQuest(JoinPoint joinPoint) {
        System.out.println("啦啦啦,骑士出发了~");
    }

    // 注解声明后置通知
    @After("embark()")
    public void singAfterQuest(JoinPoint joinPoint) {
        System.out.println("真棒啊!骑士完成了任务~");
    }
}

切面类与切面配置文件的对应关系
在这里插入图片描述

5、创建Spring配置类

在aop_annotation子包里创建Spring配置类 - SpringConfig
在这里插入图片描述

package net.hf.spring.day05.aop_annotation;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 * 功能:Spring配置类
 * 作者:hf
 * 日期:2023年02月28日
 */
@Configuration // 声明为Spring配置类
@ComponentScan("net.hf.spring.day05.aop_annotation") // 组件扫描
@EnableAspectJAutoProxy // 启用Spring对AspectJ的支持
public class SpringConfig {
}

6、创建骑士测试类

在test/java/的aop_annotation子包里创建测试类 - TestKnight
在这里插入图片描述

package net.hf.spring.day05.aop_annotation;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * 功能:测试骑士类
 * 作者:hf
 * 日期:2023年02月28日
 */
public class TestKnight {
    private AnnotationConfigApplicationContext context; // 基于注解配置类的应用容器

    @Before
    public void init() {
        // 基于注解配置类创建应用容器
        context = new AnnotationConfigApplicationContext(SpringConfig.class);
    }

    @Test
    public void testBraveKnight() {
        // 根据名称从应用容器里获取勇敢骑士对象
        BraveKnight knight = (BraveKnight) context.getBean("RobinHood");
        // 勇敢骑士执行任务
        knight.embarkOnQuest();
    }

    @After
    public void destroy() {
        // 关闭应用容器
        context.close();
    }
}

7、测试勇敢骑士,查看效果

运行测试方法 - testBraveKnight()
在这里插入图片描述

四、实现注解式拦截

1、创建注解接口

在aop_annotation子包里创建注解接口 - Action
在这里插入图片描述

package net.hf.spring.day05.aop_annotation;

import java.lang.annotation.*;

/**
 * 功能:动作注解接口
 * 作者:hf
 * 日期:2023年02月28日
 */
@Target(ElementType.METHOD) // 声明拦截目标 - 方法
@Retention(RetentionPolicy.RUNTIME) // 保留策略 - 运行时
@Documented // 注解文档化
public @interface Action {
    String name();
}

(1)@Target({ElementType.TYPE}) 注解

ElementType 这个枚举类型的常量提供了一个简单的分类:注解可能出现在Java程序中的语法位置(这些常量与元注解类型(@Target)一起指定在何处写入注解的合法位置)

(2)@Retention({RetentionPolicy.Runtime}) 注解

RetentionPolicy这个枚举类型的常量描述保留注解的各种策略,它们与元注解(@Retention)一起指定注释要保留多长时间

(3)@Documented注解

Documented注解表明这个注解是由 javadoc记录的,在默认情况下也有类似的记录工具。 如果一个类型声明被注解了文档化,它的注解成为公共API的一部分。

2、修改勇敢骑士类

勇敢骑士类
在这里插入图片描述

package net.hf.spring.day05.aop_annotation;

import net.hf.spring.day05.aop_xml.SlayDragonQuest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 功能:勇敢骑士类
 * 作者:hf
 * 日期:2023年02月28日
 */
@Component("RobinHood")
public class BraveKnight {
    @Value("罗宾汉")
    private String name;
    @Autowired
    private SlayDragonQuest slayDragonQuest;

    /**
     * 勇敢骑士执行杀龙任务
     */
    @Action(name = "动作拦截器")
    public void embarkOnQuest() {
        System.out.print("勇敢的[" + name + "]");
        slayDragonQuest.embark();
    }
}

3、修改游吟诗人切面

游吟诗人切面类
在这里插入图片描述

package net.hf.spring.day05.aop_annotation;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * 功能:游吟诗人切面类
 * 作者:hf
 * 日期:2023年02月28日
 */
@Aspect // 声明为切面类
@Component("minstrel") // 声明为Spring组件
public class MinstrelAspect {
    // 注解声明切入点
    @Pointcut("@annotation(net.hf.spring.day05.aop_annotation.Action)")
    public void embark(){
    }

    // 注解声明前置通知
    @Before("embark()")
    public void singBeforeQuest(JoinPoint joinPoint) {
        // 获取方法签名
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        // 获取被拦截的方法
        Method method = signature.getMethod();
        // 获取注解式拦截
        Action action = method.getAnnotation(Action.class);
        // 提示用户被拦截了
        System.out.println("[" + action.name() + "]拦截了[" + method.getName() + "]: 拦截前~");

        System.out.println("啦啦啦,骑士出发了~");
    }

    // 注解声明后置通知
    @After("embark()")
    public void singAfterQuest(JoinPoint joinPoint) {
        // 获取方法签名
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        // 获取被拦截的方法
        Method method = signature.getMethod();
        // 获取注解式拦截
        Action action = method.getAnnotation(Action.class);
        // 提示用户被拦截了
        System.out.println("[" + action.name() + "]拦截了[" + method.getName() + "]: 拦截后~");

        System.out.println("真棒啊!骑士完成了任务~");
    }
}

4、测试勇敢骑士

运行测试方法testBraveKnight(),查看效果
在这里插入图片描述

5、修改救美骑士类

救美骑士类 - RescueDamselKnight
在这里插入图片描述

package net.hf.spring.day05.aop_annotation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 功能:救美骑士类
 * 作者:hf
 * 日期:2023年02月28日
 */
@Component
public class RescueDamselKnight {
    @Value("格拉海德")
    private String name;
    @Autowired
    private RescueDanselQuest rescueDamselQuest;

    @Action(name = "狂飙拦截器")
    public void embarkOnQuest() {
        System.out.print("救美骑士[" + name + "]");
        rescueDamselQuest.embark();
    }
}

6、测试救美骑士

运行测试方法testRescueDamselKnight(),查看效果
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hibernate框架【三】——基本映射——一对一映射

系列文章目录 一对一映射 系列文章目录前言一、一对一映射是什么&#xff1f;二、一对一单向关联①一对一主键关联映射②一对一唯一外键映射 三、一对一双向关联①一对一主键关联映射&#xff08;双向关联Person<----->IdCard&#xff09;②h一对一唯一外键关联映射&…

3ds MAX 绘制简易沙发

目的是用3dMAX绘制简易的沙发 用到了长方体、圆角长方体、平移、旋转、阵列、组等操作 首先按照前面的教程创建一个圆角长方体&#xff0c;参数如图&#xff1a; 接着用圆柱体绘制靠背的支柱&#xff0c;为了方便使用阵列一次绘制出十个 我们设置的沙发长度为1&#xff4d;这…

Kibana:为 Kibana 定制自己的品牌 - 8.8

我还记得我刚加入 Elastic 的时候&#xff0c;那个时候在论坛里看到一个贴上是关于如何替换 Kibana 中的 Logo 从而重新定制自己的品牌。在今天&#xff0c;我非常高兴地告诉你&#xff0c;在 Elastic Stack 8.8 中&#xff0c;这个是完全可以通过配置的方式来实现的。 安装 如…

软考A计划-试题模拟含答案解析-卷十三

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

JS中数组22种常用API总结,slice、splice、map、reduce、shift、filter、indexOf......

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 一、引言 在前端开发中&#xff0c;数组是一种常见且重要的数据结构。数组提供了许多便捷的…

【录用案例】1区SCI仅1个月14天录用,新增19篇录用、5篇见刊、6篇检索

2023年5月20日-2023年5月26日&#xff0c;经核实&#xff0c;由我处Unionpub学术推荐的19篇论文已被期刊部录用、5篇见刊、6篇检索&#xff1a; 2区肿瘤类SCI 【期刊简介】IF:4.5-5.0&#xff0c;JCR2区&#xff0c;中科院2区 【检索情况】SCI 在检&#xff0c;正刊 【征稿…

一文包你学会网络数据抓包

本篇将图文并茂教你如何使用抓包工具&#xff0c;并在文章最后教大家如何偷取FTP的用户名密码。 一、安装 本文为大家介绍一个非常好用的抓包工具&#xff0c;科来。 下载地址&#xff1a; http://www.colasoft.com.cn/ 下载科莱 下载完毕&#xff0c;双击直接下一步即可安…

msvcr71.dll丢失的解决方法,多种修复方法全方位分享

当我们在使用某些软件时&#xff0c;可能会出现提示“msvcr71.dll丢失”的错误信息。这个错误信息意味着我们的电脑缺少msvcr71.dll文件&#xff0c;这个文件是由Microsoft Visual C 2003运行库提供的。如果我们遇到这个问题&#xff0c;我们需要采取措施来解决它。本文将介绍m…

体验管理|如何快速低成本开始体验相关的数字化工作‼️

Guofu 第 95⭐️ 篇原创文章分享 &#xff08;点击&#x1f446;&#x1f3fb;上方卡片关注我&#xff0c;加⭐️星标⭐️~&#xff09; &#x1f68f; 写在前面 在体验经济时代&#xff0c;传统企业在应对新需求、新挑战的时候&#xff0c;也需要用新的方式进行企业升级和转型…

DailyMart03:如何基于DDD设计商城的领域模型?

大家好&#xff0c;我是飘渺。既然有人催更那今天咱们就继续更新DDD&微服务系列&#xff01; 在面向对象开发中&#xff0c;所有事物都可以看作是对象。然而&#xff0c;在日常开发中&#xff0c;我们通常从数据出发来设计对象的表现形式&#xff0c;这种做法侧重于数据属性…

二、高通相机bringup 流程

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、相机Sensor 点亮相关的文件二、Sensor 驱动文件详解 一、相机Sensor 点亮相关的文件 1.1 Sensor 驱动XML以及CPP文件 Sensor 文件路径&#xff1a;…

搭建Nextcloud私有云 - 零基础搭建私有云盘并内网穿透远程访问

文章目录 摘要视频教程1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 转载自cpolar极点云的文章&#xff1a;使用Nextcl…

Python网页开发(持续更新ing...)

诸神缄默不语-个人CSDN博文目录 最近更新时间&#xff1a;2023.5.31 最早更新时间&#xff1a;2023.5.31 文章目录 1. 项目实例2. flask包2. Django包3. mod_wsgi包 flask和Django等包是用来写网站的&#xff0c;但这些包构建的网站直接运行是不稳定的&#xff0c;所以需要Apa…

软件设计师(中级)全过程总结

软考总结目录 宏观  学习感受  阶段划分 微观  1.自己看书和看视频&#xff1a;  2.学习的知识点和课后题进行结合  3.做往年的软考真题  4.提炼出相对来说难以攻克的问题组织分享和讨论  5.小组讨论做错的题并进行结构化 总结学习时间上学习方法上学习形式上 宏…

86.建立主体页面-第二部分

上一节我们的基础的页面已经生成了&#xff0c;页面如下&#xff1a; ● 接着我们来编写标题的样式&#xff0c;标题的调整可以根据自己的需求来调整&#xff0c;我这里就直接写 .heading-primary {font-size: 5.2rem;font-weight: 700;line-height: 1.05;color: #333;lette…

一般测试用例执行过程的四个步骤

一般测试用例执行过程的四个步骤 测试用例的执行过程是软件测试中非常重要的一环&#xff0c;它可以有效验证软件是否符合预期的功能和性能要求&#xff0c;进而保证软件的质量和稳定性。一般来说&#xff0c;测试用例的执行过程可以分为四个步骤&#xff1a; 第一步&#xff1…

【C++】struct 和 class 的区别

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快。时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、示例代码 3、总结 1、缘起 在 C 中&#xff0c;struct 和 class 唯一的区别就在于 默认的访问权限不同。区别如下&#xff1a; …

STM32调试功能

文章目录 STM32调试功能1.硬件接口图2.调试原理3.引脚分配4.调试接口使用方式5.芯片配置 STM32调试功能 1.硬件接口图 2.调试原理 Cortex-M内核&#xff08;M0/M3/M4/M7等&#xff09;包含用于高级调试功能的硬件。利用这些调试功能&#xff0c;可以在取指&#xff08;指令断…

设计模式之~命令模式

定义&#xff1a; 命令模式&#xff08;Command&#xff09;&#xff0c;将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 为什么需要命令模式? 在我们的软件开发系统中…

100万数据导出,居然爆炸了OutOfMemoryError?【EasyPoi实战系列】- 第472篇

历史文章&#xff08;文章累计460&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 用…