Spring框架中使用的核心设计模式 及其 使用场景
目录:
- 🧠 一、Spring 中使用的设计模式汇总
- 🧩 二、详细设计模式解析与 Spring 应用
- 1. 工厂模式(Factory Pattern)
- 2. 单例模式(Singleton Pattern)
- 3. 原型模式(Prototype Pattern)
- 4. 代理模式(Proxy Pattern)
- 5. 模板方法模式(Template Method Pattern)
- 6. 策略模式(Strategy Pattern)
- 7. 适配器模式(Adapter Pattern)
- 8. 装饰器模式(Decorator Pattern)
- 9. 观察者模式(Observer Pattern)
- 10. 委派模式(Delegate Pattern)
- 11. 外观模式(Facade Pattern)
- 12. 工厂方法模式(Factory Method Pattern)
- 📌 三、Spring 设计模式使用场景总结
- 🧪 四、常见面试题及答案
- 1. Spring 中使用了哪些设计模式?
- 2. Spring AOP 使用了什么设计模式?
- 3. Spring 是如何实现单例的?
- 4. 模板方法模式在 Spring 中的应用?
- 5. 策略模式在 Spring 中的应用?
- 6. 观察者模式在 Spring 中的应用?
- 7. 装饰器模式在 Spring 中的应用?
- 🧩 五、Spring 中设计模式的典型应用场景总结
- 📦 六、设计模式对 Spring 架构的意义
- 📚 七、推荐学习资料
- ✅ 八、总结:Spring 中设计模式的核心作用
- 📄 九、完整代码示例(Spring 中使用设计模式)
- 1. 工厂模式:BeanFactory 和 ApplicationContext
- 2. 代理模式:Spring AOP
- 3. 模板方法模式:JdbcTemplate
- 4. 策略模式:Resource 接口
- 5. 观察者模式:ApplicationEvent 和 ApplicationListener
- 📌 十、Spring 设计模式应用总结表
🧠 一、Spring 中使用的设计模式汇总
🧩 二、详细设计模式解析与 Spring 应用
1. 工厂模式(Factory Pattern)
- 使用场景:解耦对象的创建与使用。
- Spring 应用:BeanFactory 和 ApplicationContext 是典型的工厂模式实现。
- 示例代码:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean("userService", UserService.class);
2. 单例模式(Singleton Pattern)
- 使用场景:确保全局只有一个实例(如数据库连接池)。
- Spring 应用:Spring 默认的 Bean 作用域是 singleton。
- 示例代码:
@Service
public class UserService {// 单例模式管理
}
3. 原型模式(Prototype Pattern)
- 使用场景:每次请求都创建新实例(如用户会话对象)。
- Spring 应用:通过 @Scope(“prototype”) 定义原型 Bean。
- 示例代码:
@Service
@Scope("prototype")
public class SessionService {// 每次调用都会创建新实例
}
4. 代理模式(Proxy Pattern)
- 使用场景:无侵入增强对象功能(如日志、事务、安全)。
- Spring 应用:Spring AOP 底层使用 JDK 动态代理(基于接口)或 CGLIB 代理(基于子类)。
- 示例代码:
@Aspect
@Component
public class LoggingAspect {@Before("execution(* com.example.service.*.*(..))")public void logMethodCall(JoinPoint jp) {System.out.println("调用方法: " + jp.getSignature().getName());}
}
5. 模板方法模式(Template Method Pattern)
- 使用场景:定义算法骨架,允许子类实现细节。
- Spring 应用:JdbcTemplate、JmsTemplate 等模板类。
- 示例代码:
public abstract class JdbcTemplate {public final Object execute(String sql) {Connection conn = getConnection(); // 抽象方法Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql);Object result = mapResult(rs); // 抽象方法releaseResources(conn, stmt, rs);return result;}protected abstract Connection getConnection();protected abstract Object mapResult(ResultSet rs);
}
6. 策略模式(Strategy Pattern)
- 使用场景:根据不同场景选择不同实现类(如加载资源)。
- Spring 应用:Resource 接口(ClassPathResource、FileSystemResource)。
- 示例代码:
Resource resource = new ClassPathResource("config.properties"); // 从类路径加载
Resource resource = new FileSystemResource("/path/to/file.txt"); // 从文件系统加载
7. 适配器模式(Adapter Pattern)
- 使用场景:兼容不同接口或实现(如不同处理器)。
- Spring 应用:Spring MVC 中的 HandlerAdapter,处理不同类型的控制器。
- 示例代码:
class UserController {("/user")public String getUser() {return "user";}
}// Spring MVC 内部使用 HandlerAdapter 调用方法
public
8. 装饰器模式(Decorator Pattern)
- 使用场景:动态添加功能(如缓存、安全)。
- Spring 应用:DataSource 的包装、InputStream 的装饰。
- 示例代码:
DataSource dataSource = new DriverManagerDataSource(); // 基础数据源
dataSource = new TransactionAwareDataSourceProxy(dataSource); // 装饰为支持事务的数据源
9. 观察者模式(Observer Pattern)
- 使用场景:事件发布与监听(如用户注册后发送邮件)。
- Spring 应用:ApplicationEvent、ApplicationListener。
- 示例代码:
class UserRegisteredListener implements ApplicationListener<UserRegisteredEvent> { public void onApplicationEvent(UserRegisteredEvent event) {System.out.println("发送欢迎邮件给用户:" + event.getUsername());}
}// 发布事件
applicationEventPublisher.publishEvent(new UserRegisteredEvent("张三"));
public
10. 委派模式(Delegate Pattern)
- 使用场景:任务分发给其他对象处理。
- Spring 应用:DispatcherServlet 委托给 HandlerMapping、ViewResolver 等组件处理请求。
- 示例流程:
DispatcherServlet → HandlerMapping → Controller → ViewResolver → 返回视图
11. 外观模式(Facade Pattern)
- 使用场景:提供统一接口,简化复杂系统调用。
- Spring 应用:ApplicationContext 作为统一接口,简化 Bean 管理。
- 示例代码:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean("userService", UserService.class);
12. 工厂方法模式(Factory Method Pattern)
- 使用场景:定义创建对象的接口,由子类决定具体实现。
- Spring 应用:BeanFactory 的 getBean() 方法。
- 示例代码:
public interface BeanFactory {Object getBean(String name);
}public class DefaultListableBeanFactory implements BeanFactory { public Object getBean(String name) {// 实际创建 Bean 的逻辑}
}
📌 三、Spring 设计模式使用场景总结
🧪 四、常见面试题及答案
1. Spring 中使用了哪些设计模式?
答案:
- 工厂模式、单例模式、代理模式、模板方法模式、策略模式、观察者模式、适配器模式、装饰器模式、原型模式、委派模式、外观模式等。
2. Spring AOP 使用了什么设计模式?
答案:代理模式。
- 基于接口:使用 JDK 动态代理。
- 基于类:使用 CGLIB 代理。
3. Spring 是如何实现单例的?
答案:
- Spring 容器默认将 Bean 注册为单例。
- BeanFactory 或 ApplicationContext 在启动时创建 Bean 实例,并缓存供后续使用。
4. 模板方法模式在 Spring 中的应用?
答案:
- JdbcTemplate 是典型的模板方法模式应用。
- 提供通用流程(获取连接、执行 SQL、释放资源),子类只需实现 mapRow() 等钩子方法。
5. 策略模式在 Spring 中的应用?
答案:
- Resource 接口(ClassPathResource、FileSystemResource)。
- TaskScheduler 接口(不同调度策略)。
6. 观察者模式在 Spring 中的应用?
答案:
- ApplicationEvent 和 ApplicationListener 是典型的观察者模式应用。
- 例如:用户注册后发布事件,多个监听器处理(发送邮件、记录日志)。
7. 装饰器模式在 Spring 中的应用?
答案:
- DataSource 的装饰(如 TransactionAwareDataSourceProxy)。
- InputStream 的装饰(如 BufferedInputStream)。
🧩 五、Spring 中设计模式的典型应用场景总结
📦 六、设计模式对 Spring 架构的意义
📚 七、推荐学习资料
- 《Spring 实战》(Craig Walls)
- 《Spring 设计思想》(Java 架构师必读)
- Spring 官方文档:https://docs.spring.io/spring-framework/docs/current/javadoc-api/
- 设计模式经典书籍:《设计模式:可复用面向对象软件的基础》(GoF)
✅ 八、总结:Spring 中设计模式的核心作用
📄 九、完整代码示例(Spring 中使用设计模式)
1. 工厂模式:BeanFactory 和 ApplicationContext
public interface BeanFactory {Object getBean(String name);
}public class DefaultListableBeanFactory implements BeanFactory { public Object getBean(String name) {// 实际创建 Bean 的逻辑}
}
2. 代理模式:Spring AOP
class LoggingAspect {("execution(* com.example.service.*.*(..))")public void logMethodCall(JoinPoint jp) {System.out.println("调用方法: " + jp.getSignature().getName());}}
public
3. 模板方法模式:JdbcTemplate
public abstract class JdbcTemplate {public final Object execute(String sql) {Connection conn = getConnection();Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql);Object result = mapResult(rs);releaseResources(conn, stmt, rs);return result;}protected abstract Connection getConnection();protected abstract Object mapResult(ResultSet rs);
}
4. 策略模式:Resource 接口
Resource resource = new ClassPathResource("config.properties"); // 从类路径加载
Resource resource = new FileSystemResource("/path/to/file.txt"); // 从文件系统加载
5. 观察者模式:ApplicationEvent 和 ApplicationListener
class UserRegisteredListener implements ApplicationListener<UserRegisteredEvent> { public void onApplicationEvent(UserRegisteredEvent event) {System.out.println("发送欢迎邮件给用户:" + event.getUsername());}
}// 发布事件
applicationEventPublisher.publishEvent(new UserRegisteredEvent("张三"));
public