Spring 框架是一个广泛使用的 Java 框架,它内部使用了多种设计模式来简化开发过程、提高代码的可维护性和扩展性。
以下是一些在 Spring 框架中常见的设计模式,以及用代码示例来解释它们:
一、工厂模式(Factory Pattern)
Spring 使用工厂模式来创建和管理对象。例如,BeanFactory 是一个接口,定义了获取不同类型 bean 的方法。
// 示例代码(非实际 Spring 代码)
public interface BeanFactory { <T> T getBean(Class<T> requiredType);
} // 实现类
public class DefaultListableBeanFactory implements BeanFactory { // ... 实现细节 ... @Override public <T> T getBean(Class<T> requiredType) { // 查找并返回 bean 实例 return (T) findBean(requiredType); } private Object findBean(Class<?> requiredType) { // 实现细节... return null; // 示例返回 null }
}
二、单例模式(Singleton Pattern)
Spring 容器中的 bean 默认是单例的。这确保了每个 bean 在容器中只有一个实例。
// Spring 配置文件中定义 bean 为单例
<bean id="myBean" class="com.example.MyBean" scope="singleton" /> // MyBean 类不需要任何特殊的单例模式实现
public class MyBean { // ...
}
三、原型模式(Prototype Pattern)
虽然默认是单例,但 Spring 也支持原型模式,允许每次请求时都创建一个新的 bean 实例。
// Spring 配置文件中定义 bean 为原型
<bean id="myPrototypeBean" class="com.example.MyPrototypeBean" scope="prototype" /> // MyPrototypeBean 类不需要任何特殊的原型模式实现
public class MyPrototypeBean { // ...
}
四、代理模式(Proxy Pattern)
Spring AOP 使用了代理模式来创建代理对象,这些对象可以在方法调用前后执行额外的逻辑(如事务管理、日志记录等)。
// 使用 AspectJ 或 JDK 动态代理实现的示例
@Aspect
@Component
public class LoggingAspect { @Before("execution(* com.example.*.*(..))") public void logBefore(JoinPoint joinPoint) { System.out.println("Method " + joinPoint.getSignature() + " is called."); } // ... 其他通知 ...
}
五、模板方法模式(Template Method Pattern)
Spring 的 JdbcTemplate、JmsTemplate 等模板类就是模板方法模式的体现。它们定义了操作资源(如数据库、JMS 队列)的通用步骤,而将特定于应用的逻辑留给子类或回调方法来实现。
// 示例代码(非实际 Spring JdbcTemplate)
public class CustomJdbcTemplate { public List<Map<String, Object>> query(String sql, RowMapper<Map<String, Object>> rowMapper) { // 模板方法:打开连接、执行查询、关闭连接等 // ... // 调用回调方法处理结果集 List<Map<String, Object>> results = new ArrayList<>(); while (resultSet.next()) { results.add(rowMapper.mapRow(resultSet, rowNum++)); } // ... return results; }
}
六、观察者模式(Observer Pattern)
Spring 的事件驱动模型使用了观察者模式。当某个事件发生时,所有注册的观察者都会收到通知。
// 定义一个事件
public class MyEvent extends ApplicationEvent { // ...
} // 定义一个监听器(观察者)
@Component
public class MyEventListener implements ApplicationListener<MyEvent> { @Override public void onApplicationEvent(MyEvent event) { // 处理事件 }
} // 在某处发布事件
applicationContext.publishEvent(new MyEvent(/*...*/));