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

相关推荐
美好的事情能不能发生在我身上36 分钟前
苍穹外卖Day11代码解析以及深入思考
java·spring boot·后端·spring·架构
蔡蓝36 分钟前
设计模式-状态模式
ui·设计模式·状态模式
YuTaoShao1 小时前
Java八股文——Spring「Spring 篇」
java·数据库·spring
蔡蓝3 小时前
设计模式-组合模式
java·设计模式·组合模式
雨果talk3 小时前
【一文看懂Spring循环依赖】Spring循环依赖:从陷阱破局到架构涅槃
java·spring boot·后端·spring·架构
飞翔的佩奇3 小时前
Java项目:基于SSM框架实现的劳务外包管理系统【ssm+B/S架构+源码+数据库+毕业论文】
java·mysql·spring·毕业设计·ssm·毕业论文·劳务外包
qqxhb5 小时前
零基础设计模式——行为型模式 - 观察者模式
java·观察者模式·设计模式·go
广州山泉婚姻5 小时前
智慧零工平台后端开发进阶:Spring Boot 3结合MyBatis-Flex的技术实践与优化【无标题】
人工智能·爬虫·spring
朴shu5 小时前
Avatar-Clipper 轻量级图片裁剪工具
前端·设计模式·开源
阿里云云原生6 小时前
Spring AI Alibaba 1.0 GA 正式发布,Java 智能体开发进入新时代
spring