手写SpringBoot(五)之整合AOP

系列文章目录

手写SpringBoot(一)之简易版SpringBoot
手写SpringBoot(二)之动态切换Servlet容器
手写SpringBoot(三)之自动配置
手写SpringBoot(四)之bean动态加载
手写SpringBoot(五)之整合AOP

手写SpringBoot(五)之整合AOP

Spring开启aop只需要在任意一个加了@Configuration配置类的上面加上@EnableAspectJAutoProxy注解就行

新建my-spring-boot-starter-aop模块

  1. 引入aspectj依赖
		<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.5</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.9.5</version></dependency><dependency><groupId>cn.axj</groupId><artifactId>my-spring-boot-configuration</artifactId><version>1.0-SNAPSHOT</version></dependency>
  1. 创建AopAutoConfiguration配置类,并配置@EnableAspectJAutoProxy注解
package cn.axj.aop.springboot.config;import cn.axj.springboot.my.config.AutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;@Configuration
public class AopAutoConfiguration implements AutoConfiguration {@Configuration@EnableAspectJAutoProxystatic class AspectjConfiguration{}
}
  1. 创建配置类文件 META-INF/service/cn.axj.springboot.my.config.AutoConfiguration文件,并将AopAutoConfiguration的路径配置进去
cn.axj.aop.springboot.config.AopAutoConfiguration

下面开始测试,在user-servcie模块中引入my-spring-boot-starter-aop

	<dependency><groupId>cn.axj</groupId><artifactId>my-spring-boot-starter-aop</artifactId><version>1.0-SNAPSHOT</version></dependency>
  1. 创建aop包,并创建TestAopAnnotation注解
package cn.axj.user.aop;import java.lang.annotation.*;@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TestAopAnnotation {}
  1. 创建aop代理类TestAop
package cn.axj.user.aop;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;@Aspect
@Component
public class TestAop {@Around("@annotation(cn.axj.user.aop.TestAopAnnotation)")public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {Object proceed = proceedingJoinPoint.proceed();String after = "after advice";return after + "____" + proceed;}
}
  1. 在TestController ,test方法上面加上注解@TestAopAnnotation
 	@GetMapping(value = "/test")@TestAopAnnotationpublic String test(Integer id){return userService.test(id).toString();}

开启user-service模块

访问localhost:8080/test?id=2

返回

after advice____User{id=2, username='lisi'},看到返回aop代理字符串after advice____,aop开启成功

系列文章目录

手写SpringBoot(一)之简易版SpringBoot
手写SpringBoot(二)之动态切换Servlet容器
手写SpringBoot(三)之自动配置
手写SpringBoot(四)之bean动态加载
手写SpringBoot(五)之整合AOP

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

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

相关文章

聚合DNS管理系统v1.0全新发布 域名解析管理系统

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析&#xff0c;目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户&…

【Django开发】0到1美多商城项目md教程第5篇:短信验证码,1. 避免频繁发送短信验证码逻辑分析【附代码文档】

美多商城完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;欢迎来到美多商城&#xff01;&#xff0c;项目准备。展示用户注册页面&#xff0c;创建用户模块子应用。用户注册业务实现&#xff0c;用户注册前端逻辑。图形验证码&#xff0c;图形验证码接口设…

似包非包 + 卡特兰数

1、似包非包---组合总和Ⅳ 背包:解决的是“有限制条件下”的“组合”问题 不能解决排列问题 377. 组合总和 Ⅳ - 力扣(LeetCode) class Solution {//注意示例一:(1,1,2)和(1,2,1)和(2,1,1)是不同组合,这是排列组合中的排列,不是组合!!!//背包问题://解决的是“有限…

python学习23:python中的列表(list)中的常用方法

列表(list)中的常用方法 1.列表中常用的方法主要有如下的方法&#xff1a; 2.代码演示主要常用的方法 查找某元素在列表内的下标索引&#xff1a;list.index(元素&#xff09; start_list [coco, xuanxuan, taotao] # 1.1 查找某元素在列表内的下标索引 index start_list…

【力扣】485.最大连续 1 的个数

485. 最大连续 1 的个数 题目描述 给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,0,1,1,1] 输出&#xff1a;3 解释&#xff1a;开头的两位和最后的三位都是连续 1 &#xff0c;所以最大连续 1 的个数是…

元素定位---自动化测试

元素定位 1. 根据id属性进行定位&#xff08;唯一的id&#xff09; 2. name属性进行定位 3. tag name &#xff08;标签名&#xff09;定位和class name&#xff08;标签中的class属性&#xff09;定位 &#xff08;1&#xff09;使用class name 定位搜狗搜索框 &#xff08;2&…

MySQL-单行函数:数值函数、字符串函数、日期和时间函数、流程控制函数、加密与解密函数、MySQL信息函数、其他函数、单行函数练习

1.数值函数 1.1 基本的操作 SELECT ABS(-123),ABS(32),SIGN(-23),SIGN(43),PI(),CEIL(32.32),CEILING(-43.23),FLOOR(32.32), FLOOR(-43.23),MOD(12,5),12 MOD 5,12 % 5 FROM DUAL;1.2 取随机数 SELECT RAND(),RAND(),RAND(10),RAND(10),RAND(-1),RAND(-1) FROM DUAL;1.3 四…

00150 第一节 货币的起源与货币形式的演变 练习题

目录 一、单选题 二、多选题 三、名词解释题 四、简答题 一、单选题

Eclipse EMF教程(下)

Eclipse EMF教程&#xff08;下&#xff09; 翻译自&#xff1a;https://eclipsesource.com/blogs/tutorials/emf-tutorial/ 在接下来的部分中&#xff0c;我们将探索我们生成的代码的EMF API。 EMF API 在教程的这一部分&#xff0c;我们将探索EMF的API&#xff0c;包括生成…

C语言基础语法-教案16(从小白到劝退之结构体初阶)

最近给大家争取到一个 深夜福利 保证你在深夜手机刷到 嘎嘎香~ 那就是 大流量卡 缺点&#xff1a;月租太便宜 185GB~ 100分钟通话时长~ 长期套餐~ 畅想自由的气息 流量自由的同时还拥有超长通话&#xff0c;而且免费领取。 名额有限&#xff0c;咱们废话不多说直接上…

JS详解-手写Promise!!!

前言&#xff1a; 针对js的深入理解&#xff0c;作者学习并撰写以下文章&#xff0c;由于理解认知有限难免存在偏差&#xff0c;请大家指正&#xff01;所有定义来自mdn。 Promise介绍&#xff1a; 对象表示异步操作最终的完成&#xff08;或失败&#xff09;以及其结果值. 描…

代码随想录训练营第三十五期|第2天|数组part02|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结

977. 有序数组的平方 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int[] sortedSquares(int[] nums) {int[] res new int[nums.length];int idx nums.length - 1;int left 0;int right nums.length - 1;while (left < right) {if (nums[left] * nu…

为什么JOS操作系统是用C语言实现的,why not高级编程语言?

C的优点 C提供了大量的控制能力&#xff0c;C可以完全控制内存分配与释放。C几乎没有隐藏的代码&#xff0c;几乎可以在阅读C代码的时候想象到对应的RISC-V机器指令是什么。通过C可以直接访问内存&#xff0c;可以读写PTE的bit位或者设备寄存器。使用C会有极少的依赖&#xff…

7天八股速记之Java 后端——Day 1

接口和抽象类的区别 接口抽象类方法抽象方法既可以有抽象方法&#xff0c;也可以有普通方法关键字修饰interfaceabstract定义常量变量只能定义静态常量成员变量子类方法所有方法必须实现实现所有的抽象方法子类继承多继承单继承构造方法不能有构造方法可以有构造方法接口实现只…

C++:逻辑运算符-非与或(19)

!非!a如果a为假&#xff0c;那么当前他就是真&#xff0c;如果a是真&#xff0c;那么他直接就是假&&与a&&ba与b都为真&#xff0c;那么就是真&#xff0c;如果两个里面有一个为假那么就是假||或a||ba或b有一个为真&#xff0c;那么就是真 非&#xff08;!&…

C++ templates: (3)、变量模板

1、普通变量模板 #include <iostream> using namespace std;template<typename T> int g_value 0;int main(){g_value<int> 10;g_value<double> 11;cout << g_value<int> << "," << g_value<double> &l…

【数据结构与算法】力扣 203. 移除链表元素

题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a; head [1,2,6,3,4,5,6], val 6 输出&#xff1a; [1,2,3,4,5]示例 2&#xff1a; 输…

一文弄懂CNN/RNN/GAN/Transformer等架构

1. 引言 本文旨在友好地介绍深度学习架构&#xff0c;包括卷积神经网络&#xff08;CNN&#xff09;、循环神经网络&#xff08;RNN&#xff09;、生成对抗网络&#xff08;GAN&#xff09;、transformer 和 encoder-decoder 架构。 闲话少说&#xff0c;让我们直接开始吧。 …

【OpenCV】图像像素的遍历

1 前言 介绍两种遍历像素的方法&#xff08;非指针、指针&#xff09;。注意&#xff1a;.at() .ptr()的作用、用法。相关API&#xff1a; Mat对象.ptr() Mat对象.at() 2 代码及内容 #include "iostream" #include "opencv2/opencv.hpp"using namespac…

[已解决]OSError: Unable to load weights from pytorch checkpoint file

问题说明&#xff1a; 最近跑代码遇到了一个奇怪的问题&#xff1a; OSError: Unable to load weights from pytorch checkpoint file for /root/.cache/huggingface/transformers/c506559a5367a918bab46c39c79af91ab88846b49c8abd9d09e699ae067505c6.6365d436cc844f2f2b4885…