Spring 注解解析
一、@Import
1、核心作用
@Import
是 Spring 模块化配置的核心注解,用于将外部配置类、组件或动态逻辑导入当前 Spring 上下文。其核心功能包括:
- 配置类聚合:整合多个分散的
@Configuration
类,解决大型项目中配置分散的问题。 - 动态导入:通过
ImportSelector
和ImportBeanDefinitionRegistrar
实现条件化、编程式 Bean 注册。 - 第三方库集成:将非 Spring 管理的类(如工具类、第三方组件)注入容器。
2、三种使用场景
2.1、 导入普通类
- 作用:将普通类直接注册为 Bean。
- 示例:
@Import({ServiceA.class, ServiceB.class}) @Configuration public class AppConfig {}
- 限制:无法处理依赖复杂或需要条件判断的场景。
2.2、 导入 ImportSelector
实现类
- 动态选择:根据条件(如环境变量、类路径)动态决定导入哪些类。
- 接口方法:
public interface ImportSelector {String[] selectImports(AnnotationMetadata metadata); }
- 示例:
public class MyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata metadata) {return new String[]{DataSourceConfig.class.getName()};} }
- 应用场景:Spring Boot 自动配置(如
@EnableAutoConfiguration
)的核心实现。
2.3、 导入 ImportBeanDefinitionRegistrar
实现类
- 编程式注册:通过
BeanDefinitionRegistry
手动注册 Bean,支持复杂逻辑。 - 接口方法:
public interface ImportBeanDefinitionRegistrar {void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry); }
- 示例:
public class MyRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(...) {BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MyBean.class);registry.registerBeanDefinition("myBean", builder.getBeanDefinition());} }
- 应用场景:动态代理生成、多数据源注册等底层扩展。
3、底层实现原理
3.1、 处理时机
- 入口:在 Spring 容器启动时,由
ConfigurationClassPostProcessor
处理所有配置类。 - 流程:
- 解析
@Configuration
类。 - 递归处理
@Import
注解,收集所有待导入的类。
- 解析
3.2、 核心处理逻辑
- 源码入口:
ConfigurationClassParser#processImports()
。 - 处理步骤:
- 分类处理:
- 普通类:直接作为配置类解析。
ImportSelector
:调用selectImports()
获取类名,递归处理。ImportBeanDefinitionRegistrar
:缓存到importBeanDefinitionRegistrars
集合。
- 避免循环依赖:通过
ImportStack
检查导入链,防止配置类循环引用。
- 分类处理:
3.3、 注册阶段
- 普通类与
ImportSelector
结果:通过ConfigurationClassBeanDefinitionReader
注册为 Bean。 ImportBeanDefinitionRegistrar
:在loadBeanDefinitions()
阶段调用registerBeanDefinitions()
方法。
4、典型应用场景
4.1、 模块化配置拆分
// 主配置类
@Import({SecurityConfig.class, DatabaseConfig.class})
@Configuration
public class MainConfig {}// 子模块配置
@Configuration
public class SecurityConfig {@Beanpublic SecurityFilterChain filterChain() { ... }
}
4.2、 条件化数据源切换
public class DynamicDataSourceSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata metadata) {String env = System.getProperty("app.env");return "prod".equals(env) ? new String[]{ProdDataSourceConfig.class.getName()} :new String[]{DevDataSourceConfig.class.getName()};}
}
4.3、 自定义注解封装
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(MyStarterAutoConfiguration.class)
public @interface EnableMyStarter {}// 使用方只需添加 @EnableMyStarter
@EnableMyStarter
@SpringBootApplication
public class MyApp {}
5、常见问题与最佳实践
5.1、 循环依赖处理
- 问题:A 配置类导入 B,B 又导入 A。
- 解决方案:
- 使用
ImportStack
检测并抛出异常。 - 重构配置类,提取公共配置到第三个类。
- 使用
5.2、 与 @ComponentScan
的对比
特性 | @Import | @ComponentScan |
---|---|---|
控制粒度 | 精确导入指定类或配置 | 扫描整个包及其子包 |
条件化支持 | 通过 ImportSelector 动态控制 | 仅支持静态过滤(如 excludeFilters ) |
第三方库集成 | 可直接导入非 Spring 管理的类 | 需配合 @Component 注解使用 |
5.3、 性能优化建议
- 延迟加载:实现
DeferredImportSelector
接口,将低优先级配置延后处理。 - 条件预判:在
ImportSelector
中尽早排除不满足条件的类,减少不必要的解析。
6、总结
- 核心价值:
@Import
通过 模块化导入 和 动态控制 能力,成为 Spring 灵活配置体系的基石。 - 适用场景:
- 大型项目配置拆分。
- 实现 Starter 自动装配。
- 底层框架扩展(如 MyBatis 的
@MapperScan
)。
- 避坑指南:
- 避免循环导入。
- 合理选择普通类、
ImportSelector
或Registrar
。 - 结合
@Conditional
实现环境适配。
二、@EnableAutoConfiguration
1、核心作用
@EnableAutoConfiguration
是 Spring Boot 自动配置机制的核心入口,其核心作用如下:
- 按需加载配置:根据项目的类路径依赖(如
spring-boot-starter-web
)、环境变量及配置文件(application.properties
),自动加载符合条件的配置类(如WebMvcAutoConfiguration
)。 - 减少手动配置:通过约定大于配置的理念,避免手动编写大量 XML 或 Java 配置代码。
- 动态条件过滤:通过条件注解(如
@ConditionalOnClass
)动态判断是否启用某配置类。
2、源码结构与组成
@EnableAutoConfiguration
是一个复合注解,其核心组成如下:
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration { ... }
2.1、 @AutoConfigurationPackage
- 作用:将主类所在包及其子包注册为自动扫描的根包。
- 实现原理:通过
AutoConfigurationPackages.Registrar
内部类,将主类包路径存储到BasePackages
中,供后续组件扫描使用。
2.2、@Import(AutoConfigurationImportSelector.class)
- 核心角色:
AutoConfigurationImportSelector
类负责加载自动配置类。 - 关键流程:
- 加载候选配置:从
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
(旧版为spring.factories
)读取所有配置类全限定名。 - 条件过滤:通过条件注解(如
@ConditionalOnClass
)筛选出有效配置类。 - 注册到容器:将筛选后的配置类注册到 Spring 容器中。
- 加载候选配置:从
3、自动配置触发流程
阶段 | 行为描述 |
---|---|
1. 启动类初始化 | 执行 SpringApplication.run() ,触发 @EnableAutoConfiguration 解析。 |
2. 加载候选配置类 | AutoConfigurationImportSelector 从 AutoConfiguration.imports 加载所有配置类。 |
3. 条件注解过滤 | 根据条件注解(如 @ConditionalOnClass(DataSource.class) )排除不符合条件的配置类。 |
4. 注册生效配置类 | 将符合条件的配置类注册为 Spring Bean。 |
5. 应用配置 | 配置类中的 @Bean 方法创建并初始化组件(如 DataSource 、DispatcherServlet )。 |
4、条件注解的运作机制
自动配置类的加载通过条件注解动态控制,以下是常用条件注解及其作用:
条件注解 | 触发条件 |
---|---|
@ConditionalOnClass | 类路径中存在指定类时生效(如 Servlet.class 触发 Web 相关配置)。 |
@ConditionalOnMissingBean | 容器中不存在指定 Bean 时生效(用于避免覆盖用户自定义 Bean)。 |
@ConditionalOnProperty | 配置文件中存在指定属性且值为特定值时生效。 |
@ConditionalOnWebApplication | 当前应用是 Web 应用时生效。 |
示例:WebMvcAutoConfiguration
的条件控制
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class })
@ConditionalOnWebApplication(type = Type.SERVLET)
public class WebMvcAutoConfiguration { ... }
5、自定义与覆盖机制
5.1、 排除自动配置
通过 exclude
属性显式排除不需要的配置类:
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class })
public class MyApp { ... }
5.2、 覆盖默认 Bean
自定义 Bean 会覆盖自动配置的同类型 Bean:
@Configuration
public class MyConfig {@Beanpublic DataSource dataSource() {// 自定义数据源,覆盖自动配置的 DataSource}
}
5.3、 配置文件控制
通过 application.properties
禁用特定自动配置:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
6、调试与日志分析
启用 Debug 模式可查看自动配置报告,帮助排查配置加载问题:
# application.properties
debug=true
输出示例:
Positive matches:(已启用的配置类)
-----------------WebMvcAutoConfiguration matched@ConditionalOnClass found required classes 'javax.servlet.Servlet'Negative matches:(被排除的配置类)
-----------------DataSourceAutoConfiguration:Did not match: @ConditionalOnClass did not find required classes 'javax.sql.DataSource'
7、典型应用场景
- Web 应用开发
- 引入
spring-boot-starter-web
后,自动配置 Tomcat、Spring MVC 等组件。
- 引入
- 数据库集成
- 引入
spring-boot-starter-data-jpa
后,自动配置 DataSource、JPA 事务管理器。
- 引入
- 消息队列集成
- 引入
spring-boot-starter-amqp
后,自动配置 RabbitMQ 连接工厂。
- 引入
8、总结
- 核心价值:
@EnableAutoConfiguration
通过按需加载配置大幅简化了 Spring 应用的搭建过程。 - 适用场景:快速构建微服务、中间件集成等标准化场景。
- 局限性:对高度定制化需求(如多数据源动态路由),需结合编程式配置或排除默认配置。
三、@SpringBootApplication
1、核心组成与作用
@SpringBootApplication
是 Spring Boot 的核心入口注解,它是一个复合注解,整合了以下三个关键注解:
-
@SpringBootConfiguration
- 作用:标记当前类为配置类,继承自
@Configuration
,允许通过@Bean
方法定义 Bean。 - 等价性:与传统的 XML 配置
<beans>
标签功能一致,但基于 Java 类实现更灵活的配置。
- 作用:标记当前类为配置类,继承自
-
@EnableAutoConfiguration
- 作用:启用自动配置机制,根据项目依赖(如
spring-boot-starter-web
)自动加载相关配置类(如WebMvcAutoConfiguration
)。 - 底层原理:通过
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
(旧版为spring.factories
)文件中的配置类列表,结合条件注解(如@ConditionalOnClass
)动态加载符合条件的配置。
- 作用:启用自动配置机制,根据项目依赖(如
-
@ComponentScan
- 作用:扫描当前包及其子包下的
@Component
、@Service
、@Controller
等注解标记的类,并将其注册为 Spring Bean。 - 默认行为:若不指定
basePackages
,扫描范围是主类所在包及其子包。
- 作用:扫描当前包及其子包下的
2、协同工作机制
阶段 | 行为描述 |
---|---|
启动类初始化 | 执行 SpringApplication.run(Application.class, args) ,触发注解解析流程。 |
@ComponentScan 生效 | 扫描并注册 Bean,确保业务类(如 @Controller )被 Spring 管理。 |
@EnableAutoConfiguration 生效 | 根据依赖自动加载配置类(如 DataSourceAutoConfiguration ),避免手动配置。 |
@SpringBootConfiguration 生效 | 允许在启动类中直接定义 @Bean 方法,覆盖自动配置的默认 Bean。 |
3、自动配置的触发逻辑
-
依赖触发
- 例如引入
spring-boot-starter-data-jpa
,类路径中存在JpaRepository
类,触发JpaRepositoriesAutoConfiguration
。 - 条件注解控制:
@ConditionalOnClass({ DataSource.class, JpaRepository.class }) public class JpaRepositoriesAutoConfiguration { ... }
- 例如引入
-
配置覆盖机制
- 优先级:手动配置(如
application.yml
) > 自动配置 Bean > 默认配置。 - 示例:自定义
DataSource
Bean 会覆盖DataSourceAutoConfiguration
的默认数据源。
- 优先级:手动配置(如
4、使用技巧与注意事项
-
排除不必要的自动配置
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) public class Application { ... }
-
自定义扫描路径
@ComponentScan(basePackages = "com.xiaolingting.core") @SpringBootApplication public class Application { ... }
-
多模块项目结构
- 主类位置:需放在根包(如
com.xiaolingting
),确保@ComponentScan
能覆盖所有子模块。 - 模块拆分:若子模块包路径不在主类同级或子包下,需显式指定
basePackages
。
- 主类位置:需放在根包(如
5、常见问题与解决
5.1、 Bean 未扫描到
- 原因:主类未放置在根包,或
@ComponentScan
路径未覆盖目标类。 - 解决:调整包结构或显式指定
basePackages
。
5.2、 自动配置冲突
- 场景:同时引入多个数据源 Starter(如
spring-boot-starter-data-jpa
和spring-boot-starter-data-mongodb
)。 - 解决:通过
exclude
排除冲突的自动配置类。
6、总结
- 核心价值:
@SpringBootApplication
通过约定大于配置的理念,简化了传统 Spring 应用的繁琐配置,实现开箱即用。 - 适用场景:快速构建微服务、Web 应用等,尤其适合需要减少样板代码的中小型项目。
- 限制:对复杂定制化场景(如多数据源动态路由),仍需手动干预或扩展自动配置逻辑。
四、@Transactional
1、核心原理与实现机制
@Transactional
是 Spring 声明式事务管理的核心注解,基于 AOP 动态代理实现事务逻辑的解耦。其核心流程如下:
-
代理对象生成
- 通过
BeanPostProcessor
的AnnotationAwareAspectJAutoProxyCreator
类,对标记@Transactional
的 Bean 生成代理对象。 - 动态代理方式:JDK 动态代理(接口)或 CGLIB 代理(类)。
- 通过
-
事务拦截逻辑
- 事务切面逻辑由
TransactionInterceptor
实现,代理对象的方法调用会被拦截到invoke()
方法中。 - 关键步骤:
// TransactionInterceptor#invoke 核心流程 Object result = invocation.proceed(); // 执行原始方法 if (无异常) {commitTransaction(); // 提交事务 } else {rollbackTransaction(); // 回滚事务 }
- 事务切面逻辑由
-
事务元数据解析
TransactionAttributeSource
负责解析方法或类上的@Transactional
注解属性(如传播行为、隔离级别)。
2、核心属性与配置
2.1、 传播行为(Propagation)
控制事务边界的核心参数,解决多事务方法嵌套调用时的行为逻辑:
传播行为类型 | 描述 |
---|---|
REQUIRED (默认) | 当前存在事务则加入,否则新建事务。适合大多数业务场景。 |
REQUIRES_NEW | 新建独立事务,挂起当前事务(若有)。适用于需要独立提交的子操作。 |
NESTED | 嵌套事务,依赖数据库保存点(如 MySQL 的 InnoDB)。子事务回滚不影响父事务。 |
SUPPORTS | 存在事务则加入,否则以非事务方式执行。适用于查询操作。 |
2.2、 隔离级别(Isolation)
控制事务并发访问时的数据可见性:
隔离级别 | 描述 |
---|---|
DEFAULT | 使用数据库默认隔离级别(通常为 READ_COMMITTED )。 |
READ_COMMITTED | 避免脏读,允许不可重复读和幻读。适用于多数 OLTP 场景。 |
REPEATABLE_READ | 避免脏读和不可重复读,允许幻读(MySQL 默认级别)。 |
SERIALIZABLE | 完全串行化,避免所有并发问题,但性能最低。 |
2.3、 回滚规则
控制哪些异常触发事务回滚:
- 默认行为:仅
RuntimeException
和Error
触发回滚。 - 自定义回滚:
@Transactional(rollbackFor = SQLException.class) // 指定异常回滚 @Transactional(noRollbackFor = BusinessException.class) // 忽略特定异常
2.4、 其他属性
readOnly
:标记只读事务(优化数据库连接,如 MySQL 只读模式)。timeout
:事务超时时间(秒),超时强制回滚。value
:指定事务管理器 Bean 名称(多数据源场景)。
3、事务失效场景与解决方案
3.1、 同类内部方法调用
- 问题:通过
this.method()
调用事务方法,绕过了代理对象。 - 解决:通过自注入代理对象或拆分方法到不同类。
3.2、 异常处理不当
- 问题:捕获异常未重新抛出,或未配置
rollbackFor
。 - 解决:确保异常传播到事务切面,或显式设置回滚条件。
3.3、 非 public 方法
- 问题:Spring AOP 无法代理非 public 方法。
- 解决:仅将
@Transactional
应用于 public 方法。
3.4、静态方法或 final 方法
- 问题:动态代理无法覆盖静态或 final 方法。
- 解决:避免在此类方法上使用事务注解。
3.5、 数据库引擎不支持
- 问题:如 MySQL 的 MyISAM 引擎不支持事务。
- 解决:切换为 InnoDB 引擎。
4、最佳实践与优化
-
避免滥用声明式事务
- 复杂事务逻辑(如条件提交)建议使用编程式事务(
TransactionTemplate
)。
- 复杂事务逻辑(如条件提交)建议使用编程式事务(
-
显式指定事务管理器
@Transactional(value = "orderTransactionManager")
-
合理使用只读事务
@Transactional(readOnly = true) // 优化查询性能
-
事务方法粒度控制
- 将事务方法拆分为最小操作单元,减少锁竞争和长事务风险。
5、源码关键节点
-
事务管理器初始化
PlatformTransactionManager
实现类(如DataSourceTransactionManager
)负责底层事务操作。
-
事务切面注册
BeanFactoryTransactionAttributeSourceAdvisor
作为切面,结合TransactionAttributeSource
解析注解。
-
事务拦截链
TransactionInterceptor
调用TransactionAspectSupport#invokeWithinTransaction
实现事务逻辑。
6、总结
@Transactional
通过 AOP 动态代理和 事务管理器实现声明式事务管理,开发者需关注传播行为、隔离级别、异常处理等核心属性,避免同类调用、非 public 方法等失效场景。在复杂场景下,结合编程式事务可提升灵活性和可控性。
相关文章:
Spring 注解解析
一、Import 1、核心作用 Import 是 Spring 模块化配置的核心注解,用于将外部配置类、组件或动态逻辑导入当前 Spring 上下文。其核心功能包括: 配置类聚合:整合多个分散的 Configuration 类,解决大型项目中配置分散的问题。动态…...
DeepSeek-R1思路训练多模态大模型-Vision-R1开源及实现方法思路
刚开始琢磨使用DeepSeek-R1风格训练多模态R1模型,就看到这个工作,本文一起看看,供参考。 先提出问题,仅靠 RL 是否足以激励 MLLM 的推理能力? 结论:不能,因为如果 RL 能有效激励推理能力&#…...
mysql select distinct 和 group by 哪个效率高
在有索引的情况下,SELECT DISTINCT和GROUP BY的效率相同;在没有索引的情况下,SELECT DISTINCT的效率高于GROUP BY。这是因为SELECT DISTINCT和GROUP BY都会进行分组操作,但GROUP BY可能会进行排序,触发filesort&…...
阿里云操作系统控制台评测:国产AI+运维 一站式运维管理平台
阿里云操作系统控制台评测:国产AI运维 一站式运维管理平台 引言 随着云计算技术的飞速发展,企业在云端的运维管理面临更高的要求。阿里云操作系统控制台作为一款集运维管理、智能助手和系统诊断等多功能于一体的工具,正逐步成为企业高效管理…...
Linux基础开发工具—vim
目录 1、vim的概念 2、vim的常见模式 2.1 演示切换vim模式 3、vim命令模式常用操作 3.1 移动光标 3.2 删除文字 3.3 复制 3.4 替换 4、vim底行模式常用命令 4.1 查找字符 5、vim的配置文件 1、vim的概念 Vim全称是Vi IMproved,即说明它是Vi编辑器的增强…...
11 应用层的域名知识点
一、DNS 1、理解 定义:DNS(Domain Name System,域名系统)是互联网的一项核心服务,它将人类可读的域名(也叫网址,如 www.example.com)转换为机器可读的IP地址(如 192.0.…...
5-24 色彩与风格——T2IA自适应
前言: 上一节我们介绍了ControlNet中的inpaint局部重绘 主要介绍ControlNet中的T2IA自适应。 色彩风格的参考和借鉴能力,有点类似于5-17 reference参考图 或者 5-16 画面风格迁移-shuffle洗牌 。当然在硬件的要求,软件的算法实现和使用方式…...
JAVA-Thread类实现多线程
引言: 本章博客涉及进程线程内容,如果不了解的可以看:什么是进程线程-CSDN博客 线程是操作系统的概念,操作系统提供的API供程序员使用操作。但是不同的操作系统(Winodws、Linux、Unix……差别很大),但是做为JAVA程序员就不需要担心…...
顺序表,单链表,双链表,循环链表(01星球)
文章目录 数据结构前导------C语言复习程序为什么要被编译器编译之后才能运行编译器把C语言程序转换成可以执行的机器码的过程做了什么宏定义typedef 关键字全局变量和局部变量常量字符的输入输出运算符冯诺依曼架构存储器容量数据类型指针指针本质为什么需要指针 数组数组指针…...
代码社区开源协议
开源协议是一种法律文件,用于规定开源软件的使用、修改和分发条件。它平衡了开发者和使用者的权益,同时推动开放协作与技术创新。以下是常见的开源协议及其特点和适用场景: 常见开源协议列表及介绍 1. MIT License 特点:非常宽…...
[免费]微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端+Vue管理端)(高级版)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端Vue管理端)(高级版),分享下哈。 项目视频演示 【免费】微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端Vue管理端)(高级版…...
树莓派:更新源
发行版本 Debian 一直维护着至少三个发行版本:“稳定版(stable)”,“测试版(testing)”和“不稳定版(unstable)”。 发行版目录 下一代 Debian 正式发行版的代号为 bullseye — 发布…...
树与二叉树的遍历
我们平时用的树都是二叉树 一、一些基础概念 1. 树就是一种:一对多的数据结构。树离不开递归,因为“树”就是“树”中有“树”。 二叉树就是 :空树 或者 每个结点的子结点个数小于等于2。 满二叉树: 除叶子结点外所有结点的…...
Web基础:HTML快速入门
HTML基础语法 HTML(超文本标记语言) 是用于创建网页内容的 标记语言,通过定义页面的 结构和内容 来告诉浏览器如何呈现网页。 超文本(Hypertext) 是一种通过 链接(Hyperlinks) 将不同文本、图像…...
异常(8)
今天补充一些异常的细节,帮助大家更好的理解异常. 注:关于异常的处理方式 异常的种类有很多,我们要根据不同的业务场景来决定. 对于比较严重的问题(例如和算钱相关的场景),应该让程序直接崩溃,防止造成更严重的结果 对于不太严重的问题(大多数场景),可以记录错误日志,并通过…...
平时作业
java作业 package zuoye; public class zuoye02 {public static int Random(int n) {return (int)(n * Math.random());}public static void main(String[] args) {int n 100;//System.out.println(Random(n));int[]random new int[50];for(int i 0; i <50; i) {rand…...
宇树人形机器人开源模型
1. 下载源码 https://github.com/unitreerobotics/unitree_ros.git2. 启动Gazebo roslaunch h1_description gazebo.launch3. 仿真效果 H1 GO2 B2 Laikago Z1 4. VMware: vmw_ioctl_command error Invalid argument 这个错误通常出现在虚拟机环境中运行需要OpenGL支持的应用…...
**ResNet-SE + MFCC** 训练框架,包括 **数据加载、训练流程**,以及 **混淆矩阵** 可视化示例
1. 依赖库安装 如果你还没安装相关库,请先执行: pip install torch torchaudio torchvision scikit-learn matplotlib tqdm2. 数据加载 这里假设你有一个 音频分类数据集,其文件结构如下: dataset/ │── train/ │ ├──…...
Golang | 每日一练 (5)
💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Golang | 每日一练 (5)题目参考答案线程与协程线程切换…...
搞定python之四----函数、lambda和模块
本文是《搞定python》系列专栏的第四篇,通过代码演示列python自定义函数、lambda和模块的用法。本文学习完成后,python的基础知识就完了。后面会学习面向对象的内容。 1、自定义函数 # 测试python自定义函数# 有参数,没有返回值 def say_he…...
算法分享———进制转换通用算法
模板一:任意(K)进制转10进制 将k进制的x转化为10进制的x ll x0; for(int i1;i<n;i) { xx*ka[i]; } cout<<x<<endl;模板二:十进制转m进制 ll x; cin>>x; while(x) { a[cnt]x%k; x/k; } reverse(a1,a1cnt);…...
Proser:新增指令批次发送功能
Proser中的批次发送功能,是通过指令集进行管理的。 起初设计时,希望指令集窗口自身包含指令的编辑功能,这部分功能与传输窗口的功能重合度高,所以设计上进行了简化,由用户在传输窗口输入指令,添加到指令集窗…...
rpc grpc
RPC Remote Procedure Call,远程过程调用,是用来屏蔽分布式计算中的各种调用细节,使得调用远端的方法就像调用本地的一样。 客户端与服务端沟通的过程 客户端发送数据(以字节流的方式);(编码)服务端接受…...
AI赋能铁道安全巡检探索智能巡检新时代,基于YOLOv7全系列【tiny/l/x】参数模型开发构建铁路轨道场景下轨道上人员行为异常检测预警系统
在交通强国的战略引领下,中国铁路网如巨龙般纵贯大江南北,将五湖四海紧密相连,极大地促进了人员出行与物流运输的便捷性。然而,随着铁路线路的不断扩展,管理层面的安全问题也日益凸显。历史上,多起与铁路相…...
Kubernetes安全:集群保护的最佳实践
随着容器化技术的广泛应用,Kubernetes已经成为企业IT基础设施的重要组成部分。然而,Kubernetes集群的复杂性也带来了独特的安全挑战。如何在动态变化的云原生环境中保障集群的安全性,成为每一位运维工程师和安全专家关注的焦点。本文将详细探…...
R+VIC模型融合实践技术应用及未来气候变化模型预测
在气候变化问题日益严重的今天,水文模型在防洪规划,未来预测等方面发挥着不可替代的重要作用。目前,无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然,这些软件有各自的优点;但是&am…...
前端开发:混合技术栈的应用
目录 前言 混合技术栈的优势 移动端开发嵌入H5 1、场景描述 2、实现方法 3、源码示例 OC项目嵌入Swift的使用 1、场景描述 2、实现方法 3、源码示例 HarmonyOS开发中嵌入WebView 1、权限配置 2、加载网页 结束语 前言 随着技术的不断进步,软件开发领域…...
Machine Learning: 十大基本机器学习算法
机器学习算法分类:监督学习、无监督学习、强化学习 基本的机器学习算法: 线性回归、支持向量机(SVM)、最近邻居(KNN)、逻辑回归、决策树、k平均、随机森林、朴素贝叶斯、降维、梯度增强。 机器学习算法大致可以分为三类: 监督学习算法 (Sup…...
react实现一个列表的拖拽排序(react实现拖拽)
需求场景: 我的项目里需要实现一个垂直列表的拖拽排序,效果图如下图: 技术调研: 借用antd Table实现: 我的项目里使用了antd,antd表格有一个示例还是挺像的,本来我想用Table实现࿰…...
通过mybatis的拦截器对SQL进行打标
1、背景 在我们开发的过程中,一般需要编写各种SQL语句,万一生产环境出现了慢查询,那么我们如何快速定位到底是程序中的那个SQL出现的问题呢? 2、解决方案 如果我们的数据访问层使用的是mybatis的话,那么我们可以通过…...
【MySQL】MySQL服务器——mysqld
1.MySQL服务器 是名为 mysqld 的数据库服务器程序,和“主机”(host)不一样是一个多线程的单进程管理对磁盘和内存中数据库的访问支持并发的客户端连接支持多个存储引擎,常见的存储引擎包括InnoDB、MyISAM、Memory、Archive支持事…...
JAVA面试_进阶部分_Java JVM:垃圾回收(GC 在什么时候,对什么东西,做了什么事情)
在什么时候: 首先需要知道,GC又分为minor GC 和 Full GC(major GC)。Java堆内存分为新生代和老年代,新生代 中又分为1个eden区和两个Survior区域。 一般情况下,新创建的对象都会被分配到eden区ÿ…...
【探秘海洋伤痕】海洋环境污染损害的警世启示
在地球这个蓝色星球上,广袤无垠的海洋孕育了无数生命,支撑着地球的生态平衡与人类的生存发展。然而,随着工业化和现代化的加速,海洋环境遭受的伤害日益严重,海洋环境污染损害成为了我们必须直面的严峻问题。本文将带您…...
过滤器(Filter)与拦截器(Interceptor)
在Java Web开发中,**拦截器(Interceptor)和过滤器(Filter)**都用于在请求处理过程中拦截和处理HTTP请求或响应,但它们有不同的应用场景和工作原理。下面将详细解释它们的区别,并提供代码演示。 …...
智慧城市运行管理服务平台建设方案
随着城市化的快速发展,城市运行管理面临着前所未有的挑战。智慧城市的概念应运而生,旨在通过信息技术手段提升城市管理效率和居民生活质量。智慧城市运行管理服务平台作为智慧城市建设的核心组成部分,其建设方案的科学性和前瞻性至关重要。 …...
Java是怎么解决并发问题的?
Happens-Before规则(前言) Happens-Before规则 是 Java 内存模型(JMM)中用于定义线程间操作可见性和有序性的一种规范。它的核心目的是:确保一个线程的某些操作结果对其他线程是可见的,并且这些操作在时间上的顺序不会被重排序破…...
使用 Chrome Flags 设置(适用于 HTTP 站点开发)
使用 Chrome Flags 设置(适用于 HTTP 站点开发) 在 Chrome 地址栏输入:chrome://flags/在搜索框输入 “Insecure origins” 或 “Allow invalid certificates”。找到 “Insecure origins treated as secure” 选项(或者 #allow-…...
解锁 AI 开发的无限可能:邀请您加入 coze-sharp 开源项目
大家好!今天我要向大家介绍一个充满潜力的开源项目——coze-sharp!这是一个基于 C# 开发的 Coze 客户端,旨在帮助开发者轻松接入 Coze AI 平台,打造智能应用。项目地址在这里:https://github.com/zhulige/coze-sharp&a…...
【Swift】面向协议编程之HelloWorld
定义一个协议(protocol),swift 中可以对protocol 进行扩展(extension)通过协议的扩展可以对函数有默认的实现 protocol Sleepable {func sleep() } protocol Eatable {func eat() } extension Eatable {func eat() {print("eat food")} }在类(class)或结…...
图神经网络学习笔记—纯 PyTorch 中的多 GPU 训练(专题十二)
对于许多大规模的真实数据集,可能需要在多个 GPU 上进行扩展训练。本教程将介绍如何通过 torch.nn.parallel.DistributedDataParallel 在 PyG 和 PyTorch 中设置多 GPU 训练管道,而无需任何其他第三方库(如 PyTorch Lightning)。请注意,此方法基于数据并行。这意味着每个 …...
Linux云计算SRE-第二十周
完成ELK综合案例里面的实验,搭建完整的环境 一、 1、安装nginx和filebeat,配置node0(10.0.0.100),node1(10.0.0.110),node2(10.0.0.120),采用filebeat收集nignx日志。 #node0、node1、node2采用以下相同方式收集ngin…...
springcloud gateway搭建及动态获取nacos注册的服务信息信息
前言 Spring Cloud Gateway 通过集成 Nacos 服务发现,可以动态获取注册到 Nacos 的微服务实例信息,并根据服务名(Service Name)自动生成路由规则或手动配置路由规则,实现请求的动态路由和负载均衡。 一个最简单的网关就…...
SSM基础专项复习6——Spring框架AOP(3)
系列文章 1、SSM基础专项复习1——SSM项目整合-CSDN博客 2、SSM基础专项复习2——Spring 框架(1)-CSDN博客 3、SSM基础专项复习3——Spring框架(2)-CSDN博客 4、SSM基础专项复习4——Maven项目管理工具(1ÿ…...
【嵌入式linux】网口和USB热插拔检测
在Linux常常需要对网口和USB等外设接口进行插拔检测,从而执行部分初始化操作。下面简要介绍Linux的Netlink机制,并在C程序中使用Linux的Netlink机制完成网口和USB口插拔检测。 Netlink 是 Linux 内核与用户空间进程通信的一种机制,主要用于内…...
C++(13)—类和对象(中) ③拷贝构造函数
文章目录 一、拷贝构造函数的基本概念1.1 什么是拷贝构造函数?1.2 拷贝构造函数的调用场景 二、拷贝构造函数的核心特性2.1 拷贝构造函数的参数2.2 默认拷贝构造函数 三、深拷贝与浅拷贝3.1 浅拷贝的问题 四、拷贝构造函数的实际应用4.1 何时需要显式定义拷贝构造函…...
【GPT入门】第17课 RAG向量检索分类、原理与优化
【GPT入门】第16课 RAG向量检索分类、原理与优化 1.向量检索概念1.1 文本检索的两类方式1.2 向量的定义1.3 文本向量(Text Embeddings)1.4 文本向量如何得到1.5 向量间相似度计算1.6 向量数据库功能对比1.7 open ai发布的两个向量模型2.向量数据库1.8 向量检索的优化3.检索后…...
Operator <=> (spaceship operator)
operator <>动机 在C20以前定义比较运算符:其他比较运算符基于<和实现 struct Type {int value;// 相等运算符friend bool operator(const Type& a, const Type& b) {return a.value b.value;}// 不等运算符friend bool operator!(const Type&a…...
队列的简单例题
题目如下 模拟队列 首先你要明白队列的话 只有队尾才能进行新增,也就是入队 只有队首才能出队,也就是删除 队首队尾指针一开始默认都是0 相当于队列中一开始是有一个元素的就是 0的位置 队首指针head0 队尾指针tail0 1.入队也就是队尾要先赋值…...
Calibre-Web-Automated:打造你的私人图书馆
有没有小伙伴在工作、学习或生活中喜欢保存一些书籍或PDF文件,结果过一段时间想找的时候却怎么也找不到,最后只能无奈放弃?你是否已经厌倦了手动管理电子书的繁琐?是否梦想拥有一个私人图书馆,随时随地都能轻松访问自己…...
第27周JavaSpringboot 前后端联调
电商前后端联调课程笔记 一、项目启动与环境搭建 1.1 项目启动 在学习电商项目的前后端联调之前,需要先掌握如何启动项目。项目启动是整个开发流程的基础,只有成功启动项目,才能进行后续的开发与调试工作。 1.1.1 环境安装 环境安装是项…...