Java面试:Spring及Spring Cloud技术深度剖析
Spring及Spring Cloud技术深度剖析
前言
在Java开发领域,Spring框架一直是企业级应用开发的中流砥柱,而Spring Boot的出现更是极大地简化了Spring应用的开发过程。同时,Spring Cloud为构建分布式系统提供了强大的支持。本文将围绕Spring及Spring Cloud的一系列核心问题展开详细探讨,旨在帮助开发者深入理解这些技术的原理和应用。
1. Spring Boot与以前的Spring有什么区别
Spring是一个功能强大的Java开发框架,它提供了IoC(控制反转)和AOP(面向切面编程)等核心特性,帮助开发者构建企业级应用。然而,传统的Spring开发需要大量的配置文件,如XML配置,这使得项目的搭建和维护变得复杂。
Spring Boot则是为了解决这些问题而诞生的。它采用了“约定优于配置”的原则,通过自动配置机制,减少了开发者手动编写配置文件的工作量。Spring Boot还提供了嵌入式服务器,如Tomcat、Jetty等,使得应用可以像普通Java程序一样直接运行,无需额外的服务器配置。此外,Spring Boot集成了各种开发工具和插件,如Spring Initializr,方便开发者快速创建项目。
2. Spring Boot启动加载过程是什么样的
Spring Boot的启动过程主要包括以下几个步骤:
- 启动入口:Spring Boot应用的启动通常从一个带有
@SpringBootApplication
注解的主类开始,该注解是一个组合注解,包含了@Configuration
、@EnableAutoConfiguration
和@ComponentScan
。 - 创建SpringApplication实例:在主类的
main
方法中,调用SpringApplication.run()
方法,该方法会创建一个SpringApplication
实例。 - 初始化环境:
SpringApplication
实例会初始化应用的运行环境,包括加载配置文件、解析命令行参数等。 - 创建ApplicationContext:根据应用类型(如Web应用或非Web应用)创建相应的
ApplicationContext
实例。 - 自动配置:
@EnableAutoConfiguration
注解会触发Spring Boot的自动配置机制,根据类路径下的依赖和配置,自动配置Spring应用的各个组件。 - 注册Bean:
ApplicationContext
会扫描应用中的@Component
、@Service
、@Repository
等注解的类,并将它们注册为Bean。 - 启动嵌入式服务器:如果是Web应用,Spring Boot会启动嵌入式服务器,如Tomcat或Jetty。
- 应用启动完成:所有的初始化工作完成后,Spring Boot应用启动完成,开始接收请求。
3. Spring的IOC/AOP的实现
IOC(控制反转)
IOC是Spring的核心特性之一,它将对象的创建和依赖关系的管理从代码中分离出来,交给Spring容器来处理。Spring的IOC容器通过BeanFactory
或ApplicationContext
来实现。
BeanFactory
是Spring IOC容器的基础接口,它提供了基本的Bean管理功能,如获取Bean、注册Bean等。ApplicationContext
是BeanFactory
的子接口,它在BeanFactory
的基础上提供了更多的功能,如国际化支持、事件发布等。
Spring的IOC容器通过读取配置文件(如XML配置或Java注解)来创建和管理Bean。当需要使用某个Bean时,只需要从容器中获取即可,而不需要手动创建对象。
AOP(面向切面编程)
AOP是Spring的另一个核心特性,它允许开发者在不修改原有代码的情况下,对程序的功能进行增强。AOP通过将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高了代码的可维护性和可复用性。
Spring的AOP实现基于动态代理,主要有两种方式:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,而CGLIB动态代理基于继承实现。
4. 动态代理的实现方式,是否使用过CGLiB,和JDK的区别是什么
动态代理的实现方式
动态代理是在运行时创建代理对象的一种技术,主要有两种实现方式:JDK动态代理和CGLIB动态代理。
JDK动态代理
JDK动态代理是Java提供的一种动态代理机制,它基于接口实现。使用JDK动态代理需要实现InvocationHandler
接口,并重写invoke
方法。在invoke
方法中,可以对目标方法进行增强。
CGLIB动态代理
CGLIB是一个强大的、高性能的代码生成库,它可以在运行时扩展Java类和实现接口。CGLIB动态代理基于继承实现,它通过生成目标类的子类来实现代理。
区别
- 实现方式:JDK动态代理基于接口实现,而CGLIB动态代理基于继承实现。
- 性能:在调用次数较少的情况下,JDK动态代理的性能较好;在调用次数较多的情况下,CGLIB动态代理的性能较好。
- 适用场景:JDK动态代理适用于目标对象实现了接口的情况,而CGLIB动态代理适用于目标对象没有实现接口的情况。
5. 何时使用JDK还是CGLiB?如何强制使用CGLIB实现AOP
何时使用JDK还是CGLiB
- 使用JDK动态代理:当目标对象实现了接口时,建议使用JDK动态代理,因为它是Java原生的动态代理机制,性能较好。
- 使用CGLIB动态代理:当目标对象没有实现接口时,只能使用CGLIB动态代理。
如何强制使用CGLIB实现AOP
在Spring中,可以通过配置proxy-target-class
属性为true
来强制使用CGLIB实现AOP。例如,在XML配置中可以这样配置:
<aop:aspectj-autoproxy proxy-target-class="true"/>
在Java配置中可以这样配置:
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class AppConfig {// 配置类内容
}
6. Spring在选择用JDK还是CGLiB的依据是什么?CGlib比JDK快?
选择依据
Spring在选择使用JDK还是CGLIB动态代理时,主要依据目标对象是否实现了接口。如果目标对象实现了接口,Spring默认使用JDK动态代理;如果目标对象没有实现接口,Spring会使用CGLIB动态代理。
CGlib比JDK快?
在调用次数较少的情况下,JDK动态代理的性能较好,因为它是Java原生的动态代理机制,不需要额外的类生成过程。在调用次数较多的情况下,CGLIB动态代理的性能较好,因为它在生成代理类时进行了优化,减少了方法调用的开销。
7. Spring如何解决循环依赖(三级缓存)
Spring通过三级缓存来解决循环依赖问题,三级缓存分别是:
- singletonObjects:单例对象缓存,用于存储已经创建好的单例对象。
- singletonFactories:单例工厂缓存,用于存储创建单例对象的工厂。
- earlySingletonObjects:提前暴露的单例对象缓存,用于存储还未完全初始化的单例对象。
当一个Bean被创建时,首先会将其对应的ObjectFactory
放入singletonFactories
中。如果在创建过程中发现有循环依赖,会从singletonFactories
中获取对应的ObjectFactory
,并调用其getObject()
方法,将创建的早期对象放入earlySingletonObjects
中。最后,当Bean完全初始化完成后,将其从earlySingletonObjects
中移除,并放入singletonObjects
中。
8. Spring中解决循环依赖为什么要用三级缓存,二级为什么不行呢?
使用三级缓存的主要原因是为了支持AOP。在创建Bean的过程中,如果需要进行AOP增强,需要在早期暴露的对象上进行代理。如果只有二级缓存,无法在早期暴露的对象上进行代理,因为此时对象还没有完全初始化。
通过三级缓存,Spring可以在早期暴露的对象上进行代理,并将代理对象放入earlySingletonObjects
中。这样,在解决循环依赖时,就可以使用代理对象,而不是原始对象。
9. spring能解决那些循环依赖、不能解决那些循环依赖,为什么?
能解决的循环依赖
Spring可以解决单例Bean的循环依赖问题,无论是通过构造函数注入还是通过Setter方法注入。对于单例Bean,Spring通过三级缓存机制可以在对象还未完全初始化时就提前暴露对象,从而解决循环依赖问题。
不能解决的循环依赖
Spring不能解决原型Bean的循环依赖问题。因为原型Bean每次请求都会创建一个新的对象,Spring无法提前暴露对象,也就无法解决循环依赖问题。此外,如果循环依赖是通过构造函数注入的,并且使用了@Scope("prototype")
注解,Spring也无法解决循环依赖问题。
10. Spring注入bean的方式有哪些
构造函数注入
构造函数注入是通过在类的构造函数中声明依赖的Bean来实现的。例如:
public class UserService {private UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}
}
Setter方法注入
Setter方法注入是通过在类中提供Setter方法来注入依赖的Bean。例如:
public class UserService {private UserRepository userRepository;public void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}
}
字段注入
字段注入是通过在类的字段上使用@Autowired
注解来注入依赖的Bean。例如:
public class UserService {@Autowiredprivate UserRepository userRepository;
}
11. Spring的后置处理器分析
Spring的后置处理器是一种特殊的Bean,它可以在Bean的生命周期的不同阶段对Bean进行处理。Spring提供了两种类型的后置处理器:BeanFactoryPostProcessor
和BeanPostProcessor
。
BeanFactoryPostProcessor
BeanFactoryPostProcessor
是在BeanFactory
初始化完成后,但在Bean实例化之前执行的。它可以对BeanFactory
中的Bean定义进行修改。例如,可以通过PropertySourcesPlaceholderConfigurer
来替换配置文件中的占位符。
BeanPostProcessor
BeanPostProcessor
是在Bean实例化和属性注入之后,但在初始化方法调用前后执行的。它可以对Bean进行增强,如添加代理、修改属性等。例如,ApplicationContextAwareProcessor
可以在Bean中注入ApplicationContext
。
12. BeanFactory和ApplicationContext的联系和区别
联系
ApplicationContext
是BeanFactory
的子接口,它继承了BeanFactory
的所有功能,并提供了更多的特性,如国际化支持、事件发布等。
区别
- 功能特性:
BeanFactory
是Spring IOC容器的基础接口,提供了基本的Bean管理功能;ApplicationContext
在BeanFactory
的基础上提供了更多的高级功能,如国际化支持、事件发布、AOP自动代理等。 - 初始化方式:
BeanFactory
是懒加载的,只有在需要使用Bean时才会创建;ApplicationContext
是在启动时就会创建所有的单例Bean。 - 使用场景:
BeanFactory
适用于资源有限的环境,如嵌入式系统;ApplicationContext
适用于大多数企业级应用开发。
13. 说说你对spring事务的理解
Spring事务是Spring框架提供的一种机制,用于管理数据库操作的一致性和完整性。通过Spring事务,可以将一组数据库操作作为一个原子操作来执行,要么全部成功,要么全部失败。
Spring事务的实现基于AOP,通过在方法执行前后进行事务的开启、提交或回滚操作来实现事务的管理。Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。
编程式事务管理
编程式事务管理需要在代码中手动编写事务管理的代码,如开启事务、提交事务、回滚事务等。这种方式比较灵活,但代码量较大,维护成本较高。
声明式事务管理
声明式事务管理是通过注解或XML配置来实现的,不需要在代码中手动编写事务管理的代码。这种方式代码简洁,维护成本较低,是Spring中推荐的事务管理方式。
14. Spring的@Transactional如何实现的
@Transactional
是Spring提供的一个注解,用于声明式事务管理。它的实现基于AOP,主要步骤如下:
- 解析注解:Spring在启动时会扫描带有
@Transactional
注解的方法,并解析注解中的属性,如事务传播级别、事务隔离级别等。 - 创建代理对象:Spring会为带有
@Transactional
注解的类创建代理对象,在代理对象中插入事务管理的逻辑。 - 事务拦截:在调用带有
@Transactional
注解的方法时,代理对象会拦截该方法的调用,并在方法执行前后进行事务的开启、提交或回滚操作。 - 异常处理:如果方法执行过程中抛出异常,代理对象会根据异常类型和
@Transactional
注解的配置决定是否回滚事务。
15. Spring的事务传播级别
Spring的事务传播级别定义了在一个事务方法中调用另一个事务方法时,事务的行为。Spring提供了7种事务传播级别:
- PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
- PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。
- PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
- PROPAGATION_REQUIRES_NEW:创建一个新的事务,并挂起当前事务。
- PROPAGATION_NOT_SUPPORTED:以非事务方式执行,并挂起当前事务。
- PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
- PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务中执行;如果当前没有事务,则创建一个新的事务。
16. Spring的事务隔离级别
Spring的事务隔离级别定义了一个事务对其他事务的可见性。Spring提供了4种事务隔离级别:
- ISOLATION_DEFAULT:使用数据库的默认隔离级别。
- ISOLATION_READ_UNCOMMITTED:允许读取未提交的数据,可能会导致脏读、不可重复读和幻读问题。
- ISOLATION_READ_COMMITTED:只允许读取已提交的数据,避免了脏读问题,但可能会导致不可重复读和幻读问题。
- ISOLATION_REPEATABLE_READ:确保在同一个事务中多次读取同一数据时,数据的结果是一致的,避免了脏读和不可重复读问题,但可能会导致幻读问题。
- ISOLATION_SERIALIZABLE:最高的隔离级别,确保所有事务依次执行,避免了脏读、不可重复读和幻读问题,但会降低并发性能。
17. Spring的事务失效场景分析
方法不是public的
@Transactional
注解只能用于public方法上,如果用于非public方法,事务将失效。
异常被捕获但未抛出
如果在事务方法中捕获了异常但没有重新抛出,Spring无法感知到异常,不会进行事务回滚。
自调用问题
如果在同一个类中,一个方法调用另一个带有@Transactional
注解的方法,事务将失效。因为Spring的事务管理是基于AOP的,自调用不会经过代理对象,所以事务注解不会生效。
数据库不支持事务
如果使用的数据库不支持事务,如MySQL的MyISAM引擎,Spring的事务管理将失效。
18. Spring的事务失效原因分析
注解配置问题
如@Transactional
注解的属性配置错误,或注解没有正确使用,可能导致事务失效。
AOP代理问题
Spring的事务管理是基于AOP的,如果AOP代理配置不正确,如没有开启AOP自动代理,或代理模式选择错误,可能导致事务失效。
数据库连接问题
如果数据库连接配置不正确,或数据库连接池出现问题,可能导致事务失效。
19. Spring Cloud Zuul网关的调优策略有哪些?怎么实现其高可用?Zuu和Gataway,你们项目中是怎么选择的?项目中对Zuul网关层的要求是什么样的?
调优策略
- 线程池配置:调整Zuul的线程池大小,根据实际业务需求合理分配线程资源。
- 超时配置:设置合理的请求超时时间,避免长时间等待导致资源浪费。
- 缓存配置:使用缓存来减少重复请求,提高响应速度。
- 限流配置:对请求进行限流,防止过多的请求导致系统崩溃。
高可用实现
可以通过部署多个Zuul实例,并使用负载均衡器(如Nginx)来实现Zuul的高可用。负载均衡器会将请求均匀地分发到各个Zuul实例上,当某个实例出现故障时,负载均衡器会自动将请求转发到其他正常的实例上。
Zuul和Gateway的选择
- Zuul:Zuul是Netflix开源的网关组件,功能强大,有丰富的过滤器和插件。适用于已经使用Netflix生态系统的项目。
- Gateway:Spring Cloud Gateway是Spring官方推出的网关组件,基于Reactor和Netty,性能更好,支持响应式编程。适用于基于Spring Cloud的新项目。
项目中对Zuul网关层的要求
- 高性能:能够快速处理大量的请求,减少响应时间。
- 高可用:具备容错和故障转移能力,确保系统的稳定性。
- 安全性:提供身份验证、授权、限流等安全功能,保护后端服务。
- 可扩展性:能够方便地添加新的过滤器和插件,满足业务需求的变化。
20. Spring Cloud Eureka和Nacos对比?怎么做选择?Eureka中高可用是怎么做的?进行的调优有哪些?原理是什么?
对比
- 功能特性:Eureka是Netflix开源的服务发现组件,主要提供服务注册和发现功能;Nacos是阿里巴巴开源的服务发现和配置管理平台,除了服务注册和发现功能外,还提供了配置管理、动态路由等功能。
- 性能:Nacos在性能上优于Eureka,尤其是在大规模服务注册和发现场景下。
- 社区活跃度:Nacos的社区活跃度较高,有更多的用户和贡献者,更新和维护也比较及时。
选择
如果项目已经使用了Netflix的其他组件,如Zuul、Ribbon等,建议选择Eureka;如果项目需要更强大的功能,如配置管理、动态路由等,建议选择Nacos。
Eureka高可用实现
Eureka的高可用是通过多个Eureka Server实例之间的相互注册和同步来实现的。每个Eureka Server实例都可以作为其他实例的客户端,将自己的服务信息注册到其他实例上,并从其他实例上获取服务信息。
调优
- 心跳间隔:调整服务实例向Eureka Server发送心跳的间隔时间,减少网络开销。
- 服务过期时间:设置合理的服务过期时间,避免长时间未收到心跳的服务实例一直占用资源。
- 缓存配置:使用缓存来减少Eureka Server的负载,提高响应速度。
原理
Eureka的原理基于客户端-服务器模式。服务实例作为客户端,将自己的服务信息注册到Eureka Server上;Eureka Server作为服务器,负责存储和管理服务信息,并提供服务发现功能。服务消费者可以从Eureka Server上获取服务提供者的信息,并进行调用。
21. Spring Cloud 中常用的注解有哪些?怎么用的?
@EnableEurekaClient
用于启用Eureka客户端功能,将服务注册到Eureka Server上。例如:
@SpringBootApplication
@EnableEurekaClient
public class MyServiceApplication {public static void main(String[] args) {SpringApplication.run(MyServiceApplication.class, args);}
}
@EnableZuulProxy
用于启用Zuul网关代理功能。例如:
@SpringBootApplication
@EnableZuulProxy
public class ZuulGatewayApplication {public static void main(String[] args) {SpringApplication.run(ZuulGatewayApplication.class, args);}
}
@FeignClient
用于创建Feign客户端,实现声明式的REST调用。例如:
@FeignClient(name = "my-service")
public interface MyServiceClient {@GetMapping("/api/data")String getData();
}
@HystrixCommand
用于为方法添加Hystrix熔断机制,当方法调用失败时,会执行fallback方法。例如:
@Service
public class MyService {@HystrixCommand(fallbackMethod = "fallback")public String getData() {// 调用远程服务return restTemplate.getForObject("http://my-service/api/data", String.class);}public String fallback() {return "Fallback data";}
}
22. Spring Cloud中的组件有哪些?具体说说?微服务架构中用到的关键技术有哪些?
Spring Cloud中的组件
- Eureka:服务注册和发现组件,用于管理服务的注册和发现。
- Zuul:网关组件,用于实现请求的路由和过滤。
- Ribbon:负载均衡组件,用于实现客户端的负载均衡。
- Feign:声明式的REST客户端,用于简化REST调用。
- Hystrix:熔断和限流组件,用于保护服务的稳定性。
- Config:配置管理组件,用于集中管理微服务的配置。
- Gateway:新一代的网关组件,基于Reactor和Netty,性能更好。
微服务架构中用到的关键技术
- 服务注册和发现:通过服务注册和发现机制,微服务可以动态地注册和发现其他服务。
- 负载均衡:通过负载均衡技术,将请求均匀地分发到多个服务实例上,提高系统的性能和可用性。
- 熔断和限流:通过熔断和限流机制,保护服务免受故障和过载的影响。
- 配置管理:通过配置管理技术,集中管理微服务的配置,方便配置的更新和维护。
- 消息队列:通过消息队列实现微服务之间的异步通信,提高系统的解耦性和可扩展性。
23. Spring Cloud Config配置架构是什么样的?可视化怎么做的?设计的业务有哪些?
配置架构
Spring Cloud Config的配置架构主要由三部分组成:
- Config Server:配置服务器,用于存储和管理配置文件。可以从本地文件系统、Git仓库、SVN仓库等获取配置文件。
- Config Client:配置客户端,用于从Config Server获取配置信息。在应用启动时,Config Client会自动从Config Server获取配置信息,并将其注入到应用中。
- 配置仓库:用于存储配置文件的仓库,可以是本地文件系统、Git仓库、SVN仓库等。
可视化
可以使用Spring Cloud Config Dashboard来实现Spring Cloud Config的可视化管理。Spring Cloud Config Dashboard是一个基于Web的可视化工具,它可以方便地查看和管理配置信息。
设计的业务
- 多环境配置管理:可以为不同的环境(如开发、测试、生产)配置不同的配置文件,方便管理和维护。
- 动态配置更新:可以在不重启应用的情况下,动态更新配置信息,提高系统的灵活性和可维护性。
- 配置共享:可以将公共的配置信息集中管理,供多个微服务共享使用。
参考书籍、文献和资料
- 《Spring实战》
- 《Spring Cloud微服务实战》
- Spring官方文档:https://spring.io/docs
- Spring Cloud官方文档:https://spring.io/projects/spring-cloud
总结
本文围绕Spring及Spring Cloud的核心问题进行了详细探讨,包括Spring Boot与传统Spring的区别、Spring Boot的启动加载过程、Spring的IOC/AOP实现、动态代理、循环依赖解决、Bean注入方式、后置处理器、事务管理、Spring Cloud的组件和注解等。通过深入理解这些技术的原理和应用,开发者可以更好地使用Spring和Spring Cloud来构建企业级应用和分布式系统。同时,在实际项目中,需要根据具体的业务需求和场景,选择合适的技术和配置,以提高系统的性能、可用性和可维护性。
相关文章:
Java面试:Spring及Spring Cloud技术深度剖析
Spring及Spring Cloud技术深度剖析 前言 在Java开发领域,Spring框架一直是企业级应用开发的中流砥柱,而Spring Boot的出现更是极大地简化了Spring应用的开发过程。同时,Spring Cloud为构建分布式系统提供了强大的支持。本文将围绕Spring及S…...
论文阅读_Search-R1_大模型+搜索引擎
英文名称:Search-R1: Training LLMs to Reason and Leverage Search Engines with Reinforcement Learning 中文名称:Search-R1:训练大型语言模型进行推理并利用搜索引擎的强化学习 链接: http://arxiv.org/pdf/2503.09516v2 代码: https://g…...
零成本AI抠图终极指南:蓝耘元生代AIDC OS+ComfyUI实现商业级效果
引言:AI抠图革命已经到来 在数字内容创作爆炸式增长的今天,高质量的图像处理已成为刚需。无论是电商平台的商品展示、自媒体博主的封面设计,还是摄影爱好者的后期处理,抠图都是最基础也是最繁琐的工作之一。 传统抠图方式面临三…...
深入理解CSS3:Flex/Grid布局、动画与媒体查询实战指南
引言 在现代Web开发中,CSS3已经成为构建响应式、美观且高性能网站的核心技术。它不仅提供了更强大的布局系统(Flexbox和Grid),还引入了令人惊艳的动画效果和精准的媒体查询能力。本文将深入探讨这些关键技术,帮助您提…...
VLM-E2E:通过多模态驾驶员注意融合增强端到端自动驾驶——论文阅读
《VLM-E2E Enhancing End-to-End Autonomous Driving with Multimodal Driver Attention Fusion》2025年2月发表,来自香港科大广州分校、理想汽车和厦门大学的论文。 一、核心问题与动机 现有端到端(E2E)自动驾驶系统直接从传感器输入映射到…...
蓝牙BLE
1、简介 蓝牙BR/EDR和BLE是蓝牙技术的两个重要分支,它们各自具有独特的特点和应用场景。 1.1、蓝牙BR/EDR 蓝牙BR(Basic Rate) 定义:蓝牙技术的首个开发版本,采用高斯频移键控(GFSK)调制技术…...
在VS2022中使用Lua与c交互(二)
一、核心交互机制:Lua 虚拟栈 Lua 与 C 的交互通过一个 虚拟栈(Stack) 完成,所有数据传递、函数调用均通过此栈实现。栈的每个元素可以是任意 Lua 类型(如数字、字符串、表、函数等)。 栈的结构与…...
论文阅读_Citrus_在医学语言模型中利用专家认知路径以支持高级医疗决策
英文名称:Citrus: Leveraging Expert Cognitive Pathways in a Medical Language Model for Advanced Medical Decision Support 中文名称:Citrus:在医学语言模型中利用专家认知路径以支持高级医疗决策 链接: http://arxiv.org/pdf/2502.18…...
浅谈PCB传输线(一)
前言:浅谈传输线的类型,以及传输线的一些行为特性。 1.传输线的种类 2.互连线被视为传输线的场景 3.传输线的行为特性*** 1.传输线的种类 PCB 中的信号传输线通常有两种基本类型: 微带线和带状线。此外,还有第三种类型–共面线(没有参考平面…...
Spring-全面详解(学习总结)
一:概述 1.1 为什么学 解决了两个主要问题 1. 2 学什么 1.3 怎么学 二:系统架构 作用:web开发、微服务开发、分布式系统开发 容器:用于管理对象 AOP:面向切面编程(不惊动原始程序下对其进行加强) 事…...
突破JVM边界:类加载三重门与栈帧的生存法则
类加载子系统 文件验证阶段 类加载子系统在加载Class文件时,首先会验证文件格式规范,检查文件开头的魔数标识,确保这是一个合法的JVM字节码文件。 职责边界 该子系统仅负责将Class文件加载到内存中,并不关心后续能否成功执行—…...
VSCode 查看文件的本地修改历史
1. 使用时间线视图(Timeline) 新版 VSCode 内置了一个叫 Timeline(时间线) 的功能,可以查看: 本地文件修改记录(包括保存历史)Git 提交历史(如果仓库是 Git 管理的&…...
在QGraphicsView中精确地以鼠标为锚缩放图片
在pyqt中以鼠标所在位置为锚点缩放图片-CSDN博客中的第一个示例中,通过简单设置: self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse) 使得QGraphicsView具有了以鼠标为锚进行缩放的功能。但是,其内部应当是利用了滚动条的移动来…...
【Python数据驱动决策】数据分析与可视化全流程实战指南
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比二、实战演示环境配置要求核心代码实现案例1:销售数据清洗案例2:月度销售趋势分析案例3:产品关联分析(热力图)运行结果验证三、性能对…...
报错解决:ModuleNotFoundError: No module named ‘triton.ops‘
报错原因:2024.5.21之后, triton.ops 被移动到另一个工程 triton-lang/kernels中。 参考链接:官方解释 解决方案:换用2024.5.21之前发布的版本。 pip3 install triton2.3.0...
相机-IMU联合标定:相机-IMU外参标定
文章目录 📚简介🚀标定工具kalibr🚀标定数据录制🚀相机-IMU外参标定📚简介 在 VINS(视觉惯性导航系统) 中,相机-IMU外参标定 是确保多传感器数据时空统一的核心环节,其作用可概括为以下关键点: 坐标系对齐(空间同步),外参误差会导致视觉特征点投影与IMU预积…...
Qt C++数据库实验
一、实验目的和要求 1、掌握Qt中数据库SQL类数据库的查询、插入和更新操作。 2、熟悉Qt界面设计中常用的控件。 3、了解数据库相关类。 二、实验内容 1、设计一个数据库操作软件,完成数据库的相关操作。 2、建立按钮的信号与槽函数,实现点击按钮进…...
相机-IMU联合标定:IMU标定
文章目录 📚 简介🚀标定工具安装📌 IMU标定工具 code_utils📌 IMU标定工具 imu_utils:🚀标定数据录制🚀IMU标定📚 简介 在 VINS(Visual-Inertial Navigation System,视觉惯性导航系统) 中,IMU标定 是确保系统高精度运行的关键环节。IMU(惯性测量单元)本身…...
榕壹云信用租赁系统:基于ThinkPHP+MySQL+UniApp的全链路免押租赁解决方案
信用租赁时代的全流程数字化革新 随着共享经济与信用体系的深度融合,传统租赁行业正面临效率与信任的双重挑战。榕壹云信用租赁系统依托ThinkPHP高性能框架、MySQL数据库与UniApp跨平台开发技术,构建了一套覆盖设备租赁全生命周期的数字化解决方案。通过整合多因子身份认证、…...
C语言中的指针详解
指针是C语言中非常强大且复杂的特性之一,它为我们提供了更灵活的内存管理方式,使得程序能够直接操作内存,提升效率和性能。尽管指针非常强大,但如果不理解它的概念和使用方式,很容易出现错误。因此,理解指针…...
NIPS2021 | 视觉 Transformer 的有趣特性
Intriguing Properties of Vision Transformers 摘要-Abstract引言-Introduction相关工作-Related Work视觉Transformer的有趣特性-Intriguing Properties of Vision Transformers视觉Transformer对遮挡具有鲁棒性吗?-Are Vision Transformers Robust to Occlusions…...
贪心算法-2208.将数组和减半的最小操作数-力扣(LeetCode)
一、题目解析 这里要注意恰好这个字眼,说明对任意数减小一半是不需要向上取整的,所以我们需要定义double类型的数据。 二、算法解析 我们需要将数组和减小为一半的次数最少,所以根据贪心算法,我们需要取数组中最大的数进行减半操…...
如何搭建spark yarn 模式的集群集群。
下载 App 如何搭建spark yarn 模式的集群集群。 搭建Spark on YARN集群的详细步骤 Spark on YARN模式允许Spark作业在Hadoop YARN资源管理器上运行,利用YARN进行资源调度。以下是搭建步骤: 一、前提条件 已安装并配置好的Hadoop集群(包括HDF…...
嵌入式开发面试典型编程题解析:排序算法、指针操作、字符处理、递归原理等基础原理的深度解析。
在嵌入式开发面试中,编程题是常见的考察形式,旨在检验求职者对基础编程知识的掌握和应用能力。以下是几道典型的嵌入式面试编程题及详细解析,帮助新手逐步理解和掌握相关知识点。 一、用交换法对学生成绩降序排序 题目描述 在嵌入式系统开…...
DeepSeek+即梦:AI视频创作从0到1全突破
目录 一、开启 AI 视频创作大门:前期准备1.1 注册与登录1.2 熟悉工具界面1.3 硬件与网络要求 二、用 DeepSeek 构思视频脚本2.1 明确创作主题与目标2.2 编写优质提示词2.3 生成并优化脚本 三、即梦 AI 实现画面生成3.1 文生图基础操作3.2 调整参数提升画质3.3 保持人…...
npm init、换源问题踩坑
文章目录 一、 问题复现二、问题解决 一、 问题复现 成功安装nodejs 以及 npm 版本如下: > node -v > v20.18.0 > npm -v > 10.8.2使用 npm init 命令时延时过长,考虑换源,使用指令 npm config set registry https://registr…...
TRex 控制台命令解析
TRex 是一种高性能的网络测试工具,用于生成和分析网络流量。以下是对这些命令的简要解释: 一、help Console Commands(控制台命令) capture:管理 PCAP 捕获。debug:用于开发的内部调试器。events&#x…...
【Shell 脚本入门】轻松上手的实战指南
🌈 个人主页:Zfox_ 🔥 系列专栏:Shell脚本编程 目录 一:🔥 什么是 Shell 🦋 常见的 Shell 类型 二:🔥 什么是 Shell 脚本 🦋 Shell 脚本规则🦋 第…...
数据结构*栈
栈 什么是栈 这里的栈与我们之前常说的栈是不同的。之前我们说的栈是内存栈,它是JVM内存的一部分,用于存储局部变量、方法调用信息等。每个线程都有自己独立的栈空间,当线程启动时,栈就会被创建;线程结束,…...
零基础制作Freertos智能小车(教程非常简易)持续更新中....
从现开始,将陆续推出各类简单的DIY电子设计,由简入深,将自己的制作过程全部分享出来,巩固自己知识的同时希望借此机会认识更多喜欢电子设计的小伙伴。 本次小车的主控芯片采用stm32f103c8t6,主要是便宜好用&am…...
Leetcode - 双周赛155
目录 一,3527. 找到最常见的回答二,3528. 单位转换 I三,3529. 统计水平子串和垂直子串重叠格子的数目四,3530. 有向无环图中合法拓扑排序的最大利润 一,3527. 找到最常见的回答 题目列表 本题是一道模拟题࿰…...
详解RabbitMQ工作模式之工作队列模式
目录 工作队列模式 概念 特点 应用场景 工作原理 注意事项 代码案例 引入依赖 常量类 编写生产者代码 编写消费者1代码 编写消费者2代码 先运行生产者,后运行消费者 先运行消费者,后运行生产者 工作队列模式 概念 在工作队列模式中&#x…...
QGIS+mcp的安装和使用
QGISmcp的安装和使用 安装qgis_mcp 下载qgis_mcp: git clone https://github.com/jjsantos01/qgis_mcp.git安装uv uv是一个由Rust语言编写的python包管理工具,旨在提供比传统工具(如 pip)更高效的依赖管理和虚拟环境操作。 p…...
Java基础361问第16问——枚举为什么导致空指针?
我们看一段代码 public enum Color {RED, BLUE, YELLOW;public static Color parse(String color) {return null;} }public static void main() {Color color Color.parse("");// 极具迷惑性,大家日常开发肯定这么写过switch (color) {case RED:break;c…...
在 C# .NET 中驾驭 JSON:使用 Newtonsoft.Json 进行解析与 POST 请求实战
JSON (JavaScript Object Notation) 已经成为现代 Web 应用和服务之间数据交换的通用语言。无论你是开发后端 API、与第三方服务集成,还是处理配置文件,都绕不开 JSON 的解析与生成。在 C# .NET 世界里,处理 JSON 有多种选择,其中…...
CentOS7——Docker部署java服务
1、安装Docker 首先要确保系统已安装 Docker,若未安装,可以参考我的另一篇文章现在CentOS7上安装Docker,文章地址如下: CentOS7系统安装Docker教程-CSDN博客 Docker当中要安装必备的软件,比如Java运行必要的JDK&#…...
Python-Part2-集合、字典与推导式
Python-Part2-集合、字典与推导式 1. set集合 ⽆序,去掉重复数据。 set1 {1,2,3,4,5,5,4,3,2,1}print(type(set1))print(set1)set2.add(66666)set2.remove(55)#不能使用下标访问set,所以修改操作一般为remove操作 add操作2.dict 字典 字典ÿ…...
《AI大模型应知应会100篇》第39篇:多模态大模型应用:文本、图像和音频的协同处理
第39篇:多模态大模型应用:文本、图像和音频的协同处理 摘要 随着人工智能技术的发展,多模态大模型(Multimodal Large Models)已经成为AI领域的热点之一。这些模型能够同时处理文本、图像、音频等多种模态数据…...
kvm学习小结
安装相关包 安装虚拟化相关包 apt install qemu-kvm qemu-system libvirt-clients libvirt-daemon-system vlan bridge-utils 安装界面相关包 apt install xinit gdmd 配置机器允许root登录 检查cpu是否支持虚拟化 egrep -o vmx|svm /proc/cpuinfo 执行命令systemctl s…...
k8s基本概念-YAML
YAML介绍 YAML是“YAML Aint a Markup Language” (YAML不是一种置标语言)的递归缩进写,早先YAML的意思其实是:“Yet Another Markup Language”(另一种置标语言) YAML是一个类似XML、JSON的标记性语言。YAML强调以数据为中心,并不是以标识语言为重点。因而YAML本身的定义…...
wps批注线条怎么取消去掉wps批注后有竖线
wps批注线条怎么取消去掉wps批注后有竖线 问题 图片 解决方案 图片 word批注线条取消的方法: 1.打开Word文档,点击需要删除的批注。 2.然后点击工具栏“审阅”选项。 3.接着点击“接受“ 4.接受对文档所做的所有修订(H)...
深度解析算法之分治(归并)
48.排序数组 题目链接 给你一个整数数组 nums,请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。 示例 1: 输入: nums [5,2,3,1] 输出&am…...
僵尸进程是什么?
僵尸进程(Zombie Process)是指在 Unix/Linux 系统中,一个子进程已经终止,但其父进程尚未对它进行善后处理(即没有读取其退出状态),导致子进程的进程表项仍然保留在系统中。由于这个进程已经结束…...
城市群出行需求的时空分形
城市群出行需求的时空分形 原文:He, Zhengbing. “Spatial-temporal fractal of urban agglomeration travel demand.” Physica A: Statistical Mechanics and its Applications 549 (2020): 124503. 1. Introduction(引言) 城市区域的重…...
LangChain入门(二)安装开发环境
1.安装conda Conda 是一个开源的软件包管理系统和环境管理系统,用于安装多个版本的软件包及其依赖关系,并在它们之间轻松切换。 Anaconda是一个开源的Python发行版本,其包含了conda、python等软件包,numpy、pandas、scipy等科学…...
如何开展有组织的AI素养教育?
一、AI素养的定义与核心内涵 AI素养是智能时代个体适应与创新能力的综合体现,其内涵随着技术发展动态扩展,包含以下核心维度: 知识体系:理解AI基本原理(如算法、数据、算力)、技术边界及发展趋势ÿ…...
InnoDB对LRU算法的优化
标准 LRU 算法的核心思想是:当缓存空间不足时,淘汰掉最近最少使用的数据块(Page)。它通常用一个链表来实现,链表头部是最近访问的 Page,链表尾部是最久未访问的 Page。 然而,在数据库系统中直接…...
云原生--核心组件-容器篇-7-Docker私有镜像仓库--Harbor
1、Harbor的定义与核心作用 定义: Harbor是由VMware开源的企业级容器镜像仓库系统,后捐赠给 CNCF (Cloud Native Computing Foundation)。它基于Docker Registry扩展了企业级功能,用于存储、分发和管理容器镜像(如Docker、OCI标准…...
TypeScript 实用类型深度解析:Partial、Pick、Record 的妙用
需求背景:在后台系统的用户管理模块中,我们常遇到这样的场景:修改用户资料时只需要传部分字段,展示用户列表时要隐藏敏感信息,快速查找用户需要ID索引等等,这些业务需求都可以通过 TypeScript 的实用类型优…...
【Pandas】pandas DataFrame rmod
Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象(如 DataFrame、Series 或标量)的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...