Spring 核心容器通过 IoC(控制反转)和 DI(依赖注入)管理 Bean 生命周期,AOP 提供横切能力。以下整理 Spring 源码和实践中常见的几种设计模式。

工厂模式

Spring 容器本质是一个大工厂,通过 BeanFactory / ApplicationContext 创建和管理 Bean。

ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = ctx.getBean(UserService.class);

getBean() 就是典型的工厂方法:调用方不关心具体实例化过程。

代理模式

Spring AOP 基于代理实现。有接口时用 JDK 动态代理,无接口时用 CGLIB 子类代理。

@Transactional
public void transfer(Long from, Long to, BigDecimal amount) {
// 事务、日志等横切逻辑由代理层织入
}

单例模式

Spring 中 Bean 默认是单例(Singleton),容器内同一 id 只创建一个实例,减少对象创建开销。可通过 @Scope("prototype") 改为每次获取新建。

模板模式

JdbcTemplateRestTemplateRedisTemplate 等将固定流程(获取连接、执行、异常转换、释放资源)封装在模板方法中,业务只需传入回调或参数。

jdbcTemplate.query("SELECT * FROM user WHERE id = ?", rowMapper, id);

观察者模式

Spring 事件机制是观察者模式的典型应用:ApplicationEventPublisher 发布事件, @EventListenerApplicationListener 接收通知。

// 发布
publisher.publishEvent(new OrderCreatedEvent(order));
// 监听
@EventListener
public void onOrderCreated(OrderCreatedEvent event) { ... }

适配器模式

  • Spring MVC 的 HandlerAdapter 适配不同类型的 Controller(注解式、实现接口式等)
  • AOP 的 AdvisorAdapter 将 Advice 适配到拦截器链

策略模式

Resource 接口的不同实现(ClassPathResourceFileSystemResourceUrlResource)根据资源来源选择不同加载策略,调用方统一通过 Resource 接口访问。