目录

GOF设计模式在-Spring-框架中的核心应用分析

GOF设计模式在 Spring 框架中的核心应用分析

https://i-blog.csdnimg.cn/direct/1f58da8947024e94b0e065df2622bdc5.png

一、设计模式应用

1. 创建型模式

1.1 工厂方法模式(Factory Method)

  • 应用场景 :Bean的创建与管理。
  • 实现方式
  • BeanFactory :通过 getBean() 方法动态创建对象,根据配置或注解决定实例化哪个类。
  • ApplicationContext :继承自 BeanFactory ,提供更高级的工厂功能(如国际化、事件发布)。
  • 示例
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
MyService service = context.getBean(MyService.class);

1.2 单例模式(Singleton)

  • 应用场景 :默认Bean作用域,确保全局唯一实例。
  • 实现方式
  • 通过 @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) 或 XML配置 `` 。
  • 与GOF单例的区别 :Spring通过容器管理单例,而非类自身控制(如静态实例)。
  • 示例
@Bean
@Scope("singleton")
public DataSource dataSource() {
return new HikariDataSource();
}

2. 结构型模式

2.1 代理模式(Proxy)

  • 应用场景 :AOP实现方法增强(日志、事务等)。
  • 实现方式
  • JDK动态代理 :基于接口代理(如 JdkDynamicAopProxy )。
  • CGLib字节码生成 :基于类继承代理(无接口时使用)。
  • 示例
@Aspect
public class LogAspect {
@Before("execution(* com.xiaolingting.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Method called: " + joinPoint.getSignature());
}
}

2.2 适配器模式(Adapter)

  • 应用场景 :将不同类型的Advice(如 MethodBeforeAdvice )适配为统一的 MethodInterceptor
  • 实现方式
  • AdvisorAdapter :将 Advice 适配为拦截器链中的 MethodInterceptor
  • 示例
public class MethodBeforeAdviceAdapter implements AdvisorAdapter {
public boolean supportsAdvice(Advice advice) {
return advice instanceof MethodBeforeAdvice;
}
public MethodInterceptor getInterceptor(Advisor advisor) {
return new MethodBeforeAdviceInterceptor((MethodBeforeAdvice) advisor.getAdvice());
}
}

2.3 装饰器模式(Decorator)

  • 应用场景 :动态增强对象功能(如Session管理、请求包装)。
  • 实现方式
  • BeanWrapper :包装Bean实例,提供属性访问和类型转换。
  • SessionRepositoryRequestWrapper :增强HttpServletRequest的功能(同步分布式Session)。
  • 示例
public class EnhancedRequest extends HttpServletRequestWrapper {
public EnhancedRequest(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
// 对参数进行额外处理
return super.getParameter(name).toUpperCase();
}
}

3. 行为型模式

3.1 模板方法模式(Template Method)

  • 应用场景 :封装算法骨架(如数据库操作、事务管理)。
  • 实现方式
  • JdbcTemplate :定义 execute() 方法骨架,子类实现具体步骤(如连接获取、异常处理)。
  • 示例
public class UserDao extends JdbcDaoSupport {
public List findAll() {
return getJdbcTemplate().query("SELECT * FROM users", (rs, rowNum) -> {
User user = new User();
user.setId(rs.getLong("id"));
user.setName(rs.getString("name"));
return user;
});
}
}

3.2 观察者模式(Observer)

  • 应用场景 :事件驱动机制(如应用启动事件、自定义业务事件)。
  • 实现方式
  • ApplicationEventApplicationListener :定义事件发布与监听。
  • 示例
// 自定义事件
public class OrderCreatedEvent extends ApplicationEvent {
public OrderCreatedEvent(Order order) {
super(order);
}
}
// 事件监听
@Component
public class OrderEventListener implements ApplicationListener {
@Override
public void onApplicationEvent(OrderCreatedEvent event) {
System.out.println("订单已创建:" + event.getSource());
}
}

3.3 策略模式(Strategy)

  • 应用场景 :根据不同条件选择算法(如Bean实例化策略)。
  • 实现方式
  • InstantiationStrategy :定义实例化Bean的不同策略(反射、CGLib等)。
  • 示例
public class CglibSubclassingInstantiationStrategy extends SimpleInstantiationStrategy {
@Override
public Object instantiate(RootBeanDefinition bd, String beanName, BeanFactory owner) {
// 使用CGLib生成子类代理
return Enhancer.create(bd.getBeanClass(), new BeanMethodInterceptor());
}
}

3.4 责任链模式(Chain of Responsibility)

  • 应用场景 :AOP拦截器链、MVC请求处理链。
  • 实现方式
  • MethodInterceptor :多个拦截器按顺序执行,每个拦截器决定是否传递到下一环节。
  • 示例
public class TransactionInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation invocation) throws Throwable {
Connection conn = getConnection();
try {
conn.setAutoCommit(false);
Object result = invocation.proceed(); // 传递到下一个拦截器
conn.commit();
return result;
} catch (Exception e) {
conn.rollback();
throw e;
}
}
}

二、 总结对比

设计模式Spring中的实现核心作用
工厂方法BeanFactory , ApplicationContext解耦对象创建与使用
单例Bean作用域配置资源复用与状态共享
代理AOP动态代理无侵入式功能增强
适配器AdvisorAdapter统一不同接口的调用方式
模板方法JdbcTemplate封装通用流程,扩展细节
观察者ApplicationEvent / Listener松耦合的事件驱动机制
策略InstantiationStrategy动态切换算法实现

结论 :Spring框架通过 灵活组合GOF设计模式 ,实现了高扩展性、低耦合的企业级开发框架。理解这些模式的应用场景,有助于掌握Spring的设计精髓,并在实际开发中借鉴其思想。