Spring 面试题整理
文章目录
- 一、控制反转 IoC
- 什么是 Bean 和 Spring Bean?
- 依赖注入的常见方式?
- Bean 的作用域有哪些?
- protype bean 里面的依赖是 singleton bean 的话,IoC 容器会怎么处理?
- Bean 的生命周期?
- @Resource 和 @Autowired 有什么区别吗?
- @Component 和 @Bean 的区别是什么?
- Spring 如何解决循环依赖?
- 二、面向切面编程 AOP
- Spring AOP 和 AspectJ AOP 有什么区别
- 描述 AOP 的领域模型
- Spring AOP的动态代理类型有什么区别
- 多个切面的执行顺序如何控制?
- 三、SpEL 表达式
- 什么是 SpEL 表达式
- SpEL 表达式的处理过程
- 四、Spring MVC
- Spring MVC 的核心组件
- Spring MVC的工作原理
- 如何使用适配器模式
- 五、Spring Boot
- 阐述一下自动配置原理?
- 介绍一下自动装配?
- 自动装配和自动配置的区别?
- 在自定义 starter 的时候,Spring Boot 2.x 和 Spring Boot 3.x 之间的区别
一、控制反转 IoC
什么是 Bean 和 Spring Bean?
答案解析:
-
一个 Java Bean 是一种符合以下约定的可重用类:
- 属性私有化:类的属性通过
private
修饰,不能直接访问。 - 提供 Getter 和 Setter 方法:通过
get
和set
方法访问或修改属性。 - 无参构造器:必须提供一个公共的无参构造器。
- 可序列化(可选):实现
Serializable
接口,方便对象的序列化。
- 属性私有化:类的属性通过
-
Spring Bean 是在 Spring 配置文件(XML、注解或 Java 配置类)中定义的组件或对象, 由 Spring IoC 容器进行管理。
依赖注入的常见方式?
答案解析:
构造函数注入适合处理必需的依赖项,而 Setter 注入则更适合可选的依赖项。
-
构造函数注入(官方推荐做法)
@Service public class Service {private final Repository repository;// 构造器底层会使用注解 @Autowired ,可以隐式使用public Service(Repository repository) {this.repository = repository;} }
-
Setter 注入:依赖对象通过 setter 方法注入。
public class Service {private Repository repository;// 可以隐式使用 @Autowiredpublic void setRepository(Repository repository) {this.repository = repository;} }
-
Field 注入:使用
@Autowired
注解直接在字段上注入依赖。这种方式通常用于小型项目或者在测试时注入模拟对象。不建议使用字段注入。@Service public class Service {@Autowiredprivate Repository repository; }
Bean 的作用域有哪些?
答案解析:
Bean 的作用域定义了 Bean 的生命周期和可见性。
- Spring 中的 Bean 默认都是单例的。
- 无状态的 Bean 的使用
singleton
, 而有状态的 Bean 使用prototype
。注意:有状态单例 Bean 存在线程安全问题。 - 作用域可以用
@scope
注解来设置。
不同作用域的含义如下:
作用域 | 描述 |
---|---|
singleton | (默认) 将单个 Bean 定义作用域限定为每个 Spring IoC 容器中的一个对象实例。 |
prototype | 将单个 Bean 定义作用域限定为多个对象实例。 |
request | 将单个 Bean 定义作用域限定为一个 HTTP 请求的生命周期。即,每个 HTTP 请求都有基于同一个 Bean 定义创建的自己的实例。仅在支持 Web 的 Spring ApplicationContext 中有效。 |
session | 将单个 Bean 定义作用域限定为 HTTP Session 的生命周期。仅在支持 Web 的 Spring ApplicationContext 中有效。 |
application | 将单个 Bean 定义作用域限定为 ServletContext 的生命周期。仅在支持 Web 的 Spring ApplicationContext 中有效。 |
websocket | 将单个 Bean 定义作用域限定为 WebSocket 的生命周期。仅在支持 Web 的 Spring ApplicationContext 中有效。 |
protype bean 里面的依赖是 singleton bean 的话,IoC 容器会怎么处理?
-
Singleton bean 是在容器启动时创建并共享的,只会实例化一次。Prototype bean 是每次请求都会创建一个新的实例。
-
当我们通过 Spring 容器请求 Prototype Bean 时,Spring 会创建一个新的 Prototype Bean 实例,但会将已经存在的 Singleton Bean 实例注入到其中。
Singleton Bean
是共享的,在整个容器生命周期内只有一个实例,而每次请求 Prototype Bean 时,都会得到一个新的实例,注入的 Singleton Bean 仍然是同一个实例。
Bean 的生命周期?
答案解析:
Bean 的生命周期概括起来就是 4 个阶段:
- 实例化(Instantiation):实例化一个 Bean 对象
- 属性赋值(Populate):为 Bean 设置相关属性和依赖
- 初始化(Initialization): 执行 Bean 自身的初始化操作,Spring 提供了多个钩子方法和机制来执行初始化逻辑。其中,第 5、6 步为初始化操作,第 3、4 步为在初始化前执行,第 7 步在初始化后执行。该阶段结束,才能被用户使用。
- 销毁(Destruction):第8步不是真正意义上的销毁),而是先在使用前注册了销毁的相关调用接口,为了后面第9、10步真正销毁 bean 时再执行相应的方法。
如何记忆Spring Bean的生命周期 - 草捏子 (chaycao.github.io)
Customizing the Nature of a Bean :: Spring Framework
@Resource 和 @Autowired 有什么区别吗?
答案解析:
当一个接口存在多个实现类的话,byType 这种方式就无法正确注入对象。我们必须设置为按名称匹配。
指的注意的是,@Resource 会增加额外代码, SpringBoot3 及以上已经废弃了 @Resource 注解。
特性 | @Resource | @Autowired |
---|---|---|
来源 | Java 标准(JSR-250,javax.annotation ) | Spring 专属(org.springframework ) |
默认匹配规则 | 按名称优先,其次按类型 | 按类型优先 |
按名称注入支持 | 原生支持(name 属性) | 需配合 @Qualifier 使用 |
支持可选性 | 不支持 | 支持(required = false ) |
推荐使用场景 | 需要按名称注入,或项目遵循 Java 标准规范 | Spring 项目中,默认按类型注入 |
@Component 和 @Bean 的区别是什么?
答案解析:
特点 | @Component | @Bean |
---|---|---|
适用场景 | 对于开发者定义的类,推荐使用 @Component 。 | 对于外部类或复杂实例化逻辑,推荐使用 @Bean 。 |
自动化支持 | 借助类路径扫描自动生成 Bean,简化配置。 | 需要显式声明,但更灵活,适合自定义对象生成过程。 |
语义化 | 强调组件的职责,如 @Service 、@Repository 。 | 强调是一个通过方法定义的 Bean 实例。 |
Spring 如何解决循环依赖?
答案解析:
Spring 主要是利用三级缓存来解决依赖。
(1) 循环依赖问题
在 Spring IoC 中, 循环依赖问题主要有以下三种情况:
- 构造器注入:通过构造方法进行依赖注入时产生的循环依赖问题。
- setter 注入原型模式: 通过setter方法进行依赖注入且是在多例(原型)模式下产生的循环依赖问题。
- setter 注入单例模式: 通过setter方法进行依赖注入且是在单例模式下产生的循环依赖问题。
其中, 只有 setter 注入单例模式的循环依赖问题可以被解决,其他两种方式下的循环依赖问题无法解决。具体原因为:
- 使用构造器注入时,循环依赖是不可解决的,因为依赖项必须在对象创建之前完成注入。如果有循环依赖,构造器注入会导致
StackOverflowError
或抛出异常。 - 原型 Bean 的生命周期不受 Spring 容器管理,它**每次请求时都会创建一个新的实例。**因此,Spring 容器无法像管理单例 Bean 那样,在初始化阶段解决依赖关系(包括循环依赖)。
(2) 循环依赖解决方案
在 setter 注入单例模式下, 循环依赖问题的解决方案主要有:
- 三级缓存机制:在属性注入中,容器首先创建 Bean 的实例(无需立即填充依赖),然后在实例化之后处理其依赖项,这样可以打破循环。
- 使用懒加载 + 代理对象
(3) 三级缓存
三级缓存都是 Map 类型的缓存, 分别对应 DefaultSingletonBeanRegistry
类 中的属性。
-
一级缓存(
singletonObjects
):
一级缓存是一个存放已经完成初始化的单例对象的缓存。当 Bean 完成所有初始化步骤后,它会被放入一级缓存中。在 Bean 的生命周期中,如果一级缓存中已经存在对应的 Bean,那么直接返回即可。 -
二级缓存(
earlySingletonObjects
):
二级缓存是一个存放提前暴露的单例对象的缓存,即已经实例化但未被初始化的 Bean 。在某些情况下,一个对象的创建未完全完成(例如,未进行属性注入和后置处理器的处理),但为了打破循环依赖,需要提前暴露该对象。在这种情况下,该对象会被放入二级缓存中,允许其他对象提前引用。 -
三级缓存(
singletonFactories
):三级缓存是一个存放创建 Bean 的工厂方法(
ObjectFactory
)的缓存。通过这个工厂方法,可以创建出尚未完全初始化的对象。三级缓存的存在目的是允许在创建过程中,Bean 被代理(如通过 AOP 生成代理对象),并且可以按需获取对象。
(4) 为什么不用二级缓存
在没有 AOP 的情况下,确实可以只使用一级和三级缓存来解决循环依赖问题。
但是,当涉及到 AOP 时,如果只有一级缓存和三级缓存,那么 Spring 将无法保存三级缓存中存储的ObjectFactory
(即生成代理对象的工厂)调用 getObject
方法生成的前期暴露对象,这就意味着每次访问 Bean 时都可能会重新生成代理对象。这不仅会增加计算开销,还会导致不同的代理实例,而这与 AOP 的设计初衷不符(AOP 代理应该是对同一个 Bean 实例的装饰)。
Spring常见面试题总结 | JavaGuide
二、面向切面编程 AOP
Spring AOP 和 AspectJ AOP 有什么区别
答案解析:
Spring AOP 和 AspectJ AOP 都是面向切面编程(AOP)的实现方案,但在使实现方式、使用场景以及功能特性上有显著区别。
-
实现方式:
- Spring AOP: 基于代理(Proxy)机制,默认使用 JDK 动态代理或 CGLIB 代理实现。
- AspectJ AOP: 在编译时、类加载时甚至运行时进行字节码操作,使用独立的 AspectJ 编译器来处理切面逻辑。
-
切入点表达式:
- Spring AOP: 仅支持方法级别的切面。它只支持切入方法调用的逻辑,无法切入构造函数、字段访问、静态方法等。
- AspectJ AOP: 支持更丰富的切入点表达式,包括方法、构造函数、字段、静态方法、异常处理块等。它能够对代码的更多方面进行切入和增强。
描述 AOP 的领域模型
答案解析:
目标(Target): 被通知的对象
代理(Proxy): 向目标对象应用通知之后创建的代理对象
切面(Aspect): 切面是一个模块,包含横切关注点的定义和实现。切面可以通过注解或配置来声明。
连接点(Join Point): 程序执行的某个特定点,例如方法调用、异常抛出等。AOP 可以在这些点上插入横切关注点。
切入点(Pointcut): 切入点定义了切面要织入的连接点的集合。通过切入点表达式,可以精确地指定在哪些连接点上应用切面。
通知(Advice): 通知定义了切面在特定的连接点上执行的动作。通知类型包括前置通知、后置通知、返回通知、异常通知和环绕通知。
织入(Weaving): 织入是将切面应用到目标对象并创建代理对象的过程。织入可以在编译时、类加载时或运行时进行。
AOP 的术语具体解释查看 AOP Concepts :: Spring Framework
Spring AOP的动态代理类型有什么区别
答案解析:
Spring AOP 的动态代理类型主要包括基于 JDK 的动态代理、 基于 CGLIB 的代理。
(1) 代理方式
-
JDK 动态代理是 Java 提供的一种代理机制,它通过反射机制在运行时创建目标对象的代理实例,并且代理类实现了目标对象的接口。
-
CGLIB 代理通过继承目标类,生成一个目标类的子类并覆盖其中的方法来实现增强。同时,CGLIB 代理对于深度继承的对象和
final
类/方法无效。CGLIB(Code Generation Library)是一个开源的代码生成库,基于底层的字节码操作,可以在运行时动态生成目标对象的子类。
(2) 两种代理类型的效率和开销差距
JDK 动态代理创建代理开销小,方法调用效率相对较低。而 CGLIB 代理创建代理开销大,方法调用效率高。
- JDK 动态代理:通过反射机制调用目标对象的方法,因此相对较慢,尤其是方法调用频繁时,性能开销较大。
- CGLIB 代理:直接访问生成的代理类的方法,相比 JDK 动态代理,效率较高。但对于大型对象或深度继承结构时,CGLIB 代理会更加占用内存和计算资源。
(3) Spring 如何使用不同的动态代理类型
-
默认使用 JDK 动态代理:当目标对象实现了至少一个接口时,Spring 默认会使用 JDK 动态代理。
-
使用 CGLIB 代理:当目标对象没有实现任何接口时,Spring 会使用 CGLIB 代理。
总结以上内容
代理类型 | 使用场景 | 优点 | 缺点 |
---|---|---|---|
JDK 动态代理 | 目标对象实现了接口 | 轻量、符合接口编程 | 只能代理实现接口的类,性能受反射影响 |
CGLIB 代理 | 目标对象没有实现接口 | 能代理没有接口的类,调用效率较高 | 生成的代理类较大,无法代理 final 类和方法 |
选择条件 | 目标对象实现接口:JDK 动态代理;没有接口:CGLIB | 可以通过 @EnableAspectJAutoProxy 强制指定代理类型 | 在深度继承和 final 类/方法场景下不适用 |
深入解析:Cglib与JDK动态代理的实现原理、区别及性能对比-腾讯云开发者社区-腾讯云
多个切面的执行顺序如何控制?
答案解析:
-
使用
@Order
注解: Spring AOP 支持使用@Order
注解来指定切面的执行顺序。@Order
注解指定了切面的优先级,数字越小,优先级越高。Spring 会按照优先级从小到大顺序执行切面。 -
实现
Ordered
接口重写getOrder
方法。
三、SpEL 表达式
什么是 SpEL 表达式
答案解析:
SpEL 可以在运行时评估表达式并生成值。
SpEL 表达式的处理过程
- 表达式解析:首先,SpEL 对表达式进行解析,将其转换为内部表示形式即抽象语法树(AST)或者其他形式的中间表示。
- 上下文设置:在表达式求值之前,需要设置上下文信息。上下文可以是一个对象,它包含了表达式中要引用的变量和方法。通过将上下文对象传递给表达式求值引擎,表达式可以访问并操作上下文中的数据。
- 表达式求值:一旦表达式被解析和上下文设置完成,SpEL 开始求值表达式。求值过程遵循 AST 的结构,从根节点开始,逐级向下遍历并对每个节点进行求值。求值过程可能涉及递归操作,直到所有节点都被求值。
- 结果返回:表达式求值的结果作为最终结果返回给调用者。返回结果可以是任何类型,包括基本类型、对象、集合等。
/*** 验证数字是否大于10** @param number 数字* @return 结果*/
public String spELSample(int number) {// 创建ExpressionParser对象,用于解析SpEL表达式ExpressionParser parser = new SpelExpressionParser();String expressionStr = "#number > 10 ? 'true' : 'false'";Expression expression = parser.parseExpression(expressionStr);// 创建EvaluationContext对象,用于设置参数值StandardEvaluationContext context = new StandardEvaluationContext();context.setVariable("number", number);// 求解表达式,获取结果return expression.getValue(context, String.class);
}
SpEL应用实战 (dewu.com)
四、Spring MVC
Spring MVC 的核心组件
DispatcherServlet
是前端控制器设计模式的实现,提供 Spring Web MVC 的集中访问点,而且负责职责的分派,而且与Spring IoC 容器无缝集成,从而可以获得 Spring 的所有好处HandlerMapping
:用于将 HTTP 请求映射到具体的Handler
Handler
是处理 HTTP 请求的具体对象或方法, 即所熟悉的 Controller。HandlerAdapter
是调用Handler
的适配器,它根据Handler
的类型来选择合适的调用方式。
Spring MVC的工作原理
Spring MVC的工作原理如下:
- 请求进入: 客户端所有的请求都提交给
DispatcherServlet
,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。 - 查询
Handler
:DispatcherServlet
查询一个或多个HandlerMapping
, 找到处理请求的Handler
。 - 匹配
HandlerAdapter
:找到Handler
后,DispatcherServlet
会根据Handler
的类型,选择一个合适的HandlerAdapter
。不同的Handler
可能需要不同的HandlerAdapter
来适配,比如RequestMappingHandlerAdapter
适用于基于注解的控制器方法。 - 调用
HandlerAdapter
:HandlerAdapter
调用Handler
来处理请求,并执行与之相关的业务逻辑。最后,HandlerAdapter
将Handler
的执行结果包装成ModelAndView
, 并返回给DispatcherServlet
。 - 视图解析:
DispatcherServlet
查询一个或多个ViewResolver
视图解析器, 找到ModelAndView
对象指定的视图对象 。 - 返回响应:视图对象负责渲染返回给客户端。
如何使用适配器模式
HandlerAdapter
和 Handler
是解耦的,通过 HandlerAdapter
,Spring MVC 能够灵活支持不同类型的处理器,而不需要 DispatcherServlet
直接依赖于特定的 Handler
类型。
适配器的职责是将请求委托给具体的 Controller
(源接口),并将结果返回给客户端(目标接口)。其中,
- 目标接口:客户端的 HTTP 请求,例如对
/example
的 GET 请求。 - 源接口:
HandlerAdapter
,它是处理请求的接口,用于适配不同类型的Controller
。 - 适配器:
HandlerAdapter
的具体实现类,它将请求适配到具体的Controller
实现。
举个例子,
@Controller
public class MyController {@RequestMapping("/hello")public String sayHello() {return "hello";}
}
在这个例子中:z
MyController
的sayHello
方法就是一个Handler
。RequestMappingHandlerAdapter
就是相应的HandlerAdapter
,它负责调用带有@RequestMapping
注解的处理方法。
当请求 /hello
时,DispatcherServlet
通过 HandlerMapping
找到 MyController
的 sayHello
方法(即 Handler
),然后使用 RequestMappingHandlerAdapter
适配并调用该方法。
五、Spring Boot
阐述一下自动配置原理?
(1) 自动配置的作用
Spring Boot 自动装配是 Spring Boot 的核心功能之一,旨在简化应用程序的配置和开发流程。通常,在传统的 Spring 应用中,开发者需要手动编写大量的 XML 或 Java 配置来定义 Bean、组件扫描、数据源、事务管理等各种组件。Spring Boot 的自动装配机制可以根据项目的依赖(starter)和环境(application.yaml)自动配置这些组件,极大地减少了开发者手动配置的工作。
(2) 自动配置的原理
自动配置的工作步骤为:
- 启动自动配置:Spring Boot通过
@EnableAutoConfiguration
注解开启自动装配。 - 扫描类路径: 扫描所有依赖的 jar 包中的
META-INF\spring.factories
文件,加载文件中的所有配置类XXXAutoConfiguration
。 - 条件判断:每每个自动配置类通过
@Conditional
系列注解检查是否符合加载条件。
介绍一下自动装配?
答案解析:
自动装配是指通过 Spring 的 IoC 容器自动将所需的依赖注入到目标对象中。
自动装配和自动配置的区别?
答案解析:
特性 | 自动装配(Autowiring) | 自动配置(Auto-Configuration) |
---|---|---|
定义 | 自动装配是指通过 Spring 的 IoC 容器自动将所需的依赖注入到目标对象中。 | 自动配置是指 Spring Boot 根据类路径中的依赖和配置,自动加载并配置所需的 Bean。 |
核心目的 | 用于解决依赖注入问题,实现组件之间的松耦合。 | 用于减少配置文件和代码,快速提供开箱即用的默认配置。 |
实现方式 | 借助注解(如 @Autowired 、@Qualifier 等)或 XML 配置,动态装配所需的依赖。 | 基于 @EnableAutoConfiguration 和 META-INF/spring.factories 的机制,动态加载配置类。 |
触发条件 | 在 Bean 的定义阶段,通过注解标注的字段、构造函数或方法参数被 IoC 容器自动注入依赖。 | 应用启动时,@EnableAutoConfiguration 启用自动配置,扫描类路径和配置文件加载配置类。 |
依赖方式 | 通常依赖于 ApplicationContext 提供的 Bean 容器以及组件的显式定义。 | 依赖 Spring Boot 提供的 Starter 包和 spring.factories 文件,基于条件加载配置类。 |
典型场景 | 在业务逻辑中需要动态注入服务、仓库或其他依赖时。 | 在启动时为应用程序自动配置常见组件,如数据源、Web 环境、消息队列、缓存等。 |
灵活性 | 灵活且精确,可以通过显式配置覆盖或限定具体 Bean 的注入行为。 | 提供开箱即用的功能,但需要通过 exclude 或条件注解来调整默认配置行为。 |
主要注解 | - @Autowired - @Qualifier - @Primary - @Resource | - @EnableAutoConfiguration - @Conditional 系列注解:@ConditionalOnClass 等 |
依赖容器 | - ApplicationContext | - Spring Boot 的自动配置机制和 Starter 包 |
主要组件 | - Bean 的依赖注入部分 | - 数据源配置类(DataSourceAutoConfiguration ) - 缓存配置类( CacheAutoConfiguration ) |
在自定义 starter 的时候,Spring Boot 2.x 和 Spring Boot 3.x 之间的区别
答案解析:
从 Spring Boot 3.x 开始,自动配置包的路径从META-INF/spring.factories
修改为 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
jar 包中的 META-INF\spring.factories
文件变更为
相关文章:
Spring 面试题整理
文章目录 一、控制反转 IoC什么是 Bean 和 Spring Bean?依赖注入的常见方式?Bean 的作用域有哪些?protype bean 里面的依赖是 singleton bean 的话,IoC 容器会怎么处理?Bean 的生命周期?Resource 和 Autowi…...
Converting circular structure to JSON
最近在项目中遇到了这个问题,头疼,弄了一下午才解决。做一个笔记吧。 1 Converting circular structure to JSON 我这个问题大致就是在使用pinia中出现了循环引用,意思是两个或多个模块、对象或依赖之间形成了相互依赖的链条。在使用 Pinia…...
webstorm开发uniapp(从安装到项目运行)
1、下载uniapp插件 下载连接:Uniapp Tool - IntelliJ IDEs Plugin | Marketplace (结合自己的webstorm版本下载,不然解析不了) 将下载到的zip文件防在webstorm安装路径下,本文的地址为: 2、安装uniapp插…...
企业级包管理器之搭建 npm 私有服务器 (6)
在企业级应用开发中,常常需要处理私有包的发布和管理。搭建 npm 私有服务器是一个理想的解决方案,它不仅能保证代码的私密性,还能提供更快的下载速度和更精细的权限设置。 一、搭建 npm 私有服务器的优势 保证代码私密性:在企业…...
会议通知:人工智能通识教育与实践发展暨和鲸科技AI通识课解决方案发布会
今年秋季学期起,全国多所高校面向本科生开设人工智能通识课。 当前人工智能通识课程的建设进展主要分为三种情况: 全市统筹,由某头部高校牵头建设市级人工智能通识课,以北京市、天津市为代表; 已于秋季学期按照课程…...
windows C#-自动实现属性的轻型类
此示例演示如何创建一个不可变的轻型类,该类仅用于封装一组自动实现的属性。 当你必须使用引用类型语义时,请使用此种构造而不是结构。 可通过以下方法来实现不可变的属性: 仅声明 get 访问器,使属性除了能在该类型的构造函数中…...
汽车零部件设计之——发动机曲轴预应力模态分析仿真APP
汽车零部件是汽车工业的基石,是构成车辆的基础元素。一辆汽车通常由上万件零部件组成,包括发动机系统、传动系统、制动系统、电子控制系统等,它们共同确保了汽车的安全、可靠性及高效运行。在汽车产业快速发展的今天,汽车零部件需…...
C#基础:结构
目录 1. C# 程序结构 示例: 2. 变量和数据类型 示例: 3. 控制结构 条件语句(if): 循环语句(for 和 while): 4. 函数定义和调用 示例: 5. 数组和集合 数组示例…...
[免费]SpringBoot+Vue疫苗接种预约管理系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue疫苗接种预约管理系统,分享下哈。 项目介绍 如今的时代,是有史以来最好的时代,随着计算机的发展到现在的移动终端的发展,国内目前信息技术已经在…...
C++50道经典面试题
文章结尾有最新热度的文章,感兴趣的可以去看看。 本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身 导读 作为一种通用且面向对…...
iptables详解
华子目录 什么是防火墙分类netfilter(数据包过滤)定义netfilter分析内容 防火墙无法完成的任务netfilter策略管理工具netfilter的5类hook函数防火墙规则策略匹配原则iptablesiptables流量处理动作iptables表5种规则表 安装iptablesiptables策略文件 ipta…...
静态链表的构建
前言: 静态链表的概述: 静态链表是一种在数组中模拟链表结构的数据结构,它通过数组的索引来模拟指针,实现节点之间的链接,就不需要使用指针了。每个节点由两部分组成:数据域和游标。数据域用于储存数据&a…...
python3中的身份运算符
一. 简介 本文简单学习一下,python3中的身份运算符。 在Python 3中,身份运算符用于比较两个对象的身份,即它们是否引用内存中的同一个对象。 二. python3 中的身份运算符 1. python3 中的身份运算符 python3 中的身份运算符如下表所示&a…...
Java泛型设计详解
引言 在日常Java开发中,泛型是一个非常重要的特性。它提供了编译时的类型安全检查,增强了代码的可读性和可维护性。然而,对于初学者甚至一些有经验的开发者来说,泛型的使用和理解仍然是一个挑战。本文旨在深入探讨Java泛型的诞生…...
第十九章程序清单合集——Java语言程序设计进阶篇(黑皮书)
目录 程序清单19_1GenericStack 程序清单19_2GenericMethodDemo 程序清单19_3BoundedTypeDemo 程序清单19_4GenericSort 程序清单19_5Max 程序清单19_6MaxUsingGenericType 程序清单19_7wildCardNeedDemo 程序清单19_8AnyWildCardDemo 程序清单19_9SuperWildChardDem…...
el-table组件树形数据修改展开箭头
<style lang"scss" scoped> ::v-deep .el-table__expand-icon .el-icon-arrow-right:before {content: ">"; // 箭头样式font-size: 16px; }::v-deep .el-table__expand-icon{ // 没有展开的状态background-color: rgba(241, 242, 245, 1);color:…...
LabVIEW前面板无法显示的常见原因
当 LabVIEW 前面板显示为白色或黑色时,可能由于控件可视性设置、显卡驱动问题、程序错误或 LabVIEW 设置不当引起。通过检查面板设置、更新驱动、重启程序等方式可有效解决此问题。 遇到前面板无法显示或显示为白色/黑色的情况,可能有以下几种原因。可以…...
PyQt事件机制练习
一、思维导图 二、代码 import sysfrom PyQt6.QtTextToSpeech import QTextToSpeech from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QLineEdit from PyQt6 import uic from PyQt6.QtCore import Qt, QTimerEvent, QTimeclass MyWidget(QWidget):d…...
Android 中,Activity Fragment:如何进行界面跳转、数据传递等
学习笔记 1. Activity 之间的界面跳转和数据传递 在 Android 中,Activity 之间的跳转通常通过 Intent 来完成。Intent 可以携带数据,并传递给目标 Activity,也可以从目标 Activity 返回数据。 从一个 Activity 跳转到另一个 Activity // 在…...
【ubuntu18.04】安装easycwmp出现/usr/bin/ld: cannot find -lubus问题解决方案
错误日志 rootw1804-virtual-machine:/opt/dev/easycwmp# make Making all in bin make[1]: Entering directory /opt/dev/easycwmp/bin gcc -DPACKAGE_NAME\"easycwmpd\" -DPACKAGE_TARNAME\"easycwmpd\" -DPACKAGE_VERSION\"1.8.6\" -DPACKAG…...
可视化建模以及UML期末复习----做题篇
一、单项选择题。(20小题,每小题2分,共40分) 1、UML图不包括( ) A、用例图 B、状态机图 C、流程图 D、类图 E、通信图 答案:C、流程图 UML中不包括传统意义上的流程图,流程图通常是指B…...
【2024年浙江工商大学程序设计竞赛新生赛(同步赛)部分题解】
比赛链接 C. 交换 题目大意 给定一个长度为 n n n 的数组 a a a。一开始你有一个总和 s 0 s 0 s0。 现在你需要做 n n n 次操作,第 i i i 次操作的流程如下( 1 ⩽ i ⩽ n 1 \leqslant i \leqslant n 1⩽i⩽n): 选择一个下标 p ∈…...
[SAP ABAP] DEBUG ABAP程序中的循环语句
在ABAP程序开发中可能会遇到要DEBUG循环语句的情况,这个循环语句可能会执行上万次,但我们希望程序执行循环到100次就停下来,也就是希望DEBUG断点设置在循环语句的第100次停下来观察执行的结果,这时我们可以在DEBUG程序时通过设置一…...
解决阿里云轻量级服务器 Ubuntu 24.04.1 LTS 没网也 ping 不通 8.8.8.8 以及 route -n 没有输出任何转发信息
事情发生在两天前,位于公网的阿里云轻量级服务器(Ubuntu 24.04.1 LTS)忽然没网。主要是上次上服务器进行配置已经是一个多月前,最近也没有做什么事情,就忽然没网了,让人纳闷。更主要的是,上次备…...
AUTOSAR:SOME/IP 概念
文章目录 1. 用例与需求1.1 典型用例1.2 对中间件的要求 2. 协议栈示例3. SOME/IP 概念3.1 中间件整体功能与架构3.2 服务组成元素详细解释 4. 服务发现机制深入剖析5. 总结 1. 用例与需求 1.1 典型用例 信息娱乐系统: 后座娱乐系统连接:允许后排乘客连…...
STM32--中断
中断 中断向量表 定义一段固定的内存,以4字节对齐,存放各个中断服务函数程序的首地址。定义在启动文件中。 中断相关寄存器 内核中断不经过中断使能、除能寄存器。 中断优先级 1、抢占优先级:高高抢占优先级可以打断正在执行的低抢占优先…...
海思3559a开发
目录 固件烧录配置网络nfs挂载虚拟机文件使用telnet连接开发板 固件烧录 1、配置好HiTool烧录工具 需要注意长度必须不小于对应文件大小 2、开始烧录 先点击擦除全器件,重新给开发板上电,擦除成功后如下图所示。 点击烧写,重新给开发板上电…...
优选算法——位运算
1. 常见位运算总结 2. 判定字符是否唯一 题目链接:面试题 01.01. 判定字符是否唯一 - 力扣(LeetCode) 题目展示: 题目分析:本题有很多种做法,这里我们使用位图来解决,这种做法是一种效率很高…...
【JAVA】旅游行业中大数据的使用
一、应用场景 数据采集与整合:全面收集旅游数据,如客流量、游客满意度等,整合形成统一数据集,为后续分析提供便利。 舆情监测与分析:实时监测旅游目的地的舆情信息,运用NLP算法进行智能处理,及…...
使用html和JavaScript实现一个简易的物业管理系统
码实现了一个简易的物业管理系统,主要使用了以下技术和功能: 1.主要技术 使用的技术: HTML: 用于构建网页的基本结构。包括表单、表格、按钮等元素。 CSS: 用于美化网页的外观和布局。设置字体、颜色、边距、对齐方式等样式。 JavaScript…...
浅谈Kubernetes(K8s)之RC控制器与RS控制器
1.RC控制器 1.1RC概述 Replication Controller 控制器会持续监控正在运行的Pod列表,并保证相应类型的Pod的数量与期望相符合,如果Pod数量过少,它会根据Pod模板创建新的副本,反之则会删除多余副本。通过RC可实现了应用服务的高可用…...
如何在 openAI Sora 上生成视频内容
近期OpenAI 推出了我们期待已久的视频生成模型 Sora。能够生成包含多个角色、特定类型的动作以及主体和背景的精确细节的复杂场景。该模型不仅了解用户在提示中要求的内容,还了解这些内容在物理世界中的存在方式。 如何在 openAI Sora 上生成视频内容 使用Sora 视频…...
【Oracle11g SQL详解】日期和时间函数:SYSDATE、TO_DATE、TO_CHAR 等
日期和时间函数:SYSDATE、TO_DATE、TO_CHAR 等 在 Oracle 数据库中,日期和时间函数用于处理日期和时间数据。它们在记录创建时间、分析时间间隔、格式化输出等场景中非常重要。本文将详细讲解常用的日期和时间函数及其应用。 一、SYSDATE:获…...
STM32 串口收发文本数据包
单片机学习! 目录 前言 一、文本数据包格式 二、串口收发文本数据包代码 三、代码解析 3.1 标志位清除 3.2 数据包接收 四、代码问题改进 总结 前言 本文介绍了串口收发文本数据包程序设计的思路并详解代码作用。 一、文本数据包格式 文本数据包的格式的定义…...
铭记一次项目重大事故
在程序的世界里,bug 就像隐藏在暗处的小怪兽,时不时跳出来捣乱。而职业生涯中,总有那么一个或几个 bug 让我们刻骨铭心。它或许让项目差点夭折,或许让你熬了无数个通宵,或许有着离奇的出现方式和曲折的解决过程。无论是…...
AUTOSAR 汽车开放系统架构
AUTOSAR 官网 AUTOMOTIVE OPEN SYSTEM ARCHITECTURE AUTOSAR (AUTomotive Open System ARchitecture) is a global partnership of leading companies in the automotive and software industry to develop and establish the standardized software framework and open E/E …...
从零用java实现 小红书 springboot vue uniapp (2)主页优化
前言 移动端演示 http://8.146.211.120:8081/#/ 前面的文章我们基本完成了主页的布局 今天我们具体的去进行实现 并且分享我开发时遇到的问题 首先先看效果 java仿小红书主页 实现效果为 1.顶端全屏切换 2.上划加载更多 3.下拉当前页整体刷新 顶端全屏切换我们选择 gui-switch…...
打电话玩手机识别-支持YOLO,COCO,VOC格式的标记,超高识别率可检测到手持打电话, 非接触式打电话,玩手机自拍等
打电话玩手机识别-支持YOLO,COCO,VOC格式的标记,超高识别率可检测到手持打电话, 非接触式打电话,玩手机自拍等1275个图片。 手持打电话: 非接触打电话 玩手机 数据集下载 yolov11:https://download.csdn…...
黑马程序员Java项目实战《苍穹外卖》Day12
苍穹外卖-day12 课程内容 工作台Apache POI导出运营数据Excel报表 功能实现:工作台、数据导出 工作台效果图: 数据导出效果图: 在数据统计页面点击数据导出:生成Excel报表 1. 工作台 1.1 需求分析和设计 1.1.1 产品原…...
实现SpringBoot项目嵌入其他项目
很多时候我们需要在项目里面嵌入其他项目或者被其他项目嵌入,如我们开发一个开源项目b,用户需要在自己的项目a嵌入b项目,使用b项目的功能,而且要实现a项目工作最小化,最好实现引入即用。 1.定义b项目的自定义配置 …...
海康威视摄像头RTSP使用nginx推流到服务器直播教程
思路: 之前2020年在本科的时候,由于项目的需求需要将海康威视的摄像头使用推流服务器到网页进行直播。这里将自己半个月琢磨出来的步骤给大家发一些。切勿转载!!!! 使用网络摄像头中的rtsp协议---------通…...
【自动化】requirements.txt
1.是什么? 用于列出项目依赖的所有Python包及其版本。这使得其他开发者可以轻松地安装与你的项目兼容的环境,或者在不同的机器上复制相同的开发环境。 2.如何编写requirements.txt 手动创建 格式: 包名版本号 在终端home命令自动生成 创建r…...
C++ 中多态性在实际项目中的应用场景
背景与需求 在一个图形绘制软件中,需要绘制多种不同的图形,如圆形、矩形、三角形等。每个图形都有自己的绘制方法,但是它们都可以被看作是一个抽象的 “图形” 概念,并且都有一个共同的操作,比如绘制(draw&…...
手机租赁系统开发指南一站式服务流程解析
内容概要 手机租赁系统的开发是一个复杂但有趣的过程,像搭建乐高一样,只要找到合适的模块,就能打造出一个宾至如归的租赁平台。在这部分,我们将对开发流程的整体结构进行简要概述,并指出每个环节的重要性。 首先&…...
基于Couchbase的数据构建方案:数仓分层
初步方案是将公共层和报表层分别放在不同的bucket中,这种设计从存储和访问优化的角度是合理的,但仍有以下细节需要考虑: 1. 数仓公共层设计(origin bucket) 合理性分析: 将ODS、DWD、DWS层的数据放在一个b…...
Linux中的线程
目录 线程的概念 进程与线程的关系 线程创建 线程终止 线程等待 线程分离 原生线程库 线程局部存储 自己实现线程封装 线程的优缺点 多线程共享与独占资源 线程互斥 互斥锁 自己实现锁的封装 加锁实现互斥的原理 死锁 线程同步 线程的概念 回顾进程相关概念 …...
【保姆级】Mac如何安装+切换Java环境
本文从如何下载不同版本的JDK,到如何丝滑的切换JDK,以及常见坑坑的处理方法,应有尽有,各位看官走过路过不要错过~~~ 下载⏬ 首先上官网: https://www.oracle.com/ 打不开的话可以使用下面👇这个中文的 https://www.oracle.com/cn/java/technologies/downloads/a…...
leetcode 31 Next Permutation
题意 找到下一个permutation是什么,对于一个数组[1,2,3],下一个排列就是[1, 3, 2] 链接 https://leetcode.com/problems/next-permutation/ 思考 首先任何一个permutation满足一个性质,从某个位置往后一定是降序。…...
从RocketMQ到Dubbo:自研中间件技术的崛起
目录 一. 宝兰德 BES 中间件(BES - Business Enterprise Server) 二. TongWeb 中间件 三. 阿里巴巴 RocketMQ 四. 京东 JStorm 五. 华为 GaussDB 六. 华为 FusionInsight 七. 百度 Tinker 八. 中科曙光 Kylin 九. 滴滴 Druid 一. 宝兰德 BES 中间…...
计算机键盘简史 | 键盘按键功能和指法
注:本篇为 “计算机键盘简史 | 键盘按键功能和指法” 相关文章合辑。 英文部分机翻未校。 The Evolution of Keyboards: From Typewriters to Tech Marvels 键盘的演变:从打字机到技术奇迹 Introduction 介绍 The keyboard has journeyed from a humb…...