Spring 在设计和实现过程中大量使用了设计模式,这些设计模式不仅提升了 Spring 的灵活性和可扩展性,还为开发者提供了更高效、更优雅的编程方式。以下是 Spring 框架中使用的一些常见设计模式:
1. 单例模式(Singleton Pattern)
-
定义:确保一个类只有一个实例,并提供全局访问点。
-
Spring 应用:
-
Spring 默认将 Bean 的作用域设置为单例(
singleton
),由 IOC容器管理生命周期。
-
-
示例:
@Service // 默认就是单例 public class OrderService {// 业务逻辑 }
2. 工厂模式(Factory Pattern)
-
定义:通过工厂类封装对象的创建逻辑,解耦客户端与具体实现。
-
Spring 应用:
-
BeanFactory
和ApplicationContext
是核心工厂,负责创建和管理 Bean。 -
FactoryBean
接口允许自定义复杂对象的创建逻辑(如 MyBatis 的SqlSessionFactoryBean
)。
-
-
优点:将对象的创建和使用分离,降低了耦合度。
-
示例:
// BeanFactory 是一个工厂接口 BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("applicationContext.xml")); SingletonBean singletonBean = beanFactory.getBean(SingletonBean.class);
3. 代理模式(Proxy Pattern)
-
定义:通过代理对象控制对真实对象的访问。
-
Spring 应用:
-
接口代理:使用JDK动态代理(基于接口)
-
类代理:使用CGLIB字节码生成
-
-
应用场景:
-
AOP切面编程
-
声明式事务管理
-
@Async
异步方法
-
-
示例:
@Transactional // 通过代理实现事务管理 public void placeOrder(Order order) {// 业务逻辑 }
4. 模板方法模式(Template Method Pattern)
-
定义:定义算法骨架,将某些步骤延迟到子类实现
-
Spring 应用:
-
JdbcTemplate
、RestTemplate
等模板类封装了资源管理(如连接、异常处理),用户只需实现回调。
-
-
示例:
public class JdbcTemplateExample {@Autowiredprivate JdbcTemplate jdbcTemplate;public List<String> getNames() {return jdbcTemplate.query("SELECT name FROM users",(rs, rowNum) -> rs.getString("name"));} }
5. 适配器模式(Adapter Pattern)
-
定义:将一个类的接口转换成客户希望的另一个接口。
-
在 Spring 中的应用:
-
HandlerAdapter:适配不同风格的控制器(如Servlet、注解式控制器)
-
AOP中的适配器:将各种Advice适配为MethodInterceptor
-
安全配置适配器
-
-
示例:
// 将一个普通POJO适配为Spring MVC控制器 @Controller public class SimpleController {@RequestMapping("/hello")public String hello() {return "greeting";} }
6. 观察者模式(Observer Pattern)
-
定义:对象间一种一对多的依赖关系,当一个对象状态改变时,所有依赖于它的对象都会得到通知并自动更新。
-
在 Spring 中的应用:
-
事件驱动模型:通过
ApplicationEvent
(事件)和ApplicationListener
(监听器)实现。如ContextRefreshedEvent
(容器刷新完成事件)。
-
-
示例:
// 定义事件 public class CustomEvent extends ApplicationEvent {public CustomEvent(Object source) {super(source);} }// 监听事件 @Component public class CustomEventListener implements ApplicationListener<CustomEvent> {@Overridepublic void onApplicationEvent(CustomEvent event) {// 处理事件} }// 发布事件 applicationContext.publishEvent(new CustomEvent(this));
7. 策略模式(Strategy Pattern)
-
定义:定义一系列的算法,把它们一个个封装起来,并使它们可互换。
-
在 Spring 中的应用:
-
资源加载:
Resource
接口的不同实现(ClassPathResource
、UrlResource
)。 -
事务管理:支持多种事务策略(JDBC、JTA)
-
-
示例:
Resource resource = new ClassPathResource("applicationContext.xml"); Resource resource2 = new FileSystemResource("/conf/applicationContext.xml");
8. 装饰器模式(Decorator Pattern)
-
定义:动态地给一个对象添加额外的职责。
-
在 Spring 中的应用:
HttpServletRequestWrapper
装饰HTTP请求。 -
示例:
public class CustomRequestWrapper extends HttpServletRequestWrapper {public CustomRequestWrapper(HttpServletRequest request) {super(request);}@Overridepublic String getParameter(String name) {// 装饰原始方法String value = super.getParameter(name);return value != null ? value.toUpperCase() : null;} }
9. 责任链模式 (Chain of Responsibility Pattern)
-
定义:允许将请求沿着处理链传递,直到有一个处理者能够处理它为止。该模式通过为多个处理者提供处理请求的机会,从而解耦请求的发送者和接收者。
-
在 Spring 中的应用:
-
Spring Security的过滤器链
-
Spring MVC的拦截器链
-
-
示例:
public class SecurityFilterChain {private List<Filter> filters;public void doFilter(ServletRequest request, ServletResponse response) {// 依次调用过滤器} }
10. 组合模式(Composite Pattern)
-
定义:将对象组合成树形结构以表示“部分-整体”的层次结构。
-
在 Spring 中的应用:
-
Spring表达式语言(SpEL)中的表达式组合
-
CompositeCacheManager
组合多个缓存管理器
-
-
示例:
public class CompositeCacheManager implements CacheManager {private List<CacheManager> cacheManagers;// 组合多个CacheManager的功能 }
11. 建造者模式(Builder Pattern)
-
定义:逐步构造一个复杂的对象,并允许用户只通过指定复杂对象的类型和内容就能构建它们。
-
在 Spring 中的应用:
-
BeanDefinitionBuilder
用于构建Bean定义 -
UriComponentsBuilder
用于构建URI
-
-
示例:
BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(MyBean.class) .addPropertyValue("name", "Kimi"); .addPropertyValue("age", 25); .getBeanDefinition();