Spring 框架是一个广泛应用于企业级 Java 开发的开源框架,它提供了一系列的模块,包括依赖注入、面向切面编程、事务管理等功能,以简化企业级应用的开发。在 Spring 的设计和实现中,采用了多种设计模式来解决不同的问题,提高代码的可维护性、可扩展性和可重用性。
1. 单例模式(Singleton Pattern)
单例模式是一种创建型设计模式,其主要目的是确保一个类只有一个实例,并提供全局访问点。在 Spring 中,单例模式广泛用于管理 Bean 的生命周期。Spring 容器默认情况下会将所有的 Bean 定义为单例,即在容器中仅存在一个实例,并且在第一次请求时创建。
public class MySingletonBean {private static final MySingletonBean instance = new MySingletonBean();private MySingletonBean() {// 私有构造方法}public static MySingletonBean getInstance() {return instance;}
}
Spring 的单例模式确保了在整个应用程序中只有一个 Bean 实例,从而减少了资源消耗和提高了性能。但需要注意的是,单例模式可能引入状态共享的问题,因此在设计时需要考虑线程安全性。
2. 工厂模式(Factory Pattern)
工厂模式是一种创建型设计模式,它提供了一种将对象的实例化过程封装起来的方式。在 Spring 中,工厂模式常常用于创建和管理 Bean 对象。Spring 容器通过工厂模式来管理和创建 Bean,用户只需要配置相应的 Bean 定义,而无需直接调用构造函数。
public interface MyBean {void doSomething();
}public class MyBeanImpl implements MyBean {@Overridepublic void doSomething() {// 具体实现}
}public class MyBeanFactory {public MyBean createBean() {return new MyBeanImpl();}
}
Spring 提供了多种工厂模式的实现,包括简单工厂模式、工厂方法模式和抽象工厂模式。通过配置文件或注解,Spring 容器可以根据用户的需求选择适当的工厂模式来创建和管理 Bean。
3. 代理模式(Proxy Pattern)
代理模式是一种结构型设计模式,它通过创建一个代理对象来控制对其他对象的访问。在 Spring 中,代理模式常被用于实现 AOP(面向切面编程)。
Spring AOP 使用代理模式来实现横切关注点的模块化,将横切关注点(例如日志记录、事务管理)从业务逻辑中分离出来。Spring 提供两种代理模式:静态代理和动态代理。
3.1 静态代理
public interface MyService {void doSomething();
}public class MyServiceImpl implements MyService {@Overridepublic void doSomething() {// 具体实现}
}public class MyServiceProxy implements MyService {private final MyService target;public MyServiceProxy(MyService target) {this.target = target;}@Overridepublic void doSomething() {// 执行横切关注点(例如日志记录)System.out.println("Before method execution");// 调用目标对象的方法target.doSomething();// 执行横切关注点(例如事务管理)System.out.println("After method execution");}
}
3.2 动态代理
public interface MyService {void doSomething();
}public class MyServiceImpl implements MyService {@Overridepublic void doSomething() {// 具体实现}
}public class MyInvocationHandler implements InvocationHandler {private final Object target;public MyInvocationHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 执行横切关注点(例如日志记录)System.out.println("Before method execution");// 调用目标对象的方法Object result = method.invoke(target, args);// 执行横切关注点(例如事务管理)System.out.println("After method execution");return result;}
}
动态代理通过 java.lang.reflect.Proxy
类和 InvocationHandler
接口实现,可以在运行时动态生成代理类,而不需要提前定义。
4. 观察者模式(Observer Pattern)
观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在 Spring 中,观察者模式被广泛应用于事件驱动编程和消息通知。
Spring 的事件机制就是基于观察者模式实现的。通过定义事件、监听器和发布器,应用程序可以轻松实现组件之间的解耦和通信。
public class MyEvent extends ApplicationEvent {// 自定义事件类public MyEvent(Object source) {super(source);}
}public class MyListener implements ApplicationListener<MyEvent> {// 自定义监听器类@Overridepublic void onApplicationEvent(MyEvent event) {// 处理事件}
}public class MyPublisher {// 事件发布器private final ApplicationEventPublisher eventPublisher;public MyPublisher(ApplicationEventPublisher eventPublisher) {this.eventPublisher = eventPublisher;}public void publishEvent() {// 发布事件eventPublisher.publishEvent(new MyEvent(this));}
}
5. 策略模式(Strategy Pattern)
策略模式是一种行为型设计模式,它定义了一族算法,将每个算法封装起来,并使它们可以互相替换。在 Spring 中,策略模式常被用于定义和管理一系列可互换的算法或行为。
Spring 中的事务管理就是一个典型的策略模式的应用。Spring 提供了多种事务管理的策略,包括编程式事务管理和声明式事务管理,用户可以根据需要选择合适的策略。
public interface TransactionStrategy {void beginTransaction();void commit();void rollback();
}public class ProgrammaticTransactionStrategy implements TransactionStrategy {// 编程式事务管理策略的具体实现@Overridepublic void beginTransaction() {// 实现具体的事务开始逻辑}@Overridepublic void commit() {// 实现具体的事务提交逻辑}@Overridepublic void rollback() {// 实现具体的事务回滚逻辑}
}public class DeclarativeTransactionStrategy implements TransactionStrategy {// 声明式事务管理策略的具体实现@Overridepublic void beginTransaction() {// 实现具体的事务开始逻辑}@Overridepublic void commit() {// 实现具体的事务提交逻辑}@Overridepublic void rollback() {// 实现具体的事务回滚逻辑}
}
通过定义一个通用的接口,可以轻松地切换和扩展不同的事务管理策略,而不影响业务逻辑的实现。
6. 模板方法模式(Template Method Pattern)
模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将一些步骤的具体实现延迟到子类。在 Spring 中,模板方法模式常被用于定义一些通用的算法骨架,以便子类可以按需实现具体步骤。
Spring 的 JdbcTemplate 就是模板方法模式的一个例子。JdbcTemplate 定义了一系列执行数据库操作的方法,其中一些步骤是通用的,而一些是具体的,由子类实现。
public abstract class JdbcTemplate {public final void execute() {// 通用步骤1getConnection();// 具体步骤由子类实现doExecute();// 通用步骤2releaseConnection();}protected abstract void doExecute();private void getConnection() {// 获取数据库连接的通用实现}private void releaseConnection() {// 释放数据库连接的通用实现}
}public class MyJdbcTemplate extends JdbcTemplate {@Overrideprotected void doExecute() {// 具体步骤的实现}
}
通过模板方法模式,JdbcTemplate 将通用的数据库操作流程封装在 execute 方法中,而具体的操作由子类实现,实现了算法的复用和业务逻辑的分离。
7. 适配器模式(Adapter Pattern)
适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端期望的另一个接口。在 Spring 中,适配器模式常被用于解决接口不兼容的问题。
Spring MVC 中的 HandlerAdapter 就是适配器模式的一个应用。HandlerAdapter 负责将处理请求的 Controller 转换成合适的处理器,以适应不同的 Controller 接口。
public interface Controller {void handleRequest();
}public class SimpleController implements Controller {@Overridepublic void handleRequest() {// 处理请求的具体实现}
}public class SimpleControllerHandlerAdapter implements HandlerAdapter {private final SimpleController controller;public SimpleControllerHandlerAdapter(SimpleController controller) {this.controller = controller;}@Overridepublic boolean supports(Object handler) {return handler instanceof SimpleController;}@Overridepublic void handle(Object handler) {controller.handleRequest();}
}
通过适配器模式,SimpleControllerHandlerAdapter 将 SimpleController 转换成 HandlerAdapter 接口,使得它可以被 Spring MVC 框架正确地处理。
最后
Spring 框架广泛应用了多种设计模式,这些设计模式在提高代码的可维护性、可扩展性和可重用性方面发挥了重要作用。通过单例模式、工厂模式、代理模式、观察者模式、策略模式、模板方法模式和适配器模式等设计模式的应用,Spring 实现了面向对象设计原则,使得框架更加灵活、可扩展和易于维护。熟练掌握这些设计模式有助于开发者更好地理解和使用 Spring 框架,提高代码质量和开发效率。
黑马程序员新版Spring零基础入门到精通,一套搞定spring全套视频教程(含实战源码)