一、Spring 框架
-
七大核心模块功能:
- Core Container:提供依赖注入(DI)和控制反转(IOC)功能,管理对象的创建和生命周期。BeanFactory 和 ApplicationContext 是核心容器的实现,前者提供基础的对象创建和获取功能,后者在其基础上增加了更多高级特性。
- AOP:实现面向切面编程,将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高代码的模块化和可维护性。
- Data Access/Integration:支持多种数据访问技术,包括 JDBC、ORM(如 Hibernate、MyBatis)、OXM(对象与 XML 映射)和 JMS(Java 消息服务)等,方便与不同的数据存储进行交互。
- Web:用于构建 Web 应用,包括 Spring MVC(基于 MVC 模式的 Web 框架)和 WebSocket(支持全双工通信)等功能。
- Spring Security:提供身份验证和授权功能,保护 Web 应用的安全。
- Messaging:构建在消息传递基础之上,提供消息通道和消息处理器等组件,实现应用内和应用间的异步消息传递。
- Test:提供用于测试 Spring 应用的工具和注解,方便进行单元测试和集成测试。
-
低侵入式设计:Spring 对应用代码的影响较小,通过配置(如 XML 配置或注解)来管理对象的创建和依赖注入,原有的类不需要继承特定的 Spring 基类或实现特定的接口,便于将现有代码集成到 Spring 环境中,也便于在不使用 Spring 时迁移代码。
-
IOC 功能与理解:负责对象创建、依赖注入和生命周期管理。Spring IOC 容器像一个 “对象工厂”,根据配置决定创建什么样的对象以及如何创建,并自动将被依赖的对象注入到依赖的对象中,使开发者只需要告诉容器需要哪些对象,而不需要关心对象的创建和依赖关系的细节。
-
实现 DI 的方式:构造函数注入、Setter 方法注入和字段注入。构造函数注入在对象创建时保证依赖的完整性;Setter 方法注入使对象的创建和依赖注入过程相对灵活;字段注入简洁但不利于单元测试和代码的封装性。
-
DI 注入实现单例变多例及管理:在 Spring 配置中改变 Bean 的作用域从默认的单例(singleton)改为多例(prototype)即可实现单例变多例。这个过程中对象的创建和管理依然由 Spring 容器负责,当请求一个多例 Bean 时,Spring 容器会每次创建一个新的实例,并根据配置和 Bean 的特性进行生命周期管理。
-
OOP 和 AOP 的区别:
- OOP:以对象为基本单位,通过封装、继承和多态等特性构建软件系统,关注对象的行为和状态,通过对象之间的交互实现系统功能。
- AOP:关注横切关注点,如日志记录、事务管理等,将这些功能从业务逻辑中分离出来,形成独立的切面,通过织入的方式将切面应用到目标对象的连接点上,提高代码的模块化和可维护性。
-
Spring 通过 AOP 实现的功能及使用:
- 实现的功能:日志记录、事务管理、性能监控、安全检查等。
- 使用方式:定义切面类,使用
@Aspect
注解标识;定义切点,通过切点表达式确定在哪些方法上应用切面;定义通知,在切面类中定义通知方法,即在切点所匹配的方法执行的特定时刻执行的代码;配置 AOP,将切面类配置到 Spring 容器中,可以通过 XML 配置或者在配置类中使用@EnableAspectJAutoProxy
注解启用 AOP 功能。
-
AOP 实现用到的设计模式及实现方式:
- 用到的设计模式:代理模式。代理对象代替目标对象接收外部请求,在代理对象中添加切面逻辑,然后将请求转发给目标对象。
- 实现方式:JDK 动态代理和 CGLIB 代理。JDK 动态代理适用于目标对象实现了接口的情况,通过
java.lang.reflect.Proxy
类创建代理对象;CGLIB 代理适用于目标对象没有实现接口的情况,通过继承目标对象的类创建代理对象。
-
连接点、切面、切点、通知、目标对象、织入、引入的理解:
- 连接点:程序执行过程中的特定位置,如方法调用、对象创建、属性访问等。
- 切面:对横切关注点进行模块化的抽象,包含切点和通知。
- 切点:精确地定义哪些连接点会被切面所影响,是一个表达式或者条件。
- 通知:在切点所定义的连接点上执行的具体逻辑,如在方法调用前记录日志、在方法执行后提交事务等。
- 目标对象:被切面所作用的实际对象。
- 织入:将切面应用到目标对象的过程,即在合适的时机将通知插入到目标对象的执行流程中。
- 引入:在不改变目标对象原有类结构的情况下,通过 AOP 的手段为目标对象添加新的属性或行为。
-
Spring 实现事务的方式及与以往的区别:
- 实现方式:编程式事务和声明式事务。编程式事务通过编写代码显式地控制事务的开启、提交、回滚等操作;声明式事务通过配置(如 XML 配置文件或注解)来声明哪些方法或类需要进行事务管理,Spring 会自动处理事务的开启、提交、回滚等操作。
- 与以往的区别:在没有 Spring 时,事务管理通常需要在业务逻辑代码中大量编写与事务相关的代码,使得业务逻辑代码和事务管理代码混在一起,代码的可维护性和复用性较差。Spring 通过提供编程式事务和声明式事务两种方式,使事务管理可以更加方便地从业务逻辑中分离出来,提高了代码的可维护性和复用性。
-
事务的传播机制:包括 REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER 等。不同的传播机制决定了在不同的事务环境下,事务的创建和参与方式。
-
Spring 框架中用到的设计模式:工厂模式、单例模式、代理模式、模板模式、观察者模式等。这些设计模式使得 Spring 框架更加灵活、可扩展和易于维护。
二、Spring MVC
-
MVC 技术:Model-View-Controller 设计模式,将应用程序分为模型(负责处理数据的存储、获取和业务逻辑的处理)、视图(负责将模型处理的数据以用户可接受的形式展示出来)和控制器(负责接收 HTTP 请求并处理,将请求转发到相应的模型进行业务逻辑处理,然后选择合适的视图进行结果展示)三个部分。
-
执行流程:客户端发送 HTTP 请求,请求被 DispatcherServlet 接收。DispatcherServlet 根据请求的 URL 查找相应的 HandlerMapping,HandlerMapping 根据请求找到对应的控制器(Controller)。Controller 处理请求,调用相应的业务逻辑,返回 ModelAndView 对象。DispatcherServlet 根据 ModelAndView 对象选择合适的视图解析器(ViewResolver),视图解析器将逻辑视图名解析为实际的视图对象。最后,视图对象将模型数据渲染成 HTML 或其他格式的响应内容,返回给客户端。
-
封装的 Apache fileupload 功能:用于处理文件上传请求。它提供了方便的 API 来处理文件上传操作,包括文件的接收、存储和验证等功能。
-
过滤器、监听器、拦截器的区别:
- 过滤器(Filter):是 Servlet 规范中的一部分,主要用于对请求和响应进行预处理和后处理,可以实现如字符编码转换、日志记录、权限验证等功能。过滤器是在 Servlet 容器级别工作的,它可以对所有的请求进行过滤,与具体的 Servlet 或 Spring MVC 的控制器无关。
- 监听器(Listener):用于监听 Servlet 上下文(ServletContext)、HTTP 会话(HttpSession)和 Servlet 请求(ServletRequest)等对象的生命周期事件,如上下文的初始化和销毁、会话的创建和销毁、请求的开始和结束等。监听器可以在这些事件发生时执行相应的操作,如初始化资源、清理资源等。
- 拦截器(Interceptor):是 Spring MVC 中的一个概念,主要用于对控制器方法的调用进行拦截。可以在方法调用前和调用后执行一些预处理和后处理操作,如日志记录、权限验证、性能监控等。拦截器可以根据需要选择性地拦截特定的请求,并且可以与 Spring 的 AOP 功能结合使用。
-
全局异常处理:
- 为什么要进行全局异常处理:在项目中进行全局异常处理可以提高系统的稳定性和可维护性。如果没有全局异常处理,当出现异常时,可能会导致不友好的错误信息返回给用户,或者系统出现不可预知的行为。通过全局异常处理,可以统一处理各种异常情况,返回友好的错误信息给用户,同时可以记录异常日志,方便开发人员进行故障排查。
- Spring 进行全局异常处理的方式:可以使用 @ControllerAdvice 和 @ExceptionHandler 注解来实现全局异常处理。在一个类上使用 @ControllerAdvice 注解,表示这个类是一个全局的控制器增强类。在这个类中,可以定义多个方法,每个方法使用 @ExceptionHandler 注解来处理特定类型的异常。当控制器方法抛出被 @ExceptionHandler 注解的方法所处理的异常时,Spring 会自动调用相应的方法进行处理。
三、MyBatis 和 MyBatis Plus
-
MyBatis 知识点:
- 核心组件:SqlSessionFactory(用于创建 SqlSession 的工厂类)、SqlSession(代表与数据库交互的会话)、Mapper 接口和 XML 映射文件(定义 SQL 语句和结果映射规则)。
- SQL 映射:包括简单查询(select)、插入(insert)、更新(update)和删除(delete)操作。可以使用动态 SQL 根据条件进行查询。
- 参数传递和结果映射:可以通过多种方式传递参数,包括基本数据类型、集合数据类型和 POJO 类型。结果映射用于将查询结果映射到 Java 对象中,可以定义数据库列与 Java 对象属性之间的对应关系。
- 缓存机制:一级缓存是 SqlSession 级别的缓存,二级缓存是 Mapper 级别的缓存。可以提高数据库查询的性能,但需要注意缓存的一致性问题。
- 与 Spring 集成:可以通过配置
SqlSessionFactoryBean
和MapperScannerConfigurer
在 Spring 应用中使用 MyBatis 进行数据访问。
-
MyBatis Plus 知识点:
- 快速入门:引入依赖、配置、创建实体类和 Mapper 接口。
- CRUD 操作:插入、查询、更新和删除数据。
- 分页查询:使用 Page 对象进行分页查询,获取分页结果。
- 条件构造器(Wrapper):QueryWrapper、UpdateWrapper、LambdaQueryWrapper 和 LambdaUpdateWrapper 用于构建查询和更新条件。
- 代码生成器:根据数据库表结构自动生成实体类、Mapper 接口、Service 层和 Controller 层的代码。
- 逻辑删除:在实体类中添加逻辑删除字段,配置 MyBatis Plus 的逻辑删除,实现软删除功能。
- 乐观锁:在实体类中添加乐观锁字段,在更新操作时自动检查版本号,确保数据的一致性。
- 自动填充:使用 MyBatis Plus 的自动填充功能自动设置某些字段的值,如创建时间和更新时间。
- BaseMapper 提供的通用方法:提供了很多通用的数据库操作方法,如 selectById、selectList、insert、updateById、deleteById 等。
- 性能优化:合理使用缓存、优化 SQL 语句、使用分页查询等。
- 与 Spring Boot 集成:在 Spring Boot 项目中方便地集成 MyBatis Plus,提高开发效率。
四、Nginx
-
主要功能:
- Web 服务器:可以作为独立的 Web 服务器托管静态和动态内容,支持多种协议。
- 反向代理:接收来自客户端的请求,并将请求转发到后端的服务器集群,隐藏后端服务器的真实 IP 地址,提高安全性,实现负载均衡。
- 负载均衡:将客户端请求分发到多个后端服务器上,实现高可用性和扩展性,支持多种负载均衡算法。
-
优势特点:
- 高性能:采用事件驱动的异步非阻塞架构,能够处理大量并发连接,占用资源较少。
- 稳定性和可靠性:具有高度的稳定性和可靠性,能够自动检测和处理后端服务器的故障。
- 配置简单灵活:配置文件采用简洁明了的语法,易于理解和修改,支持动态配置。
- 安全性高:提供多种安全功能,如访问控制、SSL/TLS 加密、IP 过滤等。
-
应用场景:
- Web 应用部署:作为前端服务器与应用服务器配合使用,提高 Web 应用的性能、可用性和扩展性。
- 微服务架构:作为服务网关,负责接收外部请求,并将请求转发到内部的微服务实例上,实现微服务的动态发现和负载均衡。
- 高并发场景:有效地处理大量的并发连接,提高系统的性能和稳定性。
- CDN 加速:作为 CDN 的边缘节点,缓存静态资源和热点数据,提高用户访问速度。