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

Spring、SpringMVC、Mybatis

一.Spring基础

1.Spring 框架是什么

Spring 是一款开源的轻量级 Java 开发框架,我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,例如,Spring core、Spring JDBC、Spring MVC 等,使用这些模块可以很方便地协助我们进行开发。

2.Spring包含的模块有哪些

Spring4.x 版本

Spring5.x 版本

Spring5.x 版本中 Web 模块的 Portlet 组件已经被废弃掉,同时增加了用于异步响应式处理的 WebFlux 组件。

Spring 各个模块的依赖关系如下:

Core Container:Spring 框架的核心模块,也可以说是基础模块,主要提供 IoC、DI 等功能的支持。Spring 其他所有的功能基本都需要依赖于该模块,我们从上面那张 Spring 各个模块的依赖关系图就可以看出来。以下模块为 Core Container 的子模块

  • spring-core:Spring 框架基本的核心工具类。

  • spring-beans:提供对 bean 的创建、配置和管理等功能的支持。

  • spring-context:提供对国际化、事件传播、资源加载等功能的支持。

  • spring-expression:提供对表达式语言(Spring Expression Language) SpEL 的支持,只依赖于 core 模块,不依赖于其他模块,可以单独使用。

AOP

  • spring-aspects:该模块为与 AspectJ 的集成提供支持。

  • spring-aop:提供了面向切面编程的实现。

  • spring-instrument:提供了为 JVM 添加代理的功能。具体来讲,它为 Tomcat 提供了一个织入代理,能够为 Tomcat 传递类文件,就像这些文件是被类加载器加载的一样。没有理解也没关系,这个模块的使用场景非常有限。

Data Access/Integration

  • spring-jdbc:提供了对数据库访问的抽象 JDBC。不同的数据库都有自己独立的 API 用于操作数据库,而 Java 程序只需要和 JDBC API 交互,这样就屏蔽了数据库的影响。

  • spring-tx:提供对事务的支持。

  • spring-orm:提供对 Hibernate、JPA、iBatis 等 ORM 框架的支持。

  • spring-oxm:提供一个抽象层支撑 OXM(Object-to-XML-Mapping),例如:JAXB、Castor、XMLBeans、JiBX 和 XStream 等。

  • spring-jms : 消息服务。自 Spring Framework 4.1 以后,它还提供了对 spring-messaging 模块的继承。

Spring Web

  • spring-web:对 Web 功能的实现提供一些最基础的支持。

  • spring-webmvc提供对 Spring MVC 的实现

  • spring-websocket:提供了对 WebSocket 的支持,WebSocket 可以让客户端和服务端进行双向通信。

  • spring-webflux:提供对 WebFlux 的支持。WebFlux 是 Spring Framework 5.0 中引入的新的响应式框架。与 Spring MVC 不同,它不需要 Servlet API,是完全异步。

Messaging

spring-messaging 是从 Spring4.0 开始新加入的一个模块,主要职责是为 Spring 框架集成一些基础的报文传送应用。

Spring Test

Spring 团队提倡测试驱动开发(TDD)。有了控制反转 (IoC)的帮助,单元测试和集成测试变得更简单。

Spring 的测试模块对 JUnit(单元测试框架)、TestNG(类似 JUnit)、Mockito(主要用来 Mock 对象)、PowerMock(解决 Mockito 的问题比如无法模拟 final, static, private 方法)等等常用的测试框架支持的都比较好。

3.Spring、Spring MVC、Spring Boot 之间的关系是什么?

  • Spring 一般指的是 SpringFramework,他是很多模块的集合,其中最重要的模块是 Spring-Core, Spring 中其他模块的功能实现基本都依赖于该模块。

  • Spring MVC 就是 Spring 众多模块中的一个,Spring MVC 主要用于快速构建 MVC 架构的 Web 程序。

  • Spring 目的是简化应用程序的开发,但使用 Spring 进行开发,配置起来过于麻烦。因此,出现了Spring Boot,目的是简化 Spring 开发。

二.Spring IoC

1.谈谈自己对于 Spring IoC 的了解

IoC(Inversion of Control,控制反转)是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。并且,对象之间的相互依赖关系也交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以把应用从复杂的依赖关系中解放出来,很大程度上简化应用的开发。 IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件或注解即可,完全不用考虑对象是如何被创建出来的。

在实际项目中一个 Service 类可能依赖了很多其他的类,假如我们需要实例化这个 Service,你可能要每次都要搞清这个 Service 所有底层类的构造函数,这可能会把人逼疯。如果利用 IoC 的话,你只需要配置好,然后在需要的地方引用就行了,这大大增加了项目的可维护性且降低了开发难度。

Note:

  • IoC是一种思想,在其他语言中也有对 IoC 思想的实现,并非 Spring 特有的。

  • 在 Spring 中, IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个 Map,Map 中存放的是各种对象。

2.什么是 Spring Bean?

简单来说,Spring Bean 代指的就是那些被 IoC 容器所管理的对象。我们可以通过配置文件或者注解的方式,告诉 IoC 容器需要帮助我们管理哪些对象。

<bean id="..." class="..."><constructor-arg value="..."/>
</bean>

3.Spring 的常见注解有哪些?

  • 第一类是声明 bean 的注解,有 @Component、@Controller、@Service、@Repository

  • 第二类是依赖注入相关的,有 @Autowired、@Resourse

  • 第三类是设置 bean 的作用域 @Scope

  • 第四类是 Spring 配置相关的,比如 @Configuration,@ComponentScan 和 @Bean

  • 第五类是跟 aop 相关做增强的注解 @Aspect、@Before、@After、@Around、@Pointcut

4.@Component 和 @Bean 的区别是什么?

  • @Component 注解作用于类,而 @Bean 注解作用于配置类中的方法。

  • @Component是通用的注解,可以用于标识任意类生成一个对象,加入到 IoC 容器,@Bean 一般用来将第三方的对象或者自定义的对象加入到 IoC 容器。

5.@Autowired 和 @Resource 的区别是什么?

  • @Autowired 属于 Spring 内置的注解,优先根据类型注入,当根据类型无法注入的时候,比如一个接口有多个实现类,会根据名称注入。

  • @Resource 属于 JDK 提供的注解,优先根据名称注入,如果无法通过名称匹配到,则根据类型注入。

  • @Autowired 支持在构造函数、方法、属性和参数上使用。@Resource 支持在属性和方法上使用,不支持在构造函数或参数上使用。

6.Bean 的作用域有哪些?

Spring 中 Bean 的作用域最常用的是下面二种:

  • Singleton:在 Singleton 模式下 IoC 容器中只有唯一的 bean 实例。Spring 中的 bean 默认都是单例的。

  • Prototype:在Prototype模式下每次获取 bean,都会创建一个新的 bean 实例。

下面这些仅在 Web 应用中可用

  • request(请求 bean)每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。

  • session(会话 bean)每一次来自新 session 的 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。

  • application/global-session(应用 Bean)每个 Web 应用在启动时创建一个 Bean,该 bean 仅在当前应用启动时间内有效。

  • websocket:每一次 WebSocket 会话产生一个新的 bean。

如何配置 bean 的作用域呢?

xml 方式:

<bean id="..." class="..." scope="singleton"></bean>

注解方式:

@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public Person personPrototype() {return new Person();
}

7.Bean 是线程安全的吗?

Spring 框架中的 Bean 是否线程安全,取决于其作用域和状态。以最常用的两种作用域 singleton 和 prototype 为例。有状态 Bean 是指包含可变的成员变量。

  • singleton 作用域下,IoC 容器中只有唯一的 bean 实例,可能会存在资源竞争问题。如果这个 bean 是有状态的话,那就存在线程安全问题。
  • prototype 作用域下,每次获取都会创建一个新的 bean 实例,不存在资源竞争问题,所以不存在线程安全问题。

但是,在 singleton 作用域下,其实大部分 Bean 都是无状态的。比如 Dao、Service。对于有状态单例 Bean 的线程安全问题,常见的有两种解决办法:

  • 在 Bean 中尽量避免定义可变的成员变量。

  • 在类中定义一个 ThreadLocal 成员变量,将需要的可变成员变量保存在 ThreadLocal 中。

有状态的 bean 举例:

在下面的例子中,count 是一个有状态的 Bean,因为它有一个成员变量 count,该变量可以在 increment 方法调用时发生改变。如果将该 Bean 声明为 Singleton 作用域,则该 bean 存在线程安全问题。

@Component
public class Counter {private int count;public void increment() {count++;}public int getCount() {return count;}
}

8.Spring的三级缓存了解吗?

9.Spring中的循环引用及其解决方法

循环引用其实就是循环依赖,也就是两个或两个以上的 bean 互相持有对方,形成了闭环。比如 A依赖于 B,B 依赖于 A。

10.Bean 的生命周期了解么?

三.Spring AOP

1.谈谈自己对于 AOP 的了解

AOP 的意思是面向切面编程,能够将那些与业务无关,但被业务模块所共同调用的功能封装起来。例如,事务处理、日志管理、权限控制等,可以减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

Spring AOP 是基于动态代理的,如果要代理的对象,实现了某个接口,那么 Spring AOP 会使用 JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用 Cglib 生成一个被代理对象的子类来作为代理,如下图所示:

AOP 切面编程涉及到的一些专业术语:

2.通知类型有哪些?

  • Before(前置通知):目标对象的方法调用之前触发

  • After (后置通知):目标对象的方法调用之后触发

  • AfterReturning(返回通知):目标对象的方法调用完成,在返回结果值之后触发

  • AfterThrowing(异常通知):目标对象的方法运行中抛出 / 触发异常后触发。AfterReturning 和 AfterThrowing 两者互斥。如果方法调用成功无异常,则会有返回值;如果方法抛出了异常,则不会有返回值。

  • Around (环绕通知):编程式控制目标对象的方法调用。环绕通知是所有通知类型中可操作范围最大的一种,因为它可以直接拿到目标对象,以及要执行的方法,所以环绕通知可以任意的在目标对象的方法调用前后搞事,甚至不调用目标对象的方法

3.多个切面的执行顺序如何控制?

使用 @Order 注解直接定义切面顺序

// 值越小优先级越高
@Order(3)
@Component
@Aspect
public class LoggingAspect implements Ordered {

实现 Ordered 接口重写 getOrder 方法。

@Component
@Aspect
public class LoggingAspect implements Ordered {// ....@Overridepublic int getOrder() {// 返回值越小优先级越高return 1;}
}

四.Spring MVC

1.说说自己对于 Spring MVC 了解?

MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示相分离来组织代码。

Spring MVC 是当前最优秀的 MVC 框架,天生与 Spring 框架集成。Spring MVC 下我们一般把后端项目分为 Service 层(处理业务)、Dao 层(数据库操作)、Entity 层(实体类)、Controller 层(控制层,返回数据给前台页面)。相比于之前的 MVC 框架,比如 Struts2,Spring MVC 使用起来更加简单,运行速度更快。

2.Spring MVC 常见的注解有哪些?

  • @RequestMapping:用于映射请求路径。

  • @ResponseBody:注解实现将 controller 方法返回对象转化为 json 对象响应给客户端。

  • @RequestHeader:获取指定的请求头数据。

处理常见的 HTTP 请求类型:

  • @GetMapping:GET 请求。

  • @PostMapping:POST 请求。

  • @PutMapping:PUT 请求。

  • @DeleteMapping:DELETE 请求。

前后端传值:

  • @RequestParam:@RequestParam 用于获取查询参数。

  • @Pathvariable:@PathVariable 用于获取路径参数

  • @RequestBody:实现接收 http 请求体的 JSON 数据,将 JSON 转换为 java 对象。

系统会使用 HttpMessageConverter 或者自定义的 HttpMessageConverter 将请求的 body 中的 json 字符串转换为对象,HTTP请求的请求方法可能是 POST、PUT、DELETE、GET 请求。

3.Spring MVC 的核心组件有哪些?

  • DispatcherServlet:核心的中央处理器,负责接收请求、分发,并给予客户端响应。

  • HandlerMapping:处理器映射器,根据 URL 去匹配查找能处理的 Handler,并会将请求涉及到的拦截器和 Handler 一起封装。

  • HandlerAdapter:处理器适配器,根据 HandlerMapping 找到的 Handler,适配执行对应的 Handler。

  • Handler:请求处理器,处理实际请求的处理器。

  • ViewResolver:视图解析器,根据 Handler 返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给 DispatcherServlet 响应客户端

4.Spring MVC 工作原理了解吗?

Spring MVC 原理如下图所示:

流程说明(重要):

  1. 客户端(浏览器)发送请求,DispatcherServlet 拦截请求。

  2. DispatcherServlet 根据请求信息调用 HandlerMapping。HandlerMapping 根据 URL 去匹配查找能处理的 Handler(也就是我们平常说的 Controller 控制器),并会将请求涉及到的拦截器和 Handler 一起封装。

  3. DispatcherServlet 调用 HandlerAdapter 适配器执行 Handler 。

  4. Handler 完成对用户请求的处理后,会返回一个 ModelAndView 对象给 DispatcherServlet ,ModelAndView 顾名思义,包含了数据模型以及相应的视图的信息。Model 是返回的数据对象,View 是个逻辑上的 View。

  5. ViewResolver 会根据逻辑 View 查找实际的 View。

  6. DispatcherServlet 把返回的 Model 传给 View(视图渲染)。

  7. 把 View 返回给请求者

5.统一异常处理怎么做?

一般使用注解的方式统一异常处理,具体会使用到 @ControllerAdvice + @ExceptionHandler 这两个注解。

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {@ExceptionHandler(BaseException.class)public ResponseEntity<?> handleAppException(BaseException ex, HttpServletRequest request) {//......}@ExceptionHandler(value = ResourceNotFoundException.class)public ResponseEntity<ErrorReponse> handleResourceNotFoundException(ResourceNotFoundException ex, HttpServletRequest request) {//......}
}

这种异常处理方式下,会给所有或者指定的 Controller 织入异常处理的逻辑(AOP),当 Controller 中的方法抛出异常的时候,由被 @ExceptionHandler 注解修饰的方法进行处理。

ExceptionHandlerResolver 中 getMappedMethod 方法决定了异常具体被哪个被 @ExceptionHandler 注解修饰的方法处理异常。

五.Spring 事务

1.Spring的事务是如何实现的?

Spring 实现的事务本质就是 aop 完成,对方法前后进行拦截,在执行方法之前开启事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

2.Spring 管理事务的方式有几种?

  • 编程式事务:在代码中硬编码,通过 TransactionTemplate 或者 TransactionManager 手动管理事务,实际应用中很少使用。

  • 声明式事务:在 XML 配置文件中配置或者直接基于 @Transactional 注解使用,实际是通过 AOP 实现。

3.@Transactional 注解了解吗?

  • 当 @Transactional 注解作用于类上时,该类的所有 public 方法都会具有该类型的事务

  • 当 @Transactional 注解作用于方法上时,该方法将具有该类型的事务,也可以在方法上使用该注解来覆盖类上的定义

  • 在 @Transactional 注解中如果不配置 rollbackFor 属性,那么事务只会在遇到运行时异常的时候才会回滚,加上属性 rollbackFor = Exception.class,可以让事务在遇到非运行时异常时也回滚。

4.Spring 事务中有哪几种事务传播行为? 

事务的传播行为指的是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何传播。记住前三种常用的差不多就够了。

5.Spring 事务中的隔离级别有哪几种?

和事务传播行为这块一样,为了方便使用,Spring 也相应地定义了一个枚举类:Isolation

public enum Isolation {//采用数据库的默认隔离级别DEFAULT(TransactionDefinition.ISOLATION_DEFAULT),//读未提交READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED),//读已提交READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED),//可重复读REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ),//串行化SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE);private final int value;Isolation(int value) {this.value = value;}public int value() {return this.value;}}
  • Default(默认):采用数据库的默认隔离级别。

  • READ_UNCOMMITTED(读未提交):读未提交指的是允许一个事务读取另一个事务未提交的数据,可能会导致脏读、幻读、不可重复读。

  • READ-COMMITTED(读已提交):读已提交指的是一个事物提交之后,它做的变更才会被其他事务看到,可以阻止脏读,但是幻读或不可重复读仍有可能发生。

  • REPEATABLE-READ(可重复读):可重复读指的是对相同数据的多次读取,结果都是一致的,除非数据是事务本身所修改的,可以阻止脏读和不可重复读,但幻读仍有可能发生。

  • SERIALIZABLE(可串行化):所有的事务依次逐个执行,这样事务之间就不可能产生干扰,该级别可以防止并发事务产生的所有问题。

6.Spring 中事务失效的场景有哪些

  • 如果在方法内部捕获并处理了异常,没有抛出,就会导致事务失效

  • 如果方法抛出编译时异常,不去处理也会导致事务失效,可以在 @Transactional 注解上配置rollbackFor 属性为 Exception,这样不管是什么异常,都会回滚事务

  • 如果方法不是 public 修饰的,也会导致事务失效

六.Mybatis

1.MyBatis 的执行流程

  1. 读取 MyBatis 核心配置文件(mybatis-config.xml),加载运行环境和映射文件

  2. 构造会话工厂 SqlSessionFactory,一个项目只需要一个,单例的,一般由 spring 进行管理

  3. 会话工厂创建 SqlSession 对象,这里面就包含了执行 SQL 语句的所有方法

  4. 每一个 SqlSession 都会拥有一个 Executor 对象,通过 Executor 对象操作数据库的接口执行 SQL,同时负责查询缓存的维护

  5. Executor 接口的执行方法中有一个 MappedStatement 类型的参数,封装了映射信息

  6. 最后关闭 SqlSession,释放资源

MappedStatement 封装的映射信息

参数映射:封装了将 Java 对象映射到 SQL 语句中的参数。参数映射规定了如何将方法参数中的值传递给 SQL 语句中的占位符。

结果映射:封装了将 SQL 查询结果映射到 Java 对象的规则。结果映射指定了 SQL 查询返回结果的列与 Java 对象属性之间的对应关系。

2.#{} 和 ${} 的区别是什么?

Mybatis 提供的 # 占位符和 $ 占位符,都是实现动态 SQL 的一种方式,通过这两种方式把参数传递到 XML 之后,在执行 SQL 之前,Mybatis 会对这两种占位符进行动态解析。

# 占位符是向 PreparedStatement 中的预处理语句设置参数,而 PreparedStatement 中的 SQL 语句是预编译的,SQL 语句中使用了占位符。并且在设置参数的时候,如果有特殊字符,会自动进行转义。所以 # 号占位符可以防止 SQL 注入。

而使用 $ 的方式传参,相当于直接把参数拼接到了原始的 SQL 里面,会存在 SQL 注入的问题。

所以 $ 和 # 最大的区别在于,前者是动态参数,后者是占位符,动态参数无法防止 SQL 注入的问题,所以在实际应用中,应该尽可能的使用 # 号占位符。

所以 # 和 $ 最大的区别在于,前者是占位符,后者是动态参数,动态参数无法防止 SQL 注入的问题,所以在实际应用中,应该尽可能使用 # 号占位符。

Note:$ 符号的动态传参,可以适合应用在一些动态 SQL 场景中,比如动态传递表名、动态设置排序字段等。

3.xml 映射文件中,有哪些常见的标签?

除了常见的 select、insert、update、delete 标签之外

还有很多其他的标签,比如 <resultMap>、 <parameterMap>、 <sql>、 <include>、 <selectKey> ,加上动态 sql 的 9 个标签, trim、where、set、foreach、if、choose、when、otherwise、bind 等,其中 <sql> 为 sql 片段标签,通过 <include> 标签引入 sql 片段, <selectKey> 为不支持自增的主键生成策略标签。

4.Mybatis是否支持延迟加载?

是支持的,延迟加载的意思就是在需要用到数据时才进行加载,不需要用到数据时 就不加载数据。 Mybatis支持一对一关联对象和一对多关联集合对象的延迟加载 在Mybatis配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false,默认是关闭的

5.延迟加载的底层原理知道吗?

延迟加载在底层主要使用的CGLIB动态代理完成的

第一是,使用CGLIB创建目标对象的代理对象,这里的目标对象就是开启了 延迟加载的mapper

第二个是当调用目标方法时,进入拦截器invoke方法,发现目标方法是null 值,再执行sql查询

第三个是获取数据以后,调用set方法设置属性值,再继续查询目标方法,就有值了

6.Mybatis 的一级、二级缓存用过吗?

mybatis 的一级缓存是基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当Session 进行 flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。

二级缓存是基于 namespace 和 mapper 的作用域起作用的,不是依赖于 SQL session,默认也是采用 PerpetualCache,HashMap 存储。 二级缓存默认是关闭的,如果想要开启二级缓存需要在全局配置文件和映射文件中开启配置才行。

7.Mybatis的二级缓存什么时候会清理缓存中的数据

当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了新增、修改、删除操作后,默认该作用域下所有 select 中的缓存将被 clear。

相关文章:

Spring、SpringMVC、Mybatis

一.Spring基础 1.Spring 框架是什么 Spring 是一款开源的轻量级 Java 开发框架&#xff0c;我们一般说 Spring 框架指的都是 Spring Framework&#xff0c;它是很多模块的集合&#xff0c;例如&#xff0c;Spring core、Spring JDBC、Spring MVC 等&#xff0c;使用这些模块可…...

Kubernetes 架构

Kubernetes 架构 Kubernetes 最初源于谷歌内部的 Borg,提供了面向应用的容器集群部署和管理系统。Kubernetes 的目标旨在消除编排物理 / 虚拟计算,网络和存储基础设施的负担,并使应用程序运营商和开发人员完全将重点放在以容器为中心的原语上进行自助运营。Kubernetes 也提…...

python---数据类型(列表)

组织列表 使用sort()方法对列表永久性排序 按照字母顺序排序&#xff1a; motorcycles [chunlan, yamaha, dayun, jianshe]motorcycles.sort()print(motorcycles) 字母倒序&#xff1a; motorcycles [chunlan, yamaha, dayun, jianshe]motorcycles.sort(reverseTrue)pri…...

CentOS 7升级gcc/G++版本

Centos 7默认gcc版本为4.8&#xff0c;有时需要更高版本&#xff0c;只需要执行几条命令&#xff0c;无需下载源码编译编译。 安装centos-release-scl sudo yum install centos-release-scl 安装devtoolset sudo yum install devtoolset-8-gcc* 注意&#xff0c;如果想安装…...

uni-app开发微信公众号 H5打开扫一扫功能

<!--引入微信sdk--> <script src"http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>let url location.href.split(#)[0];newApi.getSignature({ url }).then(res > {if (res.code 0) {this.sdk.config({beta: true, // 必须这么写&a…...

k8s-服务网格实战-入门Istio

istio-01.png 背景 终于进入大家都比较感兴趣的服务网格系列了&#xff0c;在前面已经讲解了&#xff1a; 如何部署应用到 kubernetes服务之间如何调用如何通过域名访问我们的服务如何使用 kubernetes 自带的配置 ConfigMap 基本上已经够我们开发一般规模的 web 应用了&#xf…...

金属压铸件自动化3D全尺寸测量设备自动外观检测三维检测-CASAIM

铸造作为现代装备制造工业的基础共性技术之一&#xff0c;铸件产品既是工业制造产品&#xff0c;也是大型机械的重要组成部分&#xff0c;被广泛运用在航空航天、工业船舶、机械电子和交通运输等行业。 铸件形状复杂&#xff0c;一般的三坐标或者卡尺圆规等工具难以获取多特征…...

Android笔记(十):结合Navigation组件实现Compose界面的导航

在Android笔记&#xff08;七&#xff09;搭建Android JetPack Compose组件中Scaffold脚手架 一文中通过定义一个导航的函数来实现不同界面的切换。如果没有传递任何参数&#xff0c;这样的导航处理也是可以接受的&#xff0c;处理方式也非常简单。但是&#xff0c;如果考虑到不…...

linux内核tcp配置--断网后连接卡住

通过隐藏通信应用程序中的临时网络中断&#xff0c;TCP 可以在偶尔不可靠的网络上提供可靠的通信。在通知发件人任何问题之前&#xff0c;您的操作系统将多次重发丢失的消息。大多数 Linux 发行版默认将任何丢失的数据包重传 15 次。重新传输以指数方式回退&#xff0c;因此这 …...

Apache Pulsar 在腾讯云上的最佳实践

导语 由 StreamNative 主办的 Pulsar Meetup Beijing 2023 在2023年10月14日完美落幕&#xff0c;本次活动大咖云集&#xff0c;来自腾讯、滴滴、华为、智联招聘、RisingWave 和 StreamNative 的行业专家们一起&#xff0c;深入探讨 Pulsar 在生产环境中的最佳应用实践&#x…...

VMware 虚拟机安装 CentOS 7

CentOS 7 1. 下载CentOS 7 iso镜像 Index of /centos/7.9.2009/isos/x86_64/ 2. Vmware安装CentOS 7 安装教程&#xff1a; 超详细VMware CentOS7(最小安装)安装教程_虚拟机最小化安装-CSDN博客 【精选】VMware 安装 Centos7 详细过程_vm虚拟机安装centos7_expectation Fu…...

UnityAI——个体AI角色的操控行为脚本

注&#xff1a;本文用到了前文所用的基类UnityAI——操控行为编程的主要基类-CSDN博客 在一些游戏中&#xff0c;可能会遇到想让AI角色追逐或者避开玩家的情况。 如在飞机模拟游戏中&#xff0c;让导弹跟踪和进攻玩家或玩家的飞行器。这种情况下&#xff0c;可以运用本节介绍…...

ssh登录界面变成vim提示,进不去系统

是ubuntu系统 使用远程连接root&#xff0c;进去后发现界面变成vim编辑器的介绍界面了 使用普通用户登录 查询用户的登录shell是不是有问题 sudo vim /etc/passwd 发现用户shell变成了vim编辑器 修改为/bin/bash就可以正常登录了 重新登录测试就正常了...

虹科示波器 | 汽车免拆检修 | 2012 款上汽大众帕萨特车 发动机偶尔无法起动

一、故障现象 一辆2012款上汽大众帕萨特车&#xff0c;搭载CFB发动机&#xff0c;累计行驶里程约为12万km。车主反映&#xff0c;将点火开关置于起动挡&#xff0c;偶尔只能听到“咔哒”一声&#xff0c;起动机没有反应&#xff0c;类似蓄电池亏电时起动发动机的现象。为此&…...

UE5.0.3版本 像素流送 Pixel Streaming

目录 0 引言1 准备工作1.1 下载Node.js1.2 下载 PixelStreaming&#xff08;非必须&#xff09; 2 快速入门2.1 打包工程2.2 启动信令服务器2.3 启动工程2.4 打开网页 3 总结 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;UE虚幻引擎专栏&#x…...

BetterDisplay Pro v1.4.15(显示器管理管理软件)

BetterDisplay Pro是一款屏幕显示优化工具&#xff0c;可用于Windows和Mac操作系统。它可以帮助用户调整屏幕的亮度、对比度、色彩等参数&#xff0c;以获得更好的视觉体验。此外&#xff0c;BetterDisplay Pro还提供了一些额外的功能&#xff0c;如屏幕分割、窗口管理、快捷键…...

蓝桥等考C++组别四级006

第一部分&#xff1a;选择题 1、C L4 &#xff08;20分&#xff09; 以下选项中&#xff0c;不是逻辑运算符的选项是&#xff08; &#xff09;。 A.! B.|| C.&& D.< 正确答案&#xff1a;D 2、C L4 &#xff08;20分&#xff09; …...

app开发之后需要做什么

在完成app的开发之后&#xff0c;还有一系列的工作需要进行&#xff0c;以确保app的顺利上线和用户的良好体验。下面将从原理和详细介绍两个方面来介绍app开发之后需要做的工作。 一、原理介绍 1. 测试与调试&#xff1a;在app开发完成后&#xff0c;需要进行全面的测试与调试…...

某汽车金融企业:搭建SDLC安全体系,打造智慧金融服务样本

某汽车金融企业是国内头部汽车金融公司&#xff0c;已经为超过数百万名客户提供专业的汽车金融服务。该公司通过近几年的数字化创新&#xff0c;在提升客户体验、提高管理效率、降低经营成本等方面已具备很强的服务能力&#xff0c;让客户获得更方便、更快捷、更灵活的金融服务…...

iOS GCD(Grand Central Dispatch)

iOS 常用有三种线程管理方式&#xff0c;分别是 NSThread、GCD 与 NSOperation&#xff0c;现在我们先来了解一下其中的 GCD 串行与并行针对的是任务队列&#xff0c;而同步与异步&#xff0c;针对的则是线程。 Serial Queue Sync 序列执行同步 Serial Queue Async 序列执…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候&#xff0c;显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...

【R语言编程——数据调用】

这里写自定义目录标题 可用库及数据集外部数据导入方法查看数据集信息 在R语言中&#xff0c;有多个库支持调用内置数据集或外部数据&#xff0c;包括studentdata等教学或示例数据集。以下是常见的库和方法&#xff1a; 可用库及数据集 openintro库 该库包含多个教学数据集&a…...

项目研究:使用 LangGraph 构建智能客服代理

概述 本教程展示了如何使用 LangGraph 构建一个智能客服代理。LangGraph 是一个强大的工具&#xff0c;可用于构建复杂的语言模型工作流。该代理可以自动分类用户问题、分析情绪&#xff0c;并根据需要生成回应或升级处理。 背景动机 在当今节奏飞快的商业环境中&#xff0c…...

Three.js进阶之粒子系统(一)

一些特定模糊现象&#xff0c;经常使用粒子系统模拟&#xff0c;如火焰、爆炸等。Three.js提供了多种粒子系统&#xff0c;下面介绍粒子系统 一、Sprite粒子系统 使用场景&#xff1a;下雨、下雪、烟花 ce使用代码&#xff1a; var materialnew THRESS.SpriteMaterial();//…...

20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决

20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决 2025/6/7 17:20 缘起&#xff1a; 1、根据RK809的DATASHEET&#xff0c;短按开机【100ms/500ms】/长按关机&#xff0c;长按关机。6s/8s/10s 我在网上找到的DATASHE…...