Spring底层原理学习笔记--第九讲--(aop之ajc增强)

AOP实现之ajc编译器

AOP的另一种实现及原理

A10Application.java

package com.lucifer.itheima.a10;import com.lucifer.itheima.a10.service.MyService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
@Slf4j
public class A10Application {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(A10Application.class,args);MyService service = context.getBean(MyService.class);// 不是代理,说明aop的实现不只代理,这种没有用代理来实现,用的是aspect的编译器来进行增强,这个编译器的原理,就是把我们MyService的类改写了,改写后的class加入了前置增强,最终编译的class// 类在target->classes->包->MyService.class 把这个文件找到,然后拖到idea中来,idea就可以帮我们反编译,编译好的结果中,在我们的foo()方法中多了MyAspect// .aspectOf().before()方法的调用,所以是改写了class来实现增强,目标的类文件都被改写了,那还需要用代理吗,那就不需要了,既然class容器都被改写了,那么跟spring// 容器有关系吗,没有关系,我们的MyAspect切面类没有加@Component注解,说明他并不是由spring来管理的,它是由aspect的编译器来读到切面然后做的增强,并不是spring做的增强,log.info("service class:{}",service.getClass());service.foo();context.close();}
}

MyAspect.java

package com.lucifer.itheima.a10.aop;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;@Aspect    //注意此切面未被spring管理
@Slf4j
public class MyAspect {@Before("execution(* com.lucifer.itheima.a10.service.MyService.foo())")public void before(){log.info("before()");}
}

MyService.java

package com.lucifer.itheima.a10.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;@Service
@Slf4j
public class MyService {public void foo(){log.info("foot()");}
}

pom.xml中添加插件

			<plugin><groupId>org.codehaus.mojo</groupId><artifactId>aspectj-maven-plugin</artifactId><version>1.14.0</version><configuration><comlianceLevel>1.8</comlianceLevel><source>8</source><target>8</target><showWeaveInfo>true</showWeaveInfo><verbose>true</verbose><Xlint>ignore</Xlint><encoding>UTF-8</encoding></configuration><executions><execution><goals><!-- use this goal to weave all your main classes--><goal>compile</goal><!-- use this goal to weave all your test classes--><goal>test-compile</goal></goals></execution></executions></plugin>

class文件中,显示的是:

MyService.class

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package com.lucifer.itheima.a10.service;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;@Service
public class MyService {private static final Logger log = LoggerFactory.getLogger(MyService.class);public MyService() {}public void foo() {MyAspect.aspectOf().before();log.info("foot()");}
}

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

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

相关文章

如何让组织的KPI成为敏捷转型的推手而不是杀手 | IDCF

作者&#xff1a;IDCF学员 伍雪锋 某知名通讯公司首席敏捷教练&#xff0c;DevOps布道者。2020年到2021年小100人团队从0-1初步完成敏捷转型&#xff0c;专注传统制造业的IT转型&#xff0c;研发效能提升。 一、前言 在公司我们常常听见这么一个流传的故事&#xff0c;只要…

HCIA-经典综合实验(二)

经典综合实验&#xff08;二&#xff09; 实验拓扑配置步骤配置Eth-Trunk聚合链路第一步 配置二层VLAN第二步 配置MSTP生成树第三步 配置相关IP地址第四步 配置DHCP及DHCP中继第五步 配置三层的网关冗余协议 VRRP及OSPF第六步 配置静态路由,NAT地址转换及其他配置完善 配置验证…

Linux Ubuntu系统中添加磁盘

在学习与训练linux系统的磁盘概念、文件系统等&#xff0c;需要增加磁盘、扩展现有磁盘容量等&#xff0c;对于如何添加新的磁盘&#xff0c;我们在“Linux centos系统中添加磁盘”中对centos7/8版本中如何添加、查看、删除等&#xff0c;作了介绍&#xff0c;而对Ubuntu版本中…

解决k8s通过traefik暴露域名失败并报错:Connection Refused的问题

我敢说本篇文章是网上为数不多的解决traefik暴露域名失败问题的正确文章。 我看了网上太多讲述traefik夸夸其谈的文章了&#xff0c;包含一大堆复制粘贴的水文和还有什么所谓“阿里技术专家”的文章&#xff0c;讲的全都是错的&#xff01;基本没有一个能说到点子上去&#xf…

Python之函数进阶-递归函数

Python之函数进阶-递归函数 递归 函数直接或者间接调用自身就是 递归递归需要有边界条件、递归前进段、递归返回段递归一定要有边界条件当边界条件不满足的时候&#xff0c;递归前进当边界条件满足的时候&#xff0c;递归返回 递归要求 递归一定要有退出条件&#xff0c;递…

SQL 主从数据库实时备份

在SQL数据库中&#xff0c;主从复制&#xff08;Master-Slave Replication&#xff09;是一种常见的实时备份和高可用性解决方案。这种配置允许将一个数据库服务器&#xff08;主服务器&#xff09;的更改同步到一个或多个其他数据库服务器&#xff08;从服务器&#xff09;&am…

解决:element ui表格表头自定义输入框单元格el-input不能输入问题

表格表头如图所示&#xff0c;有 40-45&#xff0c;45-50 数据&#xff0c;且以输入框形式呈现&#xff0c;现想修改其数据或点击右侧加号增加新数据编辑。结果不能输入&#xff0c;部分代码如下 <template v-if"columnData.length > 0"><el-table-colu…

八股文-面向对象的理解

近年来&#xff0c;IT行业的环境相较以往显得有些严峻&#xff0c;因此一直以来&#xff0c;我都怀有一个愿望&#xff0c;希望能够创建一个分享面试经验的网站。由于个人有些懒惰&#xff0c;也较为喜欢玩乐&#xff0c;导致计划迟迟未能实现。然而&#xff0c;随着年底的临近…

智慧城市项目建设介绍

1. 项目建设背景 随着城市化进程的加速&#xff0c;城市发展面临着诸多挑战&#xff0c;如环境污染、城镇综合管理、经济发展布局等。为了应对这些挑战&#xff0c;智慧城市应运而生&#xff0c;成为城市发展的重要方向。智慧城市通过运用信息技术和智能化技术&#xff0c;实…

Qt UDP通信

UDP通信中单个套接字既是服务器又是客户端。 创建UDP套接字&#xff1a; QUdpSocket *udpSocket; udpSocketnew QUdpSocket(this); 绑定本地端口作为服务端口&#xff1a; udpSocket->bind(port)解除绑定udpSocket->abort(); 向指定ip和端口的主机发送数据报&#…

mmdetection安装与训练

一、什么是mmdetection 商汤科技&#xff08;2018 COCO 目标检测挑战赛冠军&#xff09;和香港中文大学最近开源了一个基于Pytorch实现的深度学习目标检测工具箱mmdetection&#xff0c;支持Faster-RCNN&#xff0c;Mask-RCNN&#xff0c;Fast-RCNN等主流的目标检测框架&#…

Linux 图形界面配置RAID

目录 RAID 1 配置 RAID 5配置 , RAID 配置起来要比 LVM 方便&#xff0c;因为它不像 LVM 那样分了物理卷、卷组和逻辑卷三层&#xff0c;而且每层都需要配置。我们在图形安装界面中配置 RAID 1和 RAID 5&#xff0c;先来看看 RAID 1 的配置方法。 RAID 1 配置 配置 RAID 1…

力扣学习笔记——283. 移动零

力扣学习笔记——283. 移动零 题目描述 https://leetcode.cn/problems/move-zeroes/description/?envTypestudy-plan-v2&envIdtop-100-liked 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &a…

Java架构师分布式搜索词库解决方案

目录 1 IK分词器字典热加载实现思路2 分析IK分词器的配置3 基于MySQL更新字典的实现4 常见报错4.1 java.lang.ExceptionInInitializerError: null …access denied (“java.lang.RuntimePermission” “setContextClassLoader”)4.2 java.sql.SQLNonTransientConnectionExcepti…

OpenGL的学习之路-3

前面1、2介绍的都是glut编程 下面就进行opengl正是部分啦。 1.绘制点 #include <iostream> #include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h>void myMainWinDraw();int main(int argc,char** argv) {glutInit(&argc,argv);glutIni…

windows构建ROS2 Android App

windows构建ROS2 Android App 升级到ROS2之后,由于架构的不同,导致ROS1的Android App已经无法使用了,所以我们需要通过ROS2 java构建出Android的依赖库 环境要求 window10以上wsl(我用的是WSL构建的,你也可以用linux虚拟机)docker(安装的时候选择WSL)Ubuntu 18.04以上…

基于谐波参数空间的卷积神经网络自动三维牙齿分割

论文连接&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S1524070320300151 机构&#xff1a; a英国卡迪夫大学计算机科学与信息学院 b中国科学院大学北京 c中国科学院计算技术研究所北京 d深圳大数据研究院&#xff0c;深圳518172 代码链接&#x…

本机IP地址查询指令详解

本机IP地址是指在局域网内的计算机的私有IP地址&#xff0c;它是连接网络的基础。了解本机IP地址与相关指令的使用方法&#xff0c;在网络维护以及安全等方面都具有重要的意义。 一、查看本机IP地址 不同的操作系统使用不同的指令来查看本机IP地址。以下是一些常用操作系统的指…

Window MongoDB安装

三种NOSQL的一种,Redis MongoDB ES 应用场景: 1.社交场景:使用Mongodb存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人,地点等功能 2.游戏场景:使用Mongodb存储游戏用户信息,用户的装备,积分等直接以内嵌文档的形式存储,方便查询,高效率存储和访问…

保姆级vue-pdf的使用过程

第一步 引入vue-pdf npm install --save vue-pdf 第二步 按照需求我们慢慢进行 01.给你一个pdf文件的url&#xff0c;需要在页面渲染 代码 <template><div><pdfref"pdf":src"url"></pdf></div> </template> <…