跳转至

Spring 用到了哪些设计模式?

结论速查

设计模式 在 Spring 中的应用
工厂方法 / 简单工厂 BeanFactoryApplicationContext
单例 Bean 默认 singleton 作用域
代理 AOP(JDK / CGLIB)
模板方法 JdbcTemplateRestTemplateRedisTemplate
观察者 ApplicationEvent / ApplicationListener
适配器 HandlerAdapterAdvisorAdapter
装饰器 BeanWrapper、各种 Wrapper
责任链 FilterInterceptorBeanPostProcessor
策略 Resource 接口、InstantiationStrategy
外观 ApplicationContext 封装资源访问
建造者 BeanDefinitionBuilderUriComponentsBuilder
迭代器 Iterator 在集合中的使用

重点展开

1. 工厂模式

Spring 本质是个大工厂

BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
User user = (User) factory.getBean("user");

BeanFactory 是顶层接口,ApplicationContext 是它的增强版。

2. 单例模式

Spring Bean 默认 singleton,但它是容器管理的单例,不是 GoF 那种饿汉/懒汉单例。每个 BeanDefinition 在容器中只有一个共享实例。

3. 代理模式(AOP)

Spring AOP 面试题

4. 模板方法

JdbcTemplate 把"获取连接、创建语句、执行、遍历结果、关闭"流程固定,把"SQL、参数、行映射"留给子类:

List<User> users = jdbcTemplate.query(
    "SELECT * FROM user WHERE id = ?",
    new BeanPropertyRowMapper<>(User.class),
    1
);

5. 观察者模式

// 事件
public class OrderCreatedEvent extends ApplicationEvent { ... }

// 发布
applicationEventPublisher.publishEvent(new OrderCreatedEvent(this, order));

// 监听
@EventListener
public void onOrderCreated(OrderCreatedEvent event) { ... }

6. 适配器模式

HandlerAdapter 把不同类型的 Controller(Controller 接口、@RequestMapping 注解方法、HttpRequestHandler)统一成 handle() 调用。

7. 责任链

  • BeanPostProcessor:在 Bean 初始化前后插入处理。
  • BeanFactoryPostProcessor:在 BeanDefinition 加载后处理。
  • Spring Security 的 FilterChain。

8. 策略模式

Resource 接口有 ClassPathResourceFileSystemResourceUrlResource 等不同实现,根据配置选择。

面试加分

  • Spring 用了大量后置处理器BeanPostProcessor),这是它扩展点的核心。
  • 单例 Bean 的线程安全问题:有状态 Bean(如成员变量)在 singleton 下多线程共享,要小心。