Spring生态学习路径与源码深度探讨
引言
Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
一、Spring生态概述
Spring生态是一个庞大的体系,涵盖了从基础框架到高级应用的各种组件。以下是一些核心的Spring生态组件:
1. Spring Framework
Spring Framework是Spring生态的核心,提供了控制反转(IoC)和面向切面编程(AOP)两大核心特性。此外,Spring Framework还包含了MVC、JDBC、事务处理等多个模块,为开发者提供了全面的支持。
2. Spring Boot
Spring Boot是Spring Framework的扩展,旨在简化Spring应用的开发和部署。通过自动配置和启动器依赖,Spring Boot可以快速构建独立的、生产级的Spring应用。
3. Spring Cloud
Spring Cloud基于Spring Boot,提供了一套完整的微服务解决方案。它包括服务发现、配置管理、断路器、网关等多个组件,帮助开发者构建分布式系统。
4. Spring Security
Spring Security为Spring应用提供了全面的安全解决方案,包括认证、授权、加密等功能。它支持多种认证方式,并可以轻松地与Spring MVC、Spring Boot等集成。
5. Spring Data
Spring Data提供了一套简化的数据访问抽象,支持多种数据库和NoSQL存储。通过定义接口和简单的配置,开发者可以轻松地实现数据访问功能。
6. 其他组件
除了上述核心组件外,Spring生态还包括Spring Batch(批处理框架)、Spring AMQP(消息队列支持)、Spring Session(会话管理)等多个组件,这些组件共同构成了Spring生态的完整体系。
二、Spring生态学习路径
学习Spring生态需要一个系统的路径,从基础到高级,逐步深入。以下是一个详细的学习路径:
1. Java基础与面向对象编程
在学习Spring之前,需要掌握Java基础语法和面向对象编程思想。这包括Java SE的基础语法、集合框架、异常处理等内容。此外,还需要理解面向对象的设计原则,如SOLID原则、设计模式等。
2. Spring Framework核心原理
2.1 控制反转(IoC)
IoC是Spring的核心特性之一,它通过容器来管理对象的生命周期和依赖关系。学习IoC需要理解Bean的定义、装配和生命周期管理。Spring容器通过反射机制来创建和管理Bean,开发者可以通过XML配置文件或注解来定义Bean。
- Bean的定义:Bean是Spring管理的基本单位,可以通过XML配置文件或注解来定义。XML配置方式使用
<bean>
标签来定义Bean,而注解方式则使用@Component
、@Service
、@Repository
等注解来标记类为Spring管理的Bean。 - Bean的装配:Bean的装配是指将Bean之间的依赖关系注入到Bean实例中。Spring提供了两种主要的依赖注入方式:构造器注入和设置方法注入。构造器注入通过构造器参数来注入依赖,而设置方法注入则通过setter方法来注入依赖。
- Bean的生命周期:Bean的生命周期包括Bean的创建、初始化、使用和销毁等阶段。Spring容器在创建Bean实例后,会调用Bean的初始化方法(如
@PostConstruct
注解的方法),并在Bean不再需要时调用销毁方法(如@PreDestroy
注解的方法)。
2.2 面向切面编程(AOP)
AOP是Spring的另一个核心特性,它允许开发者将横切关注点(如日志、事务管理等)与业务逻辑分离开来。AOP通过代理模式来实现,Spring提供了两种代理方式:JDK动态代理和CGLIB代理。
- AOP的基本概念:AOP的核心概念包括切面(Aspect)、连接点(Joinpoint)、通知(Advice)、切点(Pointcut)和目标对象(Target Object)等。切面是一个横切关注点的模块化,它包含了通知和切点定义;连接点是程序执行过程中的某个点,如方法调用或异常抛出等;通知是在连接点上执行的动作,如前置通知、后置通知等;切点定义了通知应该应用于哪些连接点;目标对象是被代理的对象。
- AOP的实现原理:Spring AOP通过代理模式来实现横切关注点的分离。当目标对象的方法被调用时,代理对象会拦截方法调用,并执行切面中的通知。Spring提供了两种代理方式:JDK动态代理和CGLIB代理。JDK动态代理只能代理实现了接口的类,而CGLIB代理可以代理没有实现接口的类。
2.3 Spring MVC
Spring MVC是Spring框架中的一个模块,用于构建Web应用。它遵循MVC设计模式,将Web应用分为模型(Model)、视图(View)和控制器(Controller)三层。学习Spring MVC需要理解其请求处理流程、控制器、视图解析器等概念。
- 请求处理流程:Spring MVC的请求处理流程包括DispatcherServlet的拦截、HandlerMapping的映射、HandlerAdapter的调用以及ViewResolver的视图解析等步骤。DispatcherServlet是Spring MVC的核心组件,它负责拦截所有的HTTP请求,并将请求分发到相应的处理器上。
- 控制器:控制器是处理HTTP请求的核心组件,它负责接收请求、调用业务逻辑并返回响应。Spring MVC提供了多种控制器实现方式,包括基于注解的控制器和基于XML配置的控制器等。
- 视图解析器:视图解析器负责将控制器返回的视图名称解析为具体的视图对象。Spring MVC支持多种视图技术,如JSP、Thymeleaf等,视图解析器会根据配置选择合适的视图技术进行渲染。
3. Spring Boot快速开发
Spring Boot简化了Spring应用的开发和部署过程。它提供了自动配置和启动器依赖等功能,使得开发者可以快速构建独立的、生产级的Spring应用。学习Spring Boot需要理解其自动配置原理、启动过程以及常用的启动器依赖。
- 自动配置原理:Spring Boot的自动配置是通过
@EnableAutoConfiguration
注解来实现的。该注解会导入AutoConfigurationImportSelector
类,该类会扫描classpath下的META-INF/spring.factories
文件,并加载其中定义的自动配置类。自动配置类会根据项目的依赖和配置来自动配置Spring应用。 - 启动过程:Spring Boot应用的启动过程包括创建
SpringApplication
对象、运行SpringApplication.run
方法以及触发自动配置等步骤。SpringApplication
是Spring Boot的启动类,它负责初始化Spring应用上下文并启动应用。 - 启动器依赖:启动器依赖是Spring Boot提供的一组依赖描述符,它们包含了构建Spring Boot应用所需的所有依赖项。通过引入启动器依赖,开发者可以快速构建Spring Boot应用,而无需手动添加大量依赖项。
4. 微服务架构与Spring Cloud
微服务架构是一种将应用拆分为多个小型服务的架构风格。Spring Cloud提供了一套完整的微服务解决方案,包括服务发现、配置管理、断路器、网关等多个组件。学习Spring Cloud需要理解微服务架构的基本原理和Spring Cloud的各个组件的功能和使用方法。
- 服务发现:服务发现是微服务架构中的核心组件之一,它负责将服务实例注册到服务注册中心上,并允许其他服务通过服务注册中心来发现服务实例。Spring Cloud提供了Eureka和Consul等服务发现组件,它们可以帮助开发者实现服务发现功能。
- 配置管理:配置管理是微服务架构中的另一个重要组件,它负责集中管理服务的配置信息。Spring Cloud Config提供了集中的配置管理功能,允许开发者将配置信息存储在Git、SVN等版本控制系统中,并通过Spring Cloud Config客户端将配置信息注入到Spring应用中。
- 断路器:断路器是一种容错模式,它允许服务在调用链中出现故障时快速失败并返回错误响应,从而避免故障在调用链中传播。Spring Cloud Hystrix提供了断路器功能,它可以帮助开发者实现服务的容错处理。
- 网关:网关是微服务架构中的入口点,它负责接收外部请求并将请求路由到相应的服务实例上。Spring Cloud Zuul提供了网关功能,它可以帮助开发者实现请求的路由和过滤等处理。
5. Spring生态其他组件
除了Spring Framework、Spring Boot和Spring Cloud外,Spring生态还包括许多其他有用的组件。根据项目的需求,可以选择性地学习这些组件。例如,如果需要处理批处理任务,可以学习Spring Batch;如果需要与消息队列集成,可以学习Spring AMQP等。
6. 实战项目与经验积累
理论学习是基础,但实战项目才是检验学习成果的关键。建议通过参与实际项目来加深对Spring生态的理解和应用。在项目中遇到问题时,可以通过查阅官方文档、社区论坛和博客等方式来寻求解决方案。同时,也可以将自己的经验总结成技术博客或分享给同事,以巩固自己的学习成果。
三、Spring源码深度探讨
源码阅读是提升技术水平的重要途径之一。对于Spring这样的复杂框架来说,源码阅读更是必不可少。以下将详细探讨Spring源码中各个重点的底层实现逻辑。
1. IoC容器的底层实现
1.1 BeanDefinition的加载与注册
Spring容器在启动时,会读取配置文件或注解来加载BeanDefinition
。BeanDefinition
是Bean的元数据,包含了Bean的各种属性(如类名、作用域、依赖等)。Spring容器通过BeanDefinitionReader
来读取配置信息,并将其注册到BeanDefinitionRegistry
中。
- XML配置方式:在XML配置方式下,Spring容器会使用
XmlBeanDefinitionReader
来读取XML配置文件,并解析出BeanDefinition
对象。XmlBeanDefinitionReader
会遍历XML文件中的<bean>
标签,并将标签中的属性解析为BeanDefinition
的属性值。 - 注解配置方式:在注解配置方式下,Spring容器会使用
AnnotatedBeanDefinitionReader
来扫描类路径下的注解,并解析出BeanDefinition
对象。AnnotatedBeanDefinitionReader
会使用Java反射机制来读取类上的注解,并根据注解的属性值来构建BeanDefinition
对象。
1.2 Bean的创建与管理
在BeanDefinition
注册完成后,Spring容器会根据BeanDefinition
的定义来创建Bean实例。创建Bean实例的过程包括实例化、属性填充和初始化等步骤。Spring容器通过反射机制来创建Bean实例,并通过依赖注入来填充Bean的属性。在Bean创建完成后,Spring容器还会调用Bean的初始化方法来完成Bean的初始化过程。
- 实例化:Spring容器会根据
BeanDefinition
中定义的类名使用反射机制来创建Bean实例。如果Bean是单例的,则Spring容器会将其缓存起来以便重用;如果Bean是多例的,则每次请求都会创建一个新的Bean实例。 - 属性填充:在Bean实例化完成后,Spring容器会根据
BeanDefinition
中定义的属性信息来填充Bean的属性。这包括通过构造器注入、设置方法注入或字段注入等方式将依赖项注入到Bean中。 - 初始化:在Bean属性填充完成后,Spring容器会调用Bean的初始化方法来完成Bean的初始化过程。初始化方法可以是用户自定义的方法(如使用
@PostConstruct
注解的方法),也可以是Spring容器提供的默认初始化方法。
2. AOP的底层实现
2.1 代理模式的应用
AOP通过代理模式来实现横切关注点的分离。Spring提供了两种代理方式:JDK动态代理和CGLIB代理。JDK动态代理只能代理实现了接口的类,而CGLIB代理可以代理没有实现接口的类。在创建代理对象时,Spring会根据目标对象的类型来选择合适的代理方式。
- JDK动态代理:JDK动态代理是Java标准库提供的一种动态代理机制,它使用
java.lang.reflect.Proxy
类来创建代理对象。JDK动态代理只能代理实现了接口的类,因为它通过接口来创建代理对象的代理类。在创建代理对象时,Spring会使用Proxy.newProxyInstance
方法来生成代理类的实例,并将目标对象作为代理类的构造器参数传递给代理类。 - CGLIB代理:CGLIB是一个强大的、高性能的代码生成库,它可以在运行时扩展Java类并生成子类。CGLIB代理可以代理没有实现接口的类,因为它通过生成目标类的子类来创建代理对象。在创建代理对象时,Spring会使用CGLIB提供的
Enhancer
类来生成目标类的子类,并将目标对象作为子类的构造器参数传递给子类。
2.2 切面与通知的执行
在代理对象创建完成后,当目标方法被调用时,代理对象会拦截方法调用,并执行切面中的通知。通知包括前置通知、后置通知、环绕通知等类型。Spring通过拦截器链来管理通知的执行顺序,确保切面中的通知能够按照预期的顺序执行。
- 前置通知:前置通知是在目标方法执行之前执行的通知。它可以在目标方法执行之前进行一些预处理操作,如检查权限、记录日志等。
- 后置通知:后置通知是在目标方法执行之后执行的通知。它可以在目标方法执行之后进行一些后处理操作,如更新缓存、发送通知等。
- 环绕通知:环绕通知是在目标方法执行前后都执行的通知。它可以在目标方法执行之前和之后进行一些操作,并可以控制目标方法的执行(如是否执行目标方法、如何执行目标方法等)。
3. Spring MVC的底层实现
3.1 请求处理流程
Spring MVC的请求处理流程包括DispatcherServlet
的拦截、HandlerMapping
的映射、HandlerAdapter
的调用以及ViewResolver
的视图解析等步骤。DispatcherServlet
是Spring MVC的核心组件,它负责拦截所有的HTTP请求,并将请求分发到相应的处理器上。
DispatcherServlet
的拦截:DispatcherServlet
是Spring MVC的前端控制器,它负责拦截所有的HTTP请求。当请求到达时,DispatcherServlet
会根据请求的URL和请求方法等信息来选择合适的HandlerMapping
进行请求映射。HandlerMapping
的映射:HandlerMapping
是请求到处理器的映射器,它将请求的URL和请求方法等信息映射到对应的处理器上。Spring MVC提供了多种HandlerMapping
实现,如RequestMappingHandlerMapping
、SimpleUrlHandlerMapping
等。HandlerAdapter
的调用:在找到对应的处理器后,DispatcherServlet
会使用HandlerAdapter
来调用处理器的方法。HandlerAdapter
是处理器适配器,它负责将请求参数传递给处理器的方法,并处理处理器的返回值。ViewResolver
的视图解析:处理器方法执行完成后,DispatcherServlet
会使用ViewResolver
来解析视图名称,并将其渲染为具体的视图对象。ViewResolver
是视图解析器,它负责将视图名称解析为具体的视图实现。
3.2 控制器与视图解析
在处理器调用完成后,Spring MVC会将处理结果传递给视图解析器进行视图解析。视图解析器会根据处理结果来选择合适的视图进行渲染。Spring MVC支持多种视图技术,如JSP、Thymeleaf等。
- 控制器:控制器是处理HTTP请求的核心组件,它负责接收请求、调用业务逻辑并返回响应。在Spring MVC中,控制器通常是一个实现了
Controller
接口的类,或者是一个使用了@Controller
、@RestController
等注解的类。 - 视图解析:视图解析是Spring MVC将处理结果渲染为具体视图的过程。在视图解析过程中,
ViewResolver
会根据处理结果中的视图名称来选择合适的视图实现进行渲染。Spring MVC支持多种视图技术,如JSP、Thymeleaf等,开发者可以根据自己的需求选择合适的视图技术。
4. Spring Boot的自动配置原理
Spring Boot的自动配置原理是通过@EnableAutoConfiguration
注解来实现的。@EnableAutoConfiguration
注解会导入AutoConfigurationImportSelector
类,该类会扫描classpath下的META-INF/spring.factories
文件,并加载其中定义的自动配置类。自动配置类会根据项目的依赖和配置来自动配置Spring应用。
@EnableAutoConfiguration
注解:@EnableAutoConfiguration
注解是Spring Boot自动配置的入口点。当开发者在Spring Boot应用的主类上添加该注解时,Spring Boot会自动扫描classpath下的META-INF/spring.factories
文件,并加载其中定义的自动配置类。AutoConfigurationImportSelector
类:AutoConfigurationImportSelector
类是Spring Boot自动配置的核心类之一。它负责扫描META-INF/spring.factories
文件,并加载其中定义的自动配置类。在加载自动配置类时,AutoConfigurationImportSelector
会根据项目的依赖和配置来选择合适的自动配置类进行加载。- 自动配置类:自动配置类是Spring Boot自动配置的具体实现。它们通常包含了一些条件注解(如
@ConditionalOnClass
、@ConditionalOnBean
等),用于判断当前项目是否满足自动配置的条件。如果满足条件,则自动配置类会将相应的Bean注册到Spring容器中,从而实现自动配置功能。
5. Spring Cloud的服务发现与配置管理
5.1 服务发现
Spring Cloud的服务发现是通过Eureka或Consul等组件来实现的。服务提供者在启动时会将自身的信息注册到服务注册中心上,服务消费者在调用服务时会从服务注册中心上获取服务提供者的信息。服务注册中心会定期检测服务提供者的状态,以确保服务的可用性。
- Eureka:Eureka是Netflix开源的服务注册与发现组件。它包含了服务端和客户端两部分。服务端用于提供服务注册与发现的功能;客户端则负责将服务实例信息注册到服务端,并从服务端获取其他服务实例的信息。在Spring Cloud中,开发者可以通过引入Eureka的启动器依赖来快速集成Eureka服务注册与发现功能。
- Consul:Consul是HashiCorp开源的服务网格解决方案,它提供了服务发现、配置管理和分段服务等功能。与Eureka类似,Consul也包含了服务端和客户端两部分。在Spring Cloud中,开发者可以通过引入Consul的启动器依赖来快速集成Consul服务注册与发现功能。
相关文章:

Spring生态学习路径与源码深度探讨
引言 Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学…...

C++:set详解
文章目录 前言一、set概念介绍二、set的使用1. 插入删除相关2. 查找相关1)find2)count3)lower_bound与upper_bound4)equal_range 三、set的值是不能修改的原理四、基于哈希表的set总结 前言 根据应用场景的不同,STL总…...

(一)- DRM架构
一,DRM简介 linux内核中包含两类图形显示设备驱动框架: FB设备:Framebuffer图形显示框架; DRM:直接渲染管理器(Direct Rendering Manager),是linux目前主流的图形显示框架; 1&am…...

Docker了解
Docker是一种容器化技术,它可以将应用程序和其依赖项打包到一个独立的、可移植的容器中,以便在不同的环境中运行。Docker基于Linux操作系统的容器化技术,可以提供更轻量、更快速、更灵活、更一致的应用部署和管理方式。 Docker的基本概念包括…...

【DL】YOLO11 OBB目标检测 | 模型训练 | 推理
本文进行YOLO11的旋转目标检测任务,旋转目标检测能够更精确地定位和描述那些非水平排列的目标,比如倾斜的飞机、船舶等。在原始的目标检测中,添加一个角度预测,实现定向边界框检测。 话不多说,先来个效果图!!! YOLO11中的旋转目标检测的特点 ▲更精确的定位:通过使用…...
vue读取本地excel文件并渲染到列表页面
1.安装插件(版本0.18.5) npm i xlsx 2.封装插件 <template><div class"container"><slot></slot></div> </template><script> import * as XLSX from xlsx export default {name: ReadExcel,props: {filePath: {type: …...
github 以及 huggingface下载模型和数据
runningcheese/MirrorSite: 镜像网站合集 (github.com) huggingface 下载模型和数据使用snapshot_download的方法 不会修改HuggingFace模型下载默认缓存路径?一篇教会你!_huggingface默认下载路径-CSDN博客 下载模型 使用snapshot_download 使用snapshot_down…...

使用 Vue 配合豆包MarsCode 实现“小恐龙酷跑“小游戏
作者:BLACK595 “小恐龙酷跑”,它是一款有趣的离线游戏,是Google给Chrome浏览器加的一个有趣的彩蛋。当我们浏览器断网时一只像素小恐龙便会出来提示断网。许多人认为这只是一个可爱的小图标, 但当我们按下空格后,小恐…...

51c视觉~合集6
我自己的原文哦~ https://blog.51cto.com/whaosoft/11603901 #CSWin-UNet 将自注意力机制集成到UNet中!CSWin-UNet:U型分割方法,显著提高计算效率和感受野交互!本文提出了CSWin-UNet,这是一种新颖的U型分割方法&…...
STM32(hal库)在串口中,USART和uart有什么区别?
在STM32的HAL库中,USART和UART都是用于串口通信的模块,但它们在功能特性和使用场景上存在一些区别。以下是对两者的详细比较: 一、功能特性 UART(通用异步收发器): 是一种串行、异步、全双工的通信协议。通…...
机器学习、深度学习面试知识点汇总
下面是本人在面试中整理的资料和文字,主要针对面试八股做浅显的总结,大部分来源于ChatGPT,中间有借鉴一些博主的优质文章,已经在各文中指出原文。有任何问题,欢迎随时不吝指正。 文章系列图像使用动漫 《星游记》插图…...

FPGA高速设计之Aurora64B/66B的应用与不足的修正
FPGA高速设计之Aurora64B/66B的应用与不足的修正 Aurora IP协议的特点 首先基于网上找到的一些资料,来讲述下Aurora高速协议的特点与相关的应用。Aurora 协议在 2002 年由 Xilinx 公司首次提出,是由Xilinx提供的一个开源、免费的链路层串行传输通信协议…...
如何通过PHP脚本自动推送WordPress文章至百度站长平台
想要提高网站在百度搜索中的曝光度?百度站长平台提供了一个非常方便的API接口,允许网站自动将新发布的内容推送至百度以加快收录。本文将带您一步步实现这一功能,帮助您的WordPress站点实现每日自动推送最新文章的URL至百度站长平台。 1. 前提条件 确保您有一个已安装并运行…...

ORA-01092 ORA-14695 ORA-38301
文章目录 前言一、MAX_STRING_SIZE--12C 新特性扩展数据类型 varchar2(32767)二、恢复操作1.尝试恢复MAX_STRING_SIZE参数为默认值2.在upgrade模式下执行utl32k.sql 前言 今天客户发来一个内部测试库数据库启动截图报错,描述是“上午出现服务卡顿,然后重…...

upload-labs通关练习---更新到15关
目录 环境搭建 第一关 方法一 修改文件类型 方法二 前端禁用JS绕过 第二关 方法一 修改Content-Type类型 方法二 修改上传文件类型 第三关 第四关 第五关 方法一 Windows大小写绕过 方法二 利用.user.ini 第六关 第七关 第八关 第九关 第十关 第十一关 第十二…...
WPF 应用程序中使用 Prism 框架时,有多种方式可以注册服务和依赖项
Prism 提供了更多的注册方式,适应不同的需求和场景。下面我会全面列出 IContainerRegistry 提供的所有常见注册方式,并附带相应的示例。1. 注册单例(Singleton) 注册单例类型服务,整个应用生命周期内只会创建一个实例&…...

【ESP32】ESP-IDF开发 | 低功耗管理+RTC唤醒和按键唤醒例程
1. 简介 ESP32支持5种低功耗模式,低功耗管理单元包括调压器、功耗控制器、电源开关单元、电源域隔离单元 (Isolation Cell) 等部分。 1.1 RTC单元 RTC单元是ESP32低功耗管理的核心,可用于管理低功耗模式的进入和退出,控制时钟源、PLL、电源开…...

Windows 局域网IP扫描工具:IPScaner 轻量免安装
IPScaner是一款258KB的工具,具备快捷修改IP、批量扫描、地址计算等功能,自动识别本机IP网段,快速查看IP使用情况,适用于监控维护、企业IT运维等场 软件功能介绍: 1)快捷修改本地IP、IP批量扫描、IP地址计算…...
HTML的浮动与定位
1. 浮动 浮动可以使一个元素脱离自己原本的位置,并在父元素的内容区中向左或向右移动,直到碰到父元素内容区的边界或者其它浮动元素为止。 值描述left元素向左浮动right元素向右浮动 普通文档流:浏览器在默认情况下规定一个块元素在父元素…...
【网络安全 | 漏洞挖掘】我如何通过路径遍历实现账户接管
未经许可,不得转载。 文章目录 不久前,我发现了一个我在高中时非常常用的知名应用程序,它在Intigriti上是一个私有程序,本文称之为REDACTED。 我开始参与REDACTED的漏洞赏金计划,这个应用程序在我开始进行黑客攻击之前我已经非常熟悉了。最初我并没有抱太高的期望。 我首…...

408第一季 - 数据结构 - 线性表II
链表 头节点始终指向第一个 头节点的好处: 第一个好处 这里L是头节点 可以发现,删除第一个也可以统一了 第二个好处 这是无头节点,空和非空指向的不一样 然后有头节点就可以统一了! 双链表 插入 第一步要在第四步之前&…...
go中的接口返回设计思想
go中的接口返回设计思想 前言 在学习AI编码过程中,产生了类似以下结构的代码 : type MQClient interface {PublishMessage(queue string, message interface{}) error...... } ... type RabbitMQClient struct {conn *amqp.Connectionchannel *amqp.C…...
Ubuntu20.04启动python的虚拟环境
如果你使用 mkvirtualenv 来创建虚拟环境,说明你已经安装了 virtualenvwrapper,这是一个用于管理 Python 虚拟环境的工具。 激活虚拟环境 要激活你使用 mkvirtualenv 创建的虚拟环境,按照以下步骤操作: 1.确保已经安装了 virtu…...

图片压缩工具 | 图片生成PDF文档
OPEN-IMAGE-TINY,一个基于 Electron VUE3 的图片压缩工具,项目开源地址:https://github.com/0604hx/open-image-tiny ℹ️ 需求描述 上一版本发布后,有用户提出想要将图片转换(或者说生成更为贴切)PDF文档…...
Python的浅拷贝与深拷贝
一、浅拷贝 浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。 浅拷贝有几种方法: 1、 使用数据类型本身的构造器 list1[1,2,3]list2 list(list1) # 使用了数据类型本身的构造器 list…...
C#中datagridview单元格value为{}大括号
使用数据库查询结果绑定datagridview数据源后,在对单元格的值进行处理的过程中出现报错,包括直接多cell.value.ToString()也报错,调试发现该单元格Value为“{}”,与null或""对比判断都没有结果,可使用Conver…...

爆炸仿真的学习日志
今天学习了一下【Workbench LS-DYNA中炸药在空气中爆炸的案例-哔哩哔哩】 https://b23.tv/kmXlN29 一开始 如果你的 ANSYS Workbench 工具箱(Toolbox)里 只有 SPEOS,即使尝试了 右键刷新、重置视图、显示全部 等方法仍然没有其他分析系统&a…...

吃透 Golang 基础:数据结构之 Map
文章目录 Map概述初始化删除访问不存在的 key 返回 value 的零值遍历 mapmap 自身的零值map 索引时返回的第二个参数使用 map 实现 set Map Hash Map 是无序的 key/value 对集合,其中所有的 key 都是不同的。通过给定的 key 可以在常数时间复杂度内完成检索、更新或…...

会计 - 金融负债和权益工具
一、金融负债和权益工具区分的基本原则 (1)是否存在无条件地避免交付现金或其他金融资产的合同义务 如果企业不能无条件地避免以交付现金或其他金融资产来履行一项合同义务,则该合同义务符合金融负债的义务。 常见的该类合同义务情形包括:- 不能无条件避免的赎回; -强制…...

2025年,百度智能云打响AI落地升维战
如果说从AI到Agent是对于产品落地形态的共识,那么如今百度智能云打响的恰是一个基于Agent进行TO B行业表达的AI生产力升维战。 在这个新的工程体系能力里,除了之前百度Create大会上提出的面向Agent的RAG能力等通用能力模块,对更为专业、个性…...