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 原理如下图所示:
流程说明(重要):
-
客户端(浏览器)发送请求,DispatcherServlet 拦截请求。
-
DispatcherServlet 根据请求信息调用 HandlerMapping。HandlerMapping 根据 URL 去匹配查找能处理的 Handler(也就是我们平常说的 Controller 控制器),并会将请求涉及到的拦截器和 Handler 一起封装。
-
DispatcherServlet 调用 HandlerAdapter 适配器执行 Handler 。
-
Handler 完成对用户请求的处理后,会返回一个 ModelAndView 对象给 DispatcherServlet ,ModelAndView 顾名思义,包含了数据模型以及相应的视图的信息。Model 是返回的数据对象,View 是个逻辑上的 View。
-
ViewResolver 会根据逻辑 View 查找实际的 View。
-
DispatcherServlet 把返回的 Model 传给 View(视图渲染)。
-
把 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 的执行流程
-
读取 MyBatis 核心配置文件(mybatis-config.xml),加载运行环境和映射文件
-
构造会话工厂 SqlSessionFactory,一个项目只需要一个,单例的,一般由 spring 进行管理
-
会话工厂创建 SqlSession 对象,这里面就包含了执行 SQL 语句的所有方法
-
每一个 SqlSession 都会拥有一个 Executor 对象,通过 Executor 对象操作数据库的接口执行 SQL,同时负责查询缓存的维护
-
Executor 接口的执行方法中有一个 MappedStatement 类型的参数,封装了映射信息
-
最后关闭 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 开发框架,我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,例如,Spring core、Spring JDBC、Spring MVC 等,使用这些模块可…...

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

python---数据类型(列表)
组织列表 使用sort()方法对列表永久性排序 按照字母顺序排序: motorcycles [chunlan, yamaha, dayun, jianshe]motorcycles.sort()print(motorcycles) 字母倒序: motorcycles [chunlan, yamaha, dayun, jianshe]motorcycles.sort(reverseTrue)pri…...

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

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 背景 终于进入大家都比较感兴趣的服务网格系列了,在前面已经讲解了: 如何部署应用到 kubernetes服务之间如何调用如何通过域名访问我们的服务如何使用 kubernetes 自带的配置 ConfigMap 基本上已经够我们开发一般规模的 web 应用了…...

金属压铸件自动化3D全尺寸测量设备自动外观检测三维检测-CASAIM
铸造作为现代装备制造工业的基础共性技术之一,铸件产品既是工业制造产品,也是大型机械的重要组成部分,被广泛运用在航空航天、工业船舶、机械电子和交通运输等行业。 铸件形状复杂,一般的三坐标或者卡尺圆规等工具难以获取多特征…...

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

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

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

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

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

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

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

UE5.0.3版本 像素流送 Pixel Streaming
目录 0 引言1 准备工作1.1 下载Node.js1.2 下载 PixelStreaming(非必须) 2 快速入门2.1 打包工程2.2 启动信令服务器2.3 启动工程2.4 打开网页 3 总结 🙋♂️ 作者:海码007📜 专栏:UE虚幻引擎专栏&#x…...

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

蓝桥等考C++组别四级006
第一部分:选择题 1、C L4 (20分) 以下选项中,不是逻辑运算符的选项是( )。 A.! B.|| C.&& D.< 正确答案:D 2、C L4 (20分) …...

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

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

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

Cross-Entropy Loss(多分类损失函数)
文章目录 1. 网络输出output:score2. Cross-Entropy Loss(多分类损失函数) 1. 网络输出output:score 2. Cross-Entropy Loss(多分类损失函数) 先用softmax function把score 变成 probabilities。再用交叉熵损失函数来进行Loss的计算...

TP858 3BSE018138R1 具有高性能CPU的工业PC技术
TP858 3BSE018138R1 具有高性能CPU的工业PC技术 为了充分利用新电脑的扩展图形功能,如DirectX,Beckhoff Automation重新设计了TwinCAT automation软件套件中的Scope工具。这为TwinCAT用户在灵活的软件环境中提供了一系列令人印象深刻的测量技术。改进的…...

Observability:使用 OpenTelemetry 手动检测 .NET 应用程序
作者:David Hope 在快节奏的软件开发领域,尤其是在云原生领域,DevOps 和 SRE 团队日益成为应用程序稳定性和增长的重要合作伙伴。 DevOps 工程师不断优化软件交付,而 SRE 团队则充当应用程序可靠性、可扩展性和顶级性能的管理者。…...

生产事故:redis主从的坑
一、问题 昨天生产redis缩容,3主3从模式,重启了服务器,重启了redis; 结果今天发现生产服务报错了,连接不上redis。 排查发现,由于生产后台只配置了一个redis的ip,本来是主redis的ip的&#x…...

maven本地仓库有依赖包,还会远程下载的问题
maven本地仓库有依赖包,还会远程下载的问题 传送门...

动作捕捉系统处理单点多点丢点问题
在动作捕捉数据采集过程中,丢点是经常容易遇到的问题。NOKOV度量动作捕捉软件可以方便地解决丢点问题。 一、单点丢点的处理 如下图,已经采集了动捕数据。 查看是否有丢点,在形影软件左上角选择“窗口分割”,在下方分割出一个空…...

FIFO 位宽转换
从8位转32位 module tb_fifo();reg clk,rst; initial beginclk0;forever #4.545 clk~clk; end initial beginrst1;#9.09 rst0; endreg [31:0] cnts; always (posedge clk or posedge rst) beginif(rst)begincnts < 32d0;endelsebegincnts < cnts 1b1;end endreg […...

瑞明达:聚“追梦”之力,共圆“经济梦”
矢志不渝,笃行不怠,争当“一心一意同国行”的无悔“追梦人”。过往几年,国际形势风高浪急,国内环境复杂多变,在后疫情时代、经济恢复压力等多种超预期的因素冲击下,瑞明达团队全面贯彻落实国家发展政策&…...

UE5数字孪生制作(一) - QGIS 学习笔记
1.下载 QGIS是免费的GIS工具,下载地址: https://www.qgis.org/en/site/ 2.安装 - 转中文 按照步骤安装,完成后,在菜单 设置settings里,选择options,修改语言 确定后,需要重启下软件 3.学习视…...

STM32 使用HAL库,HAL_Delay()会卡死, 程序一直卡在 HAL_GetTick( ) 函数中(已解决)
今天遇到个很奇怪的问题, 不知道为什么, 单片机运行一会之后, 系统就没反应了, 经过调试发现, 系统卡在HAL_Delay()中了. 之前也遇到过这个问题后来把HAL_Delay 去掉了. 然后发现不行, 还是得有它.不然发串口数据发的太快会乱掉. 得慢点发. 然后调试到HAL_Delay()方法的内部发…...