Spring的AOP开发-注解方式开发AOP

基于注解配置的AOP

注解方式AOP的基本使用

  • Spring的AOP也提供了注解方式配置,使用相应的注解替代之前的xml配置,xml配置AOP时,我们主要配置了三部分:目标类被Spring容器管理(注解使用@Service)、通知类被Spring容器管理(注解使用@Component)、通知与切点的织入(切面)(使用注解@Aspect,不同的通知使用不同对应的注解),如下

使用注解具体示例代码

package com.example.advice;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;// 自定义增强类,内部提供增强方法
@Component
@Aspect // 告诉Spring容器该类是一个切面
public class MyAdvice {@Before("execution(void com.example.Service.ServiceImpl.UserServiceImpl.*(..))")// todo 前置通知public void beforeAdvice() {System.out.println("前置通知");}// todo 后置通知@AfterReturning("execution(void com.example.Service.ServiceImpl.UserServiceImpl.*(..))")public void afterAdvice() {System.out.println("后置通知");}// todo 环绕通知@Around("execution(void com.example.Service.ServiceImpl.UserServiceImpl.*(..))")public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {// 前置通知System.out.println("环绕通知:前置通知");Object res = proceedingJoinPoint.proceed(); // 执行目标方法System.out.println("环绕通知中目标方法执行了");// 后置通知System.out.println("环绕通知:后置通知");return res;}// todo 异常通知@AfterThrowing(pointcut = "execution(void com.example.Service.ServiceImpl.UserServiceImpl.*(..))", throwing = "throwable")public void afterThrowingAdvice(Throwable throwable) {System.out.println("异常抛出通知...出现异常才会执行");}// todo 最终通知@After("execution(void com.example.Service.ServiceImpl.UserServiceImpl.*(..))")public void endAdvice() {System.out.println("最终通知....怎么样都会通知");}}

 只需要在配置文件中指定组件扫描范围即可

测试类代码如下

package com.example.Test;import com.example.Service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestMyAOP {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext3.xml");UserService userService = applicationContext.getBean(UserService.class);userService.show1();}
}

 运行结果如下

可以参考java web专栏中的AOP相关文章:内容管理-CSDN创作中心

注解方式AOP配置详解

package com.example.advice;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;// 自定义增强类,内部提供增强方法
@Component
@Aspect // 告诉Spring容器该类是一个切面
public class MyAdvice {// todo 切点表达式的抽取@Pointcut("execution(void com.example.Service.ServiceImpl.UserServiceImpl.*(..))")public void MyPointCut() {}@Before("MyAdvice.MyPointCut()")// todo 前置通知public void beforeAdvice() {System.out.println("前置通知");}// todo 后置通知@AfterReturning("MyAdvice.MyPointCut()")public void afterAdvice() {System.out.println("后置通知");}// todo 环绕通知@Around("MyAdvice.MyPointCut()")public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {// 前置通知System.out.println("环绕通知:前置通知");Object res = proceedingJoinPoint.proceed(); // 执行目标方法System.out.println("环绕通知中目标方法执行了");// 后置通知System.out.println("环绕通知:后置通知");return res;}// todo 异常通知@AfterThrowing(pointcut = "MyAdvice.MyPointCut()", throwing = "throwable")public void afterThrowingAdvice(Throwable throwable) {System.out.println("异常抛出通知...出现异常才会执行");}// todo 最终通知@After("MyAdvice.MyPointCut()")public void endAdvice() {System.out.println("最终通知....怎么样都会通知");}}

同样的,可以使用配置类来代替上述的配置文件实现全注解开发

package com.example.Config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;//注解配置类替代配置文件,实现纯注解开发
@Configuration // 表示该类是一个核心配置类,同时将该类交给Spring容器管理(内置了@Component注解)
@ComponentScan({"com.example"})//<context:component-scan base-package="com.example"/>
public class SpringConfig {}

 测试类中的获取Spring容器的方法也要改变一下。

注解方式AOP原理解析

如果使用xml配置文件+注解的方式:

还是通过标签中的命名空间对应的命名空间处理器,在MATE-INF文件夹下的spring.handlers文件夹中,进行查找

 不同命名空间对应不同解析器,然后一步步追溯源码,最终还是落脚到实现BeanPostProcessor接口,重写其中的postProcessAfterInitialization方法,向容器中注册bean对象。

如果使用配置类的方式(全注解)

查看注解类中的关键注解@EnableAspectJAutoProxy,

导入了相关类,来注册bean对象


图示三种方法都是底层源码最中都是使用红色框中自动代理构造器创建proxy对象。 

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

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

相关文章

全网唯一!Matlab王者荣耀配色包MHonor

前些日子在家整理文档&#xff0c;偶然发现自己一年前建的一个工程&#xff0c;其大概内容是从王者荣耀一些角色皮肤的原画中提取配色方案&#xff0c;从而用于PPT制作、论文插图绘制等&#xff0c;为枯燥的科研生活增添点儿乐趣。 但是&#xff0c;由于自己当时的技术力还不够…

Java Spring Boot 写 API 接口

在当今快速的软件开发世界中&#xff0c;构建 API 接口是非常常见的任务。因为许多应用程序需要通过 API 接口来与其他应用程序通信。API 接口不仅可以提供应用程序的数据&#xff0c;还可以将应用程序的功能公开为可重用的服务。Java Spring Boot 是一个用于创建独立、产品级别…

Android Studio实现简易计算器(带横竖屏,深色浅色模式,更该按钮颜色,selector,style的使用)

目录 前言 运行结果&#xff1a; 运行截屏&#xff08;p50e&#xff09; apk文件 源码文件 项目结构 总览 MainActivity.java drawable 更改图标的方法&#xff1a; blackbutton.xml bluebuttons.xml greybutton.xml orangebuttons.xml whitebutton.xml layout 布…

关联规则挖掘(上):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

复习 --- QT服务器客户端

服务器&#xff1a; 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer> #include<QTcpSocket> #include<QMessageBox> #include<QDebug> #include<QList> #include<QListWidget> #in…

[C国演义] 第十三章

第十三章 三数之和四数之和 三数之和 力扣链接 根据题目要求: 返回的数对应的下标各不相同三个数之和等于0不可包含重复的三元组 – – 即顺序是不做要求的 如: [-1 0 1] 和 [0, 1, -1] 是同一个三元组输出答案顺序不做要求 暴力解法: 排序 3个for循环 去重 — — N^3, …

IDT 一款自动化挖掘未授权访问漏洞的信息收集工具

IDT v1.0 IDT 意为 Interface detection&#xff08;接口探测) 项目地址: https://github.com/cikeroot/IDT/该工具主要的功能是对批量url或者接口进行存活探测&#xff0c;支持浏览器自动打开指定的url&#xff0c;避免手动重复打开网址。只需输入存在批量的url文件即可。 …

stm32之HAL库操作PAJ75620

一、模块简介 手势模块PAJ7620主要利用IIC或SPI协议来实现数据的传输&#xff0c;本实验用的模块是以IIC来进行信息传输。支持电压从2.8v到3.6v, 正常可以选择3.3v。检测的距离从5到15cm, 可以检测9种手势&#xff0c;包括 右&#xff1a;编码为 0x01左&#xff1a;编码为 0x0…

前端TypeScript学习day01-TS介绍与TS常用类型

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 TypeScript 介绍 TypeScript 是什么 TypeScript 为什么要为 JS 添加类型支持&#xff1f; TypeScript 相…

vertx的学习总结7之用kotlin 与vertx搞一个简单的http

这里我就简单的聊几句&#xff0c;如何用vertx web来搞一个web项目的 1、首先先引入几个依赖&#xff0c;这里我就用maven了&#xff0c;这个是kotlinvertx web <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apac…

win10、win11安装Ubuntu 22.04

目前为止&#xff08;2023年10月6日&#xff09;&#xff0c;最新的 Ubuntu 版本是 Ubuntu 22.04。你可以按照以下步骤在 Windows 上使用 WSL 安装 Ubuntu 22.04&#xff1a; 检查系统要求&#xff1a; 确保你的操作系统是 Windows 10 或更高版本&#xff0c;并已安装 Windows …

调试器通用波形显示工具

前言&#xff1a;事情起因是我们实验室买了个无线调试器是CMSIS-DAP的&#xff0c;无法使用J-SCOPE显示波形来方便调PID&#xff0c;所以我就在网上找到了个开源工具链接&#xff1a;http://t.csdnimg.cn/ZqZPY使用方法&#xff1a;工具是好工具&#xff0c;就是没有使用手册&a…

操作系统知识

操作系统基础 什么是操作系统&#xff1f; 通过以下四点可以概括操作系统到底是什么&#xff1a; 操作系统&#xff08;Operating System&#xff0c;简称 OS&#xff09;是管理计算机硬件与软件资源的程序&#xff0c;是计算机的基石。操作系统本质上是一个运行在计算机上的…

golang gin框架1——简单案例以及api版本控制

gin框架 gin是golang的一个后台WEB框架 简单案例 package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {r : gin.Default()r.GET("/ping", func(c *gin.Context) {//以json形式输出&#xff0c;还可以xml protobufc.JSON…

二、互联网技术——网络协议

文章目录 一、OSI与TCP/IP参考模型二、TCP/IP参考模型各层功能三、TCP/IP参考模型与对应协议四、常用协议与功能五、常用协议端口 一、OSI与TCP/IP参考模型 二、TCP/IP参考模型各层功能 三、TCP/IP参考模型与对应协议 例题&#xff1a;TCP/IP模型包含四个层次&#xff0c;由上至…

您的报告生成器可以动态执行此操作吗?ViewPro可以

ViewPro for .NET 和 ActiveX&#xff1a;报告生成器、打印引擎和打印预览 ViewPro 允许您将打印预览和报告生成器集成到您的 .NET 和 VB6 项目以及其他项目中。您可以使用 ViewPro 构建基于图形和文本的报告或技术绘图&#xff0c;在表单上的滚动和缩放查看器中显示结果&…

Ubuntu无法引导启动的修复

TLDR&#xff1a;使用Boot-Repair工具。 Boot-Repair Boot-Repair是一个简单的工具&#xff0c;用于修复您在Ubuntu中可能遇到的常见启动问题&#xff0c;例如在安装Windows或其他Linux发行版后无法启动Ubuntu时&#xff0c;或者在安装Ubuntu后无法启动Windows时&#xff0c;…

【C语言】善于利用指针(一)

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C语言初步学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读&#xff1a; 1. 什么是指针 1.1 概念 1.2 图解 1.3 示例 2. 指针和指针类型 2.1 指针的定义 2.2 指针的解引…

【图像处理GIU】图像分割(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

c++【3】 常量、指针、指针变量、变量指针

常量是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面量。 常量可以是任何的基本数据类型&#xff0c;可分为整型数字、浮点数字、字符、字符串和布尔值。 常量就像是常规的变量&#xff0c;只不过常量的值在定义后不能进行修改。 1.指针应用…