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

一、设计模式应用

1. 创建型模式

1.1 工厂方法模式(Factory Method)

  • 应用场景:Bean的创建与管理。

  • 实现方式

    • BeanFactory :通过 getBean() 方法动态创建对象,根据配置或注解决定实例化哪个类。
    • ApplicationContext :继承自 BeanFactory,提供更高级的工厂功能(如国际化、事件发布)。
  • 示例

    java 复制代码
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    MyService service = context.getBean(MyService.class);

1.2 单例模式(Singleton)

  • 应用场景:默认Bean作用域,确保全局唯一实例。

  • 实现方式

    • 通过 @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) 或 XML配置 <bean scope="singleton">
    • 与GOF单例的区别:Spring通过容器管理单例,而非类自身控制(如静态实例)。
  • 示例

    java 复制代码
    @Bean
    @Scope("singleton")
    public DataSource dataSource() {
        return new HikariDataSource();
    }

2. 结构型模式

2.1 代理模式(Proxy)

  • 应用场景:AOP实现方法增强(日志、事务等)。

  • 实现方式

    • JDK动态代理 :基于接口代理(如 JdkDynamicAopProxy)。
    • CGLib字节码生成:基于类继承代理(无接口时使用)。
  • 示例

    java 复制代码
    @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
  • 示例

    java 复制代码
    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)。
  • 示例

    java 复制代码
    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() 方法骨架,子类实现具体步骤(如连接获取、异常处理)。
  • 示例

    java 复制代码
    public class UserDao extends JdbcDaoSupport {
        public List<User> 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:定义事件发布与监听。
  • 示例

    java 复制代码
    // 自定义事件
    public class OrderCreatedEvent extends ApplicationEvent {
        public OrderCreatedEvent(Order order) {
            super(order);
        }
    }
    
    // 事件监听
    @Component
    public class OrderEventListener implements ApplicationListener<OrderCreatedEvent> {
        @Override
        public void onApplicationEvent(OrderCreatedEvent event) {
            System.out.println("订单已创建:" + event.getSource());
        }
    }

3.3 策略模式(Strategy)

  • 应用场景:根据不同条件选择算法(如Bean实例化策略)。

  • 实现方式

    • InstantiationStrategy:定义实例化Bean的不同策略(反射、CGLib等)。
  • 示例

    java 复制代码
    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:多个拦截器按顺序执行,每个拦截器决定是否传递到下一环节。
  • 示例

    java 复制代码
    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的设计精髓,并在实际开发中借鉴其思想。

相关推荐
晨米酱10 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机15 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
金銀銅鐵15 小时前
Spring 中的 initializeBean 方法的内部逻辑小总结
spring
数据智能老司机16 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机16 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机16 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
使一颗心免于哀伤16 小时前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
数据智能老司机1 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机2 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴2 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript