11.AOP之注解配置

news2025/1/9 15:30:29

1.使用IDEA创建工程
在这里插入图片描述
在这里插入图片描述

2.引入项目使用的依赖

<dependencies>
	<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.2.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.13</version>
	</dependency>
</dependencies>

3.编写Spring框架核心配置文件applicationContext.xml
在项目目录“/src/main/resources”下新建applicationContext.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
        https://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">

    <!-- 组件扫描 -->
    <context:component-scan base-package="com.steven"/>

    <!-- AOP的自动代理 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

4.编写代码
(1).目标类代码
在项目目录“/src/main/java/com/steven”下新建service目录,并在service目录下新建IAccountService接口和AccountServiceImpl实现类,具体代码如下。

public interface IAccountService {
    void transfer(String outUser,String inUser,Double money);
}
@Service
public class AccountServiceImpl implements IAccountService {

    public void transfer(String outUser, String inUser, Double money) {
        System.out.println(outUser + "向" + inUser + "转账" + money + "元");
    }
}

(2).通知类代码
在项目目录“/src/main/java/com/steven”下新建advice目录,并在advice目录下新建MyAdvice类,具体代码如下。

@Aspect
@Component
public class MyAdvice {
    @Before("execution(public void com.steven.service.AccountServiceImpl.transfer(..))")
    public void before() {
        System.out.println("前置通知执行了....");
    }

//    @AfterReturning("execution(public void com.steven.service.AccountServiceImpl.transfer(..))")
//    public void afterReturning() {
//        System.out.println("后置通知执行了....");
//    }
//
//    @AfterThrowing("execution(public void com.steven.service.AccountServiceImpl.transfer(..))")
//    public void afterThrowing() {
//        System.out.println("异常通知执行了....");
//    }
//
//    @After("execution(public void com.steven.service.AccountServiceImpl.transfer(..))")
//    public void after() {
//        System.out.println("最终通知执行了....");
//    }
//
//    /**
//     * 环绕通知
//     *
//     * @param pjp 正在执行的连接点,切点
//     * @return
//     */
//    @Around("execution(public void com.steven.service.AccountServiceImpl.transfer(..))")
//    public Object around(ProceedingJoinPoint pjp) {
//        Object proceed = null;
//        try {
//            System.out.println("前置通知执行了");
//            proceed = pjp.proceed();
//            System.out.println("后置通知执行了");
//        } catch (Throwable throwable) {
//            throwable.printStackTrace();
//            System.out.println("异常通知执行了");
//        } finally {
//            System.out.println("最终通知执行了");
//        }
//        return proceed;
//    }
}

(3).切点表达式

execution([修饰符] 返回值类型 包名.类名.方法名(参数))
  • 访问修饰符可以省略
  • 返回值类型、包名、类名、方法名可以使用星号 * 代替,代表任意
  • 包名与类名之间的一个点 . 代表当前包下的类,两个点 … 表示当前包及其子包下的类
  • 参数列表可以使用两个点 … 表示任意个数,任意类型的参数列表

(4).切点表达式抽取

@Aspect
@Component
public class MyAdvice {
    @Pointcut("execution(* com.steven..*.*(..))")
    public void myPoint() {
    }

    @Before("MyAdvice.myPoint()")
    public void before() {
        System.out.println("前置通知...");
    }
}

(5).通知类型

名称注解名称说明
前置通知@Before指定增强的方法在切入点方法之前执行
后置通知@AfterReturning指定增强的方法在切入点方法之后执行
异常通知@AfterThrowing指定增强的方法出现异常后执行
最终通知@After无论切入点方法执行时是否有异常,都会执行
环绕通知@Around开发者可以手动控制增强代码在什么时候执行

当前四个通知组合在一起时,执行顺序如下,
@Before -> @After -> @AfterReturning(@AfterThrowing)

6.编写测试类
在项目目录“/src/main/java”下新建Test类,具体代码如下。

public class Test {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        IAccountService accountService = (IAccountService) context.getBean("accountService");
        accountService.transfer("steven", "sherry", 100d);
    }
}
前置通知执行了....
steven向sherry转账100.0

7.工程目录
在这里插入图片描述

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

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

相关文章

一、计算机网络体系结构(一)计算机网络概述

目录 1.1计算机网络的概念、组成与功能 1.2计算机网络的分类 1.2.1按分布范围分类 1.2.2按传输技术分类 1.2.3按拓扑结构分类 1.2.4按使用者分类 1.2.5按交换技术分类 1.2.6按传输介质分类 1.3计算机网络的主要性能指标 1.1计算机网络的概念、组成与功能 计算机网络的…

PHP单商户视频号对接流程

一、序关联至对应视频号&#xff0c;并在视频号带货直播中使用。 首先&#xff0c;商家需要在微信后台申请自定义版交易组件权限&#xff0c;申请成功后&#xff0c;可以将小程 二、申请开通商户号 等商户号审核之后在操作一下步骤接口调用&#xff08;pro为例&#xff09; 实…

k8s ~ 数据存储、安全认证、DashBoard。

k8s ~ 数据存储。 文章目录k8s ~ 数据存储。8.1 基本存储。8.1.1 EmptyDir。8.1.2 HostPath。8.1.3 NFS。8.2 高级存储。8.2.1 PV。8.2.2 PVC。8.2.3 生命周期。8.3 配置存储。8.3.1 ConfigMap。8.3.2 Secret。9. 安全认证。9.1 访问控制概述。9.2 认证管理9.3 授权管理。9.4 准…

Flink窗口(Flink Window)

上一篇flink watermark讲到Flink 中事件时间和水位线的概念&#xff0c;那它们有什么具体应用呢&#xff1f;当然是做基于时间的处理计算了。其中最常见的场景&#xff0c;就是窗口聚合计算。 之前我们已经了解了 Flink 中基本的聚合操作。在流处理中&#xff0c;我们往…

Neo4j的Java API操作

Neo4j的Java API操作 文章目录Neo4j的Java API操作0. 写在前面1、前置芝士2. 准备工作2.1 为项目引入Neo4j依赖2.2 启动和停止3、Java操作Neo4j4、参考资料0. 写在前面 Linux版本&#xff1a;Ubuntu Kylin 16.04Neo4j版本&#xff1a;Neo4j-3.2.7 CommunityProject Build Tool…

微服务链路追踪SkyWalking(9.2.0)

微服务链路追踪SkyWalking(9.2.0) 链路追踪介绍 对于一个大型的几十个、几百个微服务构成的微服务架构系统&#xff0c;通常会遇到下面一些问题&#xff0c;比如&#xff1a; 如何串联整个调用链路&#xff0c;快速定位问题&#xff1f;如何缕清各个微服务之间的依赖关系&am…

m基于FPGA的GPS收发系统开发,包括码同步,载波同步,早迟门跟踪环,其中L1采用QPSK,L2采用BPSK

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 最早的GPS包含L1和L2两个频段&#xff0c;其中L1上调制CA码&#xff0c;P码以及导航电文&#xff0c;L2上调制P码和导航电文。在实际接收到的GPS信号中&#xff0c;我们除了能够接受到CA码和P码外…

语雀模板测试

Markdown 和快捷键全覆盖 &#x1f4a1; Tips&#xff1a;语雀支持全功能 markdown 语法&#xff0c;可以点击文档编辑页右下角小键盘查看全部支持的语法和快捷键。 支持导入导出 markdown 文件。支持自动识别粘贴的 markdown 格式内容转换为富文本。 行内代码 &#x1f4a1; …

Apache HTTPD 多后缀解析漏洞

Apache HTTPD 支持一个文件拥有多个后缀&#xff0c;并为不同后缀执行不同的指令。比如&#xff0c;如下配置文件&#xff1a; AddType text/html .html AddLanguage zh-CN .cn 其给.html后缀增加了media-type&#xff0c;值为text/html&#xff1b;给.cn后缀增加了语言&…

DBCO四嗪试剂特点整理:Me-Tetrazine-DBCO,甲基-四嗪-二苯并环辛炔

【中文名称】甲基-四嗪-二苯并环辛炔 【英文名称】 Me-Tetrazine-DBCO 【CAS号】N/A 【分子式】C29H24N6O2 【分子量】488.55 【基团】DBCO基团 【纯度】95% 【规格标准】1g&#xff0c;5g&#xff0c;10g&#xff0c;包装灵活&#xff0c;可进行相应的封装。 【是否接受定制…

Linux进程的数据结构

在Linux里面&#xff0c;无论是进程还是线程&#xff0c;到了内核里面统一叫任务&#xff08;task&#xff09;&#xff0c;有一个统一的结构task_struct进行管理。 在程序执行过程中&#xff0c;一旦调用到系统调用&#xff0c;就需要进入内核继续执行&#xff0c;那么讲用户…

5.DI之注解配置

1.编写Spring框架核心配置文件applicationContext.xml 在项目目录“/src/main/resources”下新建applicationContext.xml文件&#xff0c;具体代码如下。 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework…

HashMap1.8也会发生死循环—记录

目录 代码 jstack 分析 什么是哈希表 在讨论哈希表之前&#xff0c;我们先大概了解下其他数据结构在新增&#xff0c;查找等基础操作执行性能 数组&#xff1a;采用一段连续的存储单元来存储数据。对于指定下标的查找&#xff0c;时间复杂度为O(1)&#xff1b;通过给定值进…

web课程设计网页规划与设计:HTML+CSS美妆设计题材——雅诗兰黛(5页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

制作移动端整页滚动动画

制作移动端整页滚动动画 需要用到 rem7.5.js(rem适配) pageSlider.js(控制动画的js文件) 基于zepto&#xff0c;引入zepto.js文件 animate.css(动画样式) base.css(公共样式) 下面看一下页面结构 <div class"section sec1"style"background-image:url(./ima…

Java设计模式 - 管道模式

管道模式是责任链模式的常用变种之一&#xff0c;但是管道模式和责任链模式有一个关键的区别&#xff0c;在看一些博客的时候并没有体现出来出来&#xff0c;很多人都把责任链模式当做管道模式来说。 定义 管道模式使用有序的Stage(或者Handler)来顺序的处理一个输入值&#…

以智能视觉驱动智慧出行,看中科创达如何持续深耕汽车市场

当前&#xff0c;360全景环视&#xff08;AVM&#xff09;正在往丰富的ADAS功能、透明底盘功能、不同等级的自动泊车功能等领域拓展&#xff0c;全景环视市场的多元化增长路径已经全面开启。 高工智能汽车研究院监测数据显示&#xff0c;2022年1-9月中国市场&#xff08;不含进…

工厂应该如何批量打印送货单和产品标签

01基本需求 图1是公司的出货明细表&#xff0c;要求按图2的样式批量打印标签&#xff0c;然后将标签张贴在产品包装箱上&#xff0c;否则客户不收货。 其中A7单元格用于存放条形码&#xff0c;条形码用于存放产品的订单号。 图1 订单表 图2 标签模板样式 02操作步骤 利用E…

【2023春招Java岗面试】 90% 会问到的 200+Java 面试题汇总(含答案解析),一定要抓住重点

前言 很多朋友问&#xff0c;有没有整理今年的一些面试题&#xff0c;最近抽时间整理了一份 Java 面试题。或许这份面试题还不足以囊括所有 Java 问题&#xff0c;但有了它&#xff0c;我相信足以应对目前市面上绝大部分的 Java 面试了&#xff0c;因为这篇文章不论是从深度还…

简单讲解Linux PSCI框架

说明&#xff1a; Kernel版本&#xff1a;4.14ARM64处理器使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 介绍 PSCI, Power State Coordination Interface&#xff0c;由ARM定义的电源管理接口规范&#xff0c;通常由Firmware来实现&#xff0c;而Linux系统可…