Spring 学习记录
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") 改为每次获取新建。
模板模式
JdbcTemplate、RestTemplate、RedisTemplate 等将固定流程(获取连接、执行、异常转换、释放资源)封装在模板方法中,业务只需传入回调或参数。
jdbcTemplate.query("SELECT * FROM user WHERE id = ?", rowMapper, id);
观察者模式
Spring 事件机制是观察者模式的典型应用:ApplicationEventPublisher 发布事件, @EventListener 或 ApplicationListener 接收通知。
// 发布
publisher.publishEvent(new OrderCreatedEvent(order));
// 监听
@EventListener
public void onOrderCreated(OrderCreatedEvent event) { ... }
适配器模式
- Spring MVC 的
HandlerAdapter适配不同类型的 Controller(注解式、实现接口式等) - AOP 的
AdvisorAdapter将 Advice 适配到拦截器链
策略模式
Resource 接口的不同实现(ClassPathResource、FileSystemResource、UrlResource)根据资源来源选择不同加载策略,调用方统一通过 Resource 接口访问。