二十五、Spring中用到的设计模式汇总
前面用了很大的篇幅分别讨论了23种常用的设计模式,之后用一篇文章总结了这23种设计模式。并总结出了所有设计模式都在回答三个关于如何创建、如何组织、如何交互的终极问题。现在再通过一个Spring源码来分析,如何使用这些设计模式。
Spring框架涵盖创建型、结构型、行为型三大类别,以及十余种设计模式。下面分别把每个设计模式列举出来,并列举其关键代码。好了,废话少说,我们开始吧。
1. 单例模式(Singleton Pattern)
设计目的:确保Bean全局唯一,节省资源并提升性能。
应用场景:Spring默认Bean作用域为单例。
代码示例:
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
// 任意地方获取同一实例
@Autowired
private MyService service1; // 与service2为同一实例
@Autowired
private MyService service2;
2. 工厂方法模式(Factory Method Pattern)
设计目的:解耦对象创建逻辑,支持扩展。
应用场景:BeanFactory通过工厂方法创建Bean实例。
代码示例:
public interface FactoryBean {
T getObject() throws Exception;
Class> getObjectType();
}
public class MyBeanFactory implements FactoryBean {
@Override
public String getObject() {
return "Factory-Generated String";
}
}
// 配置文件中声明
3. 代理模式(Proxy Pattern)
设计目的:AOP实现核心,动态添加横切逻辑。
应用场景:事务管理、日志记录。
代码示例:
@Aspect
@Component
public class TransactionAspect {
@Around("execution(* com.example.service.*.*(..))")
public Object manageTransaction(ProceedingJoinPoint pjp) throws Throwable {
// 事务开始
Object result = pjp.proceed();
// 事务提交
return result;
}
}
4. 模板方法模式(Template Method Pattern)
设计目的:封装通用流程,子类定制细节。
应用场景:JdbcTemplate简化数据库操作。
代码示例:
java
public class JdbcTemplate {
public T query(String sql, RowMapper rowMapper) {
// 通用流程:连接获取、执行SQL、结果映射
return rowMapper.mapRow(resultSet, 0);
}
}
// 使用示例
jdbcTemplate.query("SELECT * FROM users", (rs, rowNum) -> new User(rs.getInt("id")));
5. 观察者模式(Observer Pattern)
设计目的:事件驱动解耦,支持松耦合通信。
应用场景:Spring事件机制(如ContextRefreshedEvent)。
代码示例:
public class UserCreatedEvent extends ApplicationEvent {
private User user;
public UserCreatedEvent(Object source, User user) {
super(source);
this.user = user;
}
}
@Component
public class UserEventListener implements ApplicationListener {
@Override
public void onApplicationEvent(UserCreatedEvent event) {
// 处理事件
System.out.println("User created: " + event.getUser());
}
}
6. 策略模式(Strategy Pattern)
设计目的:算法族封装,动态切换策略。
应用场景:ResourceLoader根据路径选择加载策略。
代码示例:
public interface ResourceLoader {
Resource getResource(String location);
}
public class ClassPathResourceLoader implements ResourceLoader {
@Override
public Resource getResource(String location) {
return new ClassPathResource(location);
}
}
public class FileSystemResourceLoader implements ResourceLoader {
@Override
public Resource getResource(String location) {
return new FileSystemResource(location);
}
}
7. 适配器模式(Adapter Pattern)
设计目的:统一接口,兼容不同实现。
应用场景:Spring MVC的HandlerAdapter适配不同Controller。
代码示例:
public interface HandlerAdapter {
boolean supports(Object handler);
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler);
}
public class SimpleControllerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return handler instanceof MyController;
}
@Override
public ModelAndView handle(...) {
// 调用具体Controller方法
}
}
8. 装饰者模式(Decorator Pattern)
设计目的:动态扩展功能,不修改原有类。
应用场景:Spring AOP的环绕通知(@Around)。
代码示例:
public class LoggingDecorator implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
// 前置日志
System.out.println("Method called: " + invocation.getMethod().getName());
Object result = invocation.proceed();
// 后置日志
return result;
}
}
9. 简单工厂模式(非GOF标准)
设计目的:集中管理对象创建逻辑。
应用场景:BeanFactory根据配置创建Bean。
代码示例:
public class BeanFactory {
private Map singletonObjects = new ConcurrentHashMap<>();
public Object getBean(String name) {
// 根据name从singletonObjects获取实例
return singletonObjects.get(name);
}
public void registerBean(String name, Object bean) {
singletonObjects.put(name, bean);
}
}
10. 责任链模式(Chain of Responsibility)
设计目的:请求逐级传递,灵活处理。
应用场景:Spring Security过滤器链。
代码示例:
public class CustomFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(...) {
// 处理请求
chain.doFilter(request, response); // 传递给下一个过滤器
}
}