当前位置: 首页 > news >正文

Spring 框架基础:IOC 与 AOP 原理剖析及面试要点

在上一篇中,我们深入探讨了 Java 反射机制,了解了它在运行时动态操作类和对象的强大能力。而今天,我们将进入 Spring 框架的世界。Spring 框架作为 Java 企业级开发中最流行的框架之一,极大地简化了企业级应用的开发过程。对于春招面试而言,Spring 框架的基础知识是重点考察内容,其中控制反转(IOC)和面向切面编程(AOP)是 Spring 框架的核心思想,下面我们来详细了解。

一、控制反转(IOC)

概念与原理

IOC,即控制反转(Inversion of Control),是一种设计思想,它将对象的创建和管理控制权从应用程序本身转移到了 Spring 容器中。在传统的 Java 开发中,对象的创建和依赖关系的管理由开发者在代码中手动完成,这使得代码的耦合度较高,可维护性和可测试性较差。而在 Spring 框架中,通过 IOC 容器,开发者只需将对象的定义和依赖关系配置在 XML 文件或使用注解的方式告诉 Spring 容器,由容器负责创建对象并管理它们之间的依赖关系。

IOC 的实现主要依赖于依赖注入(Dependency Injection,DI)。依赖注入是 IOC 的一种具体实现方式,它有三种常见的注入方式:构造函数注入、Setter 方法注入和接口注入(较少使用)。以构造函数注入为例:

public class UserService {private UserDao userDao;// 构造函数注入public UserService(UserDao userDao) {this.userDao = userDao;}public void saveUser() {userDao.save();}
}public interface UserDao {void save();
}public class UserDaoImpl implements UserDao {@Overridepublic void save() {System.out.println("保存用户到数据库");}
}

在 Spring 配置文件(XML)中可以这样配置:

<bean id="userDao" class="com.example.dao.UserDaoImpl"/>
<bean id="userService" class="com.example.service.UserService"><constructor-arg ref="userDao"/>
</bean>

这样,Spring 容器在创建userService对象时,会自动将userDao对象通过构造函数注入进去。

面试题 1:IOC 的优点是什么?

答案

  • 降低耦合度:对象之间的依赖关系由 Spring 容器管理,对象无需关心其依赖对象的创建和实现细节,只需要关注自身的业务逻辑,从而降低了代码的耦合度,提高了代码的可维护性和可扩展性。例如,当UserDao的实现类发生变化时,只需要在 Spring 配置文件中修改userDao的class属性,而UserService类的代码无需修改。
  • 提高可测试性:由于对象的依赖关系可以通过外部配置进行注入,在测试时可以很方便地为对象提供模拟的依赖对象,从而提高了代码的可测试性。比如在测试UserService时,可以创建一个模拟的UserDao实现类,通过 Spring 容器注入到UserService中,方便对UserService的业务逻辑进行单独测试。
  • 方便管理和维护:Spring 容器集中管理对象的创建和生命周期,便于对对象进行统一的管理和维护,如对象的初始化、销毁等操作都可以由 Spring 容器进行控制。

面试题 2:说说 IOC 容器的工作流程?

答案

  • 资源定位:Spring 容器首先会根据配置文件的位置(如 XML 文件路径或基于注解的配置类)来定位资源。如果是 XML 配置,会读取 XML 文件;如果是基于注解的配置,会扫描指定的包路径来查找被注解标记的类。
  • BeanDefinition 载入:将配置文件中的信息解析成BeanDefinition对象,BeanDefinition包含了创建 Bean 所需的各种信息,如类名、构造函数参数、属性值、依赖关系等。
  • BeanDefinition 注册:将解析后的BeanDefinition注册到BeanDefinitionRegistry中,BeanDefinitionRegistry是 Spring 容器中用于管理BeanDefinition的核心接口,它负责维护所有已注册的BeanDefinition。
  • Bean 实例化:Spring 容器根据BeanDefinition中的信息,通过反射机制创建 Bean 实例。在实例化过程中,如果 Bean 有依赖关系,会递归地实例化其依赖的 Bean,并将它们注入到当前 Bean 中。例如,在创建userService时,会先创建userDao并注入到userService中。
  • Bean 初始化:在 Bean 实例化后,Spring 会对 Bean 进行初始化操作,如调用 Bean 的初始化方法(可以通过init-method属性指定),以及对 Bean 进行一些后置处理(如 AOP 代理的创建等)。
  • Bean 使用:完成初始化后,Bean 就可以被应用程序使用了。当应用程序需要获取某个 Bean 时,从 Spring 容器中获取即可。
  • Bean 销毁:当 Spring 容器关闭时,会对 Bean 进行销毁操作,如调用 Bean 的销毁方法(可以通过destroy-method属性指定),释放 Bean 占用的资源。

二、面向切面编程(AOP)

概念与原理

AOP,即面向切面编程(Aspect - Oriented Programming),它是一种编程范式,旨在将横切关注点(如日志记录、事务管理、权限控制等)从业务逻辑中分离出来,以提高代码的模块化和可维护性。在 Spring 框架中,AOP 通过代理模式实现,主要有 JDK 动态代理和 CGLIB 代理两种方式。

在 AOP 中,有几个关键概念:

  • 切面(Aspect):一个切面是横切关注点的模块化,它包含了一组通知和切入点的定义。例如,一个用于日志记录的切面,包含了在方法执行前后记录日志的通知以及定义哪些方法需要被记录日志的切入点。
  • 通知(Advice):通知是切面在某个连接点上执行的操作,包括前置通知(Before Advice)、后置通知(After Advice)、环绕通知(Around Advice)、异常通知(After - throwing Advice)和最终通知(After - returning Advice)。比如前置通知在方法执行前执行,可用于权限检查;环绕通知可以在方法执行前后都执行自定义逻辑,常用于事务管理。
  • 连接点(Joinpoint):连接点是程序执行过程中的某个特定点,如方法调用、异常抛出等。在 Spring AOP 中,连接点主要指方法调用。
  • 切入点(Pointcut):切入点定义了哪些连接点会被织入通知,它是一组连接点的集合。通过切入点表达式可以精确地指定哪些方法需要应用切面的通知。例如,execution(* com.example.service.*.*(..))表示com.example.service包下所有类的所有方法都是切入点。

以一个简单的日志切面为例,使用注解方式配置:

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 LogAspect {@Around("execution(* com.example.service.*.*(..))")public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("方法开始执行: " + joinPoint.getSignature().getName());Object result = joinPoint.proceed();System.out.println("方法执行结束: " + joinPoint.getSignature().getName());return result;}
}

上述代码定义了一个日志切面LogAspect,使用@Around注解定义了一个环绕通知,切入点表达式为execution(* com.example.service.*.*(..)),表示对com.example.service包下所有类的所有方法进行日志记录。

面试题 3:AOP 有哪些应用场景?

答案

  • 日志记录:在方法执行前后记录日志,用于记录系统的操作日志,方便追踪和调试。如记录用户的登录操作、订单的创建和修改操作等。
  • 事务管理:通过 AOP 可以将事务管理的逻辑从业务代码中分离出来,在方法执行前后自动开启和提交事务,或者在出现异常时回滚事务。例如在一个电商系统中,商品的下单、库存扣减等操作需要在一个事务中进行,通过 AOP 可以很方便地实现事务管理。
  • 权限控制:在方法执行前进行权限检查,确保只有具有相应权限的用户才能访问特定的方法。比如在一个后台管理系统中,只有管理员用户才能执行删除用户的操作,通过 AOP 可以在删除用户方法执行前进行权限校验。
  • 性能监控:通过 AOP 可以在方法执行前后记录时间,计算方法的执行时间,用于性能监控和优化。例如在一个高并发的系统中,对一些核心业务方法进行性能监控,找出性能瓶颈。

掌握 Spring 框架的 IOC 和 AOP 原理,是理解和使用 Spring 框架的关键。下一篇,我们将深入探讨 Spring MVC 相关知识,继续为你的春招面试助力。

相关文章:

Spring 框架基础:IOC 与 AOP 原理剖析及面试要点

在上一篇中&#xff0c;我们深入探讨了 Java 反射机制&#xff0c;了解了它在运行时动态操作类和对象的强大能力。而今天&#xff0c;我们将进入 Spring 框架的世界。Spring 框架作为 Java 企业级开发中最流行的框架之一&#xff0c;极大地简化了企业级应用的开发过程。对于春招…...

《开源与合作:驱动鸿蒙Next系统中人工智能技术创新发展的双引擎》

在当今科技飞速发展的时代&#xff0c;鸿蒙Next系统作为一款具有创新性和前瞻性的操作系统&#xff0c;为人工智能技术的发展提供了广阔的舞台。而开源和合作则是推动鸿蒙Next系统中人工智能技术创新和发展的两大关键引擎。 开源&#xff1a;创新的源泉 代码共享与知识传播&am…...

Redis使用基础

1 redis介绍 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务 ! 是完全开源的&#xff0c;遵守 BSD 协议&#xff0c;是一个高性能的 key-value 数据库。 使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并…...

React和Vue有什么区别,如何选择?

React和Vue有什么区别&#xff0c;如何选择&#xff1f; React 和 Vue 是当前最受欢迎的前端框架之一&#xff0c;两者在开发者中都有极高的声誉。它们都旨在帮助开发人员构建用户界面&#xff0c;但在实现方式和适用场景上有所不同。如果你正考虑在项目中选择 React 或 Vue&a…...

C++|开源日志库log4cpp和glog

文章目录 log4cpp 和 glog对比1. **功能对比**2. **易用性和配置**3. **性能**4. **线程安全**5. **日志输出**6. **功能扩展**7. **适用场景**8. **总结** 其它开源C日志库1. **spdlog**2. **easylogging**3. **Boost.Log**4. **loguru**5. **Poco Logging**6. **Qt Logging (…...

安卓程序作为web服务端的技术实现(三):AndServer作为服务

安卓程序作为web服务端的技术实现&#xff1a;AndServer 实现登录权限拦截-CSDN博客 安卓程序作为web服务端的技术实现&#xff08;二&#xff09;&#xff1a;Room 实现数据存储-CSDN博客 经过两次捣鼓 AndServer已经能正常访问了 但是发现一个问题 就是当我app退出时 AndSe…...

数据结构(Java)——二叉树

1.概念 二叉树是一种树形数据结构&#xff0c;其中每个节点最多有两个子节点&#xff0c;通常被称为左子节点和右子节点。二叉树可以是空的&#xff08;即没有节点&#xff09;&#xff0c;或者由一个根节点以及零个或多个左子树和右子树组成&#xff0c;其中左子树和右子树也分…...

深度学习系列76:流式tts的一个简单实现

1. 概述 使用queue&#xff0c;producer不断向queue中添加audio&#xff0c;然后consumer不断从queue中消费audio。 下面的样例使用melo来生成语音&#xff0c;需要先下载melo.tts。模型在https://myshell-public-repo-hosting.s3.amazonaws.com/openvoice/basespeakers/ZH/ch…...

数据结构(三) 排序/并查集/图

目录 1. 排序 2.并查集 3.图 1.排序: 1.1 概念: 排序就是将数据按照某种规则进行排列, 具有某种顺序. 分为内排序和外排序. 内排序就是: 将数据放在内存中的排序; 外排序是: 数据太多无法在内存中排序的. 1.2 插入排序: 插入排序包含: 直接插入排序和希尔排序. (1) 直接插入…...

WPA Supplicant 技术详解

目录 前言 1. 简介 2. 源码获取 3. 代码架构 3.1 模块结构 3.2. 主要文件和目录 3.3. 顶层模块 3.4 模块之间的关系 4. 工作流程简要描述 启动 加载配置 初始化 认证 数据传输 5. 编译与安装 5.1 编译 5.1.1 libnl库与openssl库准备 5.1.2 修改配置文件 5.…...

Avalonia UI MVVM DataTemplate里绑定Command

Avalonia 模板里面绑定ViewModel跟WPF写法有些不同。需要单独绑定Command. WPF里面可以直接按照下面的方法绑定DataContext. <Button Content"Button" Command"{Binding DataContext.ClickCommand, RelativeSource{RelativeSource AncestorType{x:Type User…...

macOS如何进入 Application Support 目录(cd: string not in pwd: Application)

错误信息 cd: string not in pwd: Application 表示在当前目录下找不到名为 Application Support 的目录。可能的原因如下&#xff1a; 拼写错误或路径错误&#xff1a;确保你输入的目录名称正确。目录名称是区分大小写的&#xff0c;因此请确保使用正确的大小写。正确的目录名…...

【探索 Kali Linux】渗透测试与网络安全的终极操作系统

探索 Kali Linux&#xff1a;渗透测试与网络安全的终极操作系统 在网络安全领域&#xff0c;Kali Linux 无疑是最受欢迎的操作系统之一。无论是专业的渗透测试人员、安全研究人员&#xff0c;还是对网络安全感兴趣的初学者&#xff0c;Kali Linux 都提供了强大的工具和灵活的环…...

《SwinIR:使用Swin-Transformer图像恢复》学习笔记

paper&#xff1a;2108.10257 GitHub&#xff1a;GitHub - JingyunLiang/SwinIR&#xff1a; SwinIR&#xff1a; 使用 Swin Transformer 进行图像修复 &#xff08;官方仓库&#xff09; 目录 摘要 1、Introduction 2、Related Work 2.1 图像修复 2.2 视觉Transformer…...

AR智慧点巡检系统探究和技术方案设计

一、项目背景 随着工业生产规模的不断扩大和设备复杂度的提升&#xff0c;传统的人工点巡检方式效率低下、易出错&#xff0c;难以满足现代化企业对设备运行可靠性和安全性的要求。AR&#xff08;增强现实&#xff09;技术的发展为点巡检工作带来了新的解决方案&#xff0c;通…...

电路研究9.2——合宙Air780EP使用AT指令

这里正式研究AT指令的学习了&#xff0c;之前只是接触的AT指令&#xff0c;这里则是深入分析AT指令了。 软件的开发方式&#xff1a; AT&#xff1a;MCU 做主控&#xff0c;MCU 发 AT 命令给模组的开发方式&#xff0c;模组仅提供标准的 AT 固件&#xff0c; 所有的业务控制逻辑…...

OpenCV相机标定与3D重建(62)根据两个投影矩阵和对应的图像点来计算3D空间中点的坐标函数triangulatePoints()的使用

加粗样式- 操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 这个函数通过使用立体相机对3维点的观测&#xff0c;重建这些点的三维坐标&#xff08;以齐次坐标表示&#xff09;。 cv::triangula…...

基于ollama,langchain,springboot从零搭建知识库四【设计通用rag系统】

需求&#xff1a; 1&#xff1a;可以自定义管理大模型&#xff0c;可自行选择ollama&#xff0c;openai&#xff0c;千问等大模型 2&#xff1a;自定义向量数据库&#xff0c;支持pgvector&#xff0c;elasticsearch&#xff0c;milvus&#xff08;这三个目前比较常用&#xff…...

【Go面试】工作经验篇 (持续整合)

这里写目录标题 什么是逃逸分析服务端怎么接受客户端上传的文件说一下对gin框架的理解gin有哪些常用中间件gin怎么用swagger写接口文档nginx一般是用来做什么如果调用方法经常超时怎么办gin中怎么和mysql通信从mysql调数据到redis,如何同步延时双删redis ,mysql都不存在用户请求…...

“腾讯、钉钉、飞书” 会议开源平替,免费功能强大

在数字化时代&#xff0c;远程办公和线上协作越来越火。然而&#xff0c;市面上的视频会议工具要么贵得离谱&#xff0c;要么功能受限&#xff0c;甚至还有些在数据安全和隐私保护上让人不放心。 今天开源君给大家安利一个超棒的开源项目 - Jitsi Meet&#xff0c;这可是我在网…...

怎样使用树莓派自己搭建一套ADS-B信号接收系统

0 我们知道&#xff0c;ADS-B全称广播式自动相关监视系统&#xff0c;其实就是飞机发出的广播信号&#xff0c;用明码来对外发送自己的位置、高度、速度、航向等信息&#xff0c;是公开信息。连续接收到一架飞机发出的ADS-B信息后&#xff0c;可以通过其坐标点来描绘出飞机的航…...

终极的复杂,是简单

软件仿真拥有最佳的信号可见性和调试灵活性,能够高效捕获很多显而易见的常见错误,被大多数工程师熟练使用。 空间领域应用的一套数据处理系统(Data Handling System),采用抗辐FPGA作为主处理器,片上资源只包含10752个寄存器,软仿也是个挺花时间的事。 Few ms might take …...

粒子群算法 笔记 数学建模

引入: 如何找到全局最大值&#xff1a;如果只是贪心的话&#xff0c;容易被局部最大解锁定 方法有&#xff1a;盲目搜索&#xff0c;启发式搜索 盲目搜索&#xff1a;枚举法和蒙特卡洛模拟&#xff0c;但是样例太多花费巨量时间 所以启发式算法就来了&#xff0c;通过经验和规…...

Vue.js 嵌套路由和动态路由

Vue.js 嵌套路由和动态路由 在 Vue.js 开发中&#xff0c;Vue Router 是官方提供的路由管理器&#xff0c;用于构建单页应用&#xff08;SPA&#xff09;。它支持嵌套路由和动态路由&#xff0c;帮助开发者构建复杂的应用结构。 嵌套路由 嵌套路由允许在路由配置中定义子路由…...

Docker导入镜像

使用命令行进行处理&#xff1a; docker load < onething1_wxedge.tar如下图所示 查看状态 docker images...

C# OpenCV机器视觉:红外体温检测

在一个骄阳似火的夏日&#xff0c;全球却被一场突如其来的疫情阴霾笼罩。阿强所在的小镇&#xff0c;平日里熙熙攘攘的街道变得冷冷清清&#xff0c;人们戴着口罩&#xff0c;行色匆匆&#xff0c;眼神中满是对病毒的恐惧。阿强作为镇上小有名气的科技达人&#xff0c;看着这一…...

STM32项目分享:智能厨房安全检测系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 PCB图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; STM32智能厨房安全检测系统 &#xff08;资料分…...

docker 安装 redis 详解

在平常的开发工作中&#xff0c;我们经常会用到 redis&#xff0c;那么 docker 下应该如何安装 redis 呢&#xff1f;简单来说&#xff1a;第一步&#xff1a;拉取redis镜像&#xff1b;第二步&#xff1a;设置 redis.conf 配置文件&#xff1b;第三步&#xff1a;编写 docker-…...

《探秘鸿蒙Next:人工智能助力元宇宙高效渲染新征程》

在元宇宙的宏大愿景中&#xff0c;高效的渲染技术是构建沉浸式虚拟世界的关键。鸿蒙Next凭借与人工智能的深度融合&#xff0c;为元宇宙的渲染带来了全新的解决方案和无限可能。 智能场景分析与优化 人工智能能够对元宇宙场景进行智能分析。鸿蒙Next可以利用AI技术对场景中的…...

nginx分发请求超时切换服务

nginx的upstream模块实现超时自动切换服务 upstream testfail {server 192.168.1.218 max_fails1 fail_timeout10s;server 192.168.1.129 max_fails1 fail_timeout10s;} max_fails代表失败尝试次数&#xff0c;达到设置的次数则视为该服务不可用&#xff0c; fail_timeout代…...

vulfocus/fastjson-cnvd_2017_02833复现

漏洞概述 Fastjson 是阿里巴巴开发的一个高性能的 Java 库&#xff0c;用于将 Java 对象转换成 JSON 格式&#xff08;序列化&#xff09;&#xff0c;以及将 JSON 字符串转换回 Java 对象&#xff08;反序列化&#xff09;。 fastjson在解析json的过程中,支持使用type字段来指…...

.Net Core微服务入门全纪录(五)——Ocelot-API网关(下)

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…...

OpenCV imread函数读取图像__实例详解

OpenCV imread函数读取图像__实例详解 本文目录&#xff1a; 零、时光宝盒 一、imread函数定义 二、imread函数支持的文件格式 三、imread函数flags参数详解 &#xff08;3.1&#xff09;、Flags-1时&#xff0c;样返回加载的图像&#xff08;使用alpha通道&#xff0c;否…...

GPSd定时检测保活TCP GPS源

为了在 TCP GPS 源丢失连接时自动重新连接&#xff0c;可以编写一个监控脚本&#xff0c;定期检查 gpspipe 输出中的 TCP 源数据是否存在。如果检测到丢失&#xff0c;则使用 gpsdctl 或直接命令重新添加 TCP 源。 1、工具 检查并安装必要工具&#xff0c;本例需要使用 gpspi…...

得物App亮相第七届进博会,科技赋能打造消费新热点

在2024年11月5日至11月10日举办的第七届进博会舞台上&#xff0c;上海交易团虹口分团表现亮眼&#xff0c;其中得物作为来自虹口品质电商的践行者&#xff0c;备受众多参观者关注。 上海得物信息集团有限公司自2015年于上海虹口创立以来&#xff0c;始终坚守“满足年轻人对美好…...

单片机内存管理剖析

一、概述 在单片机系统中&#xff0c;内存资源通常是有限的&#xff0c;因此高效的内存管理至关重要。合理地分配和使用内存可以提高系统的性能和稳定性&#xff0c;避免内存泄漏和碎片化问题。单片机的内存主要包括程序存储器&#xff08;如 Flash&#xff09;和数据存储器&a…...

用Python绘制一只懒羊羊

目录 一、准备工作 二、Turtle库简介 三、绘制懒羊羊的步骤 1. 导入Turtle库并设置画布 2. 绘制头部 3. 绘制眼睛 4. 绘制嘴巴 5. 绘制身体 6. 绘制四肢 7. 完成绘制 五、运行代码与结果展示 六、总结 在这个趣味盎然的技术实践中,我们将使用Python和Turtle图形…...

Python 预训练:打通视觉与大语言模型应用壁垒——Python预训练视觉和大语言模型

大语言模型是一种由包含数百亿甚至更多参数的深度神经网络构建的语言模型&#xff0c;通常使用自监督学习方法通过大量无标签文本进行训练&#xff0c;是深度学习之后的又一大人工智能技术革命。 大语言模型的发展主要经历了基础模型阶段(2018 年到2021年)、能力探索阶段(2019年…...

神经网络梯度爆炸的原因及解决方案

在深度学习中&#xff0c;梯度爆炸&#xff08;gradient exploding&#xff09;是一种常见的训练问题&#xff0c;尤其是在深层神经网络中。梯度爆炸指的是在反向传播过程中&#xff0c;梯度值呈指数级增长&#xff0c;导致网络权重的大幅更新&#xff0c;从而使得网络变得不稳…...

WPS不登录无法使用基本功能的解决方案

前言 WPS不登录无法使用基本功能的原因通常是为了同步数据、提供更多高级功能或满足软件授权要求。‌然而&#xff0c;一些用户可能出于隐私或便捷性的考虑&#xff0c;不愿意登录账号。在这种情况下&#xff0c;WPS可能会限制未登录用户的使用权限&#xff0c;导致工具栏变灰…...

蓝桥杯lesson3---string的使用

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” string的概念 string字符串是一种更加高级的封装&#xff0c;string字符串中包含了大量的方法&#xff0c;这些方法使得字符串的操作变得更加简单&#xff0c;string的使用&…...

Java设计模式 三 工厂方法模式 (Factory Method Pattern)

工厂方法模式 (Factory Method Pattern) 是一种常见的创建型设计模式&#xff0c;旨在通过定义一个接口来创建对象&#xff0c;而将实例化对象的具体类延迟到子类中。工厂方法模式允许客户端通过工厂方法来创建对象&#xff0c;而不需要直接调用构造函数&#xff0c;这样可以减…...

日志收集Day005

1.filebeat的input类型之filestream实战案例: 在7.16版本中已经弃用log类型,之后需要使用filebeat,与log不同&#xff0c;filebeat的message无需设置就是顶级字段 1.1简单使用&#xff1a; filebeat.inputs: - type: filestreamenabled: truepaths:- /tmp/myfilestream01.lo…...

java开发,IDEA转战VSCODE配置(mac)

一、基本java开发环境配置 前提&#xff1a;已经安装了jdk、maven、vscode&#xff0c;且配置了环境变量 1、安装java相关的插件 2、安装spring相关的插件 3、vscode配置maven环境 打开 VsCode -> 首选项 -> 设置&#xff0c;也可以在setting.json文件中直接编辑&…...

Effective C++读书笔记——item23(用非成员,非友元函数取代成员函数)

一、主要观点&#xff1a; 在某些情况下&#xff0c;使用 non-member、non-friend 函数来替换 member 函数可以增强封装性和可扩展性&#xff0c;提供更好的软件设计。 二、详细解释&#xff1a; 封装性&#xff1a; 类成员函数的封装性考量&#xff1a;成员函数可以访问类的…...

(3)STM32 USB设备开发-USB存储设备

例程&#xff1a;STM32USBdevice: 基于STM32的USB设备例子程序 - Gitee.com 本篇为使用芯片内部flash作为USB存储设备的例程&#xff0c;没有知识&#xff0c;全是实操&#xff0c;按照步骤就能获得一个STM32的U盘。本例子是在野火F103MINI开发板上验证的&#xff0c;如果代码…...

考研408笔记之数据结构(五)——图

数据结构&#xff08;五&#xff09;——图 1. 图的基本概念 1.1 图的定义 1.2 有向图和无向图 在有向图中&#xff0c;使用圆括号表示一条边&#xff0c;圆括号里元素位置互换没有影响。 在无向图中&#xff0c;使用尖括号表示一条边&#xff0c;尖括号里元素位置互换则表示…...

【博客之星】年度总结:在云影与墨香中探寻成长的足迹

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、年度回顾 1、创作历程 2、个人成长 3、个人生活与博客事业 二、技术总结 1、赛道选择 2、技术工具 3、实战项目 三、前景与展望 1、云原生未来…...

springboot 调用 c++生成的so库文件

一、创建c文件 SoTest.h #pragma once class SoTest {int Add(int a,int b); };SoTest.cpp #include "SoTest.h"int SoTest::Add(int a, int b) {return a b; }二、创建so文件 /home/ubuntu/projects/SoTest/bin/x64/Debug/libSoTest.so 三、java代码 Maven依…...

简识JVM栈帧中的操作数栈

在JVM&#xff08;Java虚拟机&#xff09;中&#xff0c;栈帧&#xff08;Stack Frame&#xff09;是方法执行时的数据结构&#xff0c;用于存储局部变量、操作数栈、方法返回地址等信息。 其中&#xff0c;操作数栈&#xff08;Operand Stack&#xff09;是栈帧中的一个重要组…...