源本科技 | 码上会

企业社招真题 Spring 模式相关

2026/04/05
1
0

Java 常用设计模式及实际应用

Java 常用设计模式分三大类,是框架和业务开发的核心思想。创建型:单例模式(Spring Bean 默认单例)、工厂模式(MyBatis 创建 SqlSession),负责对象创建。结构型:代理模式(Spring AOP)、装饰器模式(IO 流包装),优化结构关系。行为型:策略模式(支付方式选择)、模板方法(Spring JdbcTemplate)、观察者模式(事件监听)。这些模式能让代码解耦、易扩展、可维护,是大厂开发的必备规范,框架底层几乎都基于设计模式实现,理解后能大幅提升代码质量。

解决并发问题的常用设计模式

针对并发安全、性能问题,有专用设计模式。生产者 - 消费者模式,用阻塞队列解耦生产消费,削峰填谷,避免线程阻塞。不可变对象模式,对象不可修改,天然线程安全,无锁开销。ThreadLocal 模式,线程数据隔离,避免共享变量竞争。享元模式,复用对象,减少创建开销。同步模式,加锁保证原子性。还有线程池模式,复用线程,降低创建销毁开销。这些模式从无锁、隔离、复用、解耦角度,解决并发安全、性能、死锁问题,是高并发开发的核心方案。

AOP(面向切面编程)模型及作用

AOP 是面向切面编程,是 OOP 的补充,核心是横向抽取通用逻辑,不侵入业务代码。核心模型包含:切面(通用逻辑模块)、通知(执行时机:前置 / 后置 / 异常)、切点(匹配方法规则)、连接点(方法执行点)。底层基于 JDK 动态代理 /CGLIB 实现,在方法执行前后织入逻辑。作用是统一处理日志、事务、权限校验、性能监控,让业务代码只关注核心逻辑,实现代码解耦、复用,是 Spring 框架的核心特性,大幅简化企业级开发。

依赖注入(DI)的好处

依赖注入是 Spring 核心,由容器自动注入依赖对象,替代手动 new 创建。最大好处是彻底解耦,对象间不直接依赖,修改实现类不用改调用方代码。实现控制反转,对象创建权交给容器,开发者专注业务。提升可测试性,单元测试可注入模拟对象。配置灵活,通过注解 / 配置文件切换依赖。降低代码冗余,不用手动管理对象生命周期。DI 让代码模块化、可扩展,是企业级应用松耦合、易维护的关键。

Spring Bean 生命周期

Spring Bean 生命周期是从创建到销毁的完整过程,分四步:实例化,容器通过反射创建 Bean 对象;属性填充,自动注入依赖的 Bean 和配置属性;初始化,执行 Aware 接口、后置处理器、初始化方法;使用,业务调用 Bean;销毁,容器关闭时执行销毁方法。全程由 Spring 容器管理,配合 BeanPostProcessor 可在生命周期节点做增强。生命周期让 Bean 的创建、依赖、初始化、销毁标准化,支持单例、多例等作用域,是 Spring 依赖注入、AOP 的基础。

Spring MVC 工作流程

Spring MVC 是 Web 开发框架,基于 MVC 模式,流程清晰。客户端发送请求,先到中央调度器 DispatcherServlet;它请求处理器映射器,找到对应控制器 Controller;调用处理器适配器执行 Controller 方法;Controller 处理业务,返回 ModelAndView;调度器交给视图解析器,解析为具体视图;最后渲染视图,响应给客户端。全程解耦,请求、处理、渲染分离,适配多种视图技术,是 Java Web 开发的标准流程,简化请求映射、参数绑定、结果响应等操作。

MVC 模式的重要性

MVC 是分层架构模式,分模型(Model)、视图(View)、控制器(Controller),核心是职责分离、解耦。模型处理数据和业务,视图负责展示,控制器调度请求。它让代码结构清晰,各层独立开发、测试、维护,互不影响。支持前后端分离,视图可灵活替换。便于团队协作,后端专注业务,前端专注展示。提升代码可扩展性,修改一层不影响其他层。是 Web 开发的基础架构,所有主流框架都基于 MVC,是大型项目必备的设计思想。

不可变类的设计方式

不可变类对象创建后不可修改,天然线程安全,设计有固定规范。类用 final 修饰,禁止继承;成员变量用 private final 修饰,禁止修改;不提供任何 setter 方法;构造器初始化所有成员,对引用类型做深拷贝;重写 equals 和 hashCode,保证一致性;只提供 getter 方法,返回引用类型时也做拷贝。String、Integer 都是不可变类,设计后无锁并发安全,避免共享变量修改导致的线程问题,是高并发下推荐的对象设计方式。

对象浅拷贝与深拷贝的实现

浅拷贝只复制对象基本类型,引用类型复制地址,原对象和拷贝对象共享引用对象,修改会互相影响,实现简单,实现 Cloneable 接口重写 clone 即可。深拷贝复制整个对象树,基本类型和引用类型都完全复制,彼此独立,无关联。实现方式:重写 clone 做深拷贝、序列化反序列化(Serializable)、工具类(BeanUtils)。浅拷贝适合无引用类型的对象,深拷贝适合复杂对象,保证数据独立,开发中根据对象结构选择,避免数据污染。