Spring⾥⽤到的设计模式

Spring 框架是一个广泛应用于企业级 Java 开发的开源框架,它提供了一系列的模块,包括依赖注入、面向切面编程、事务管理等功能,以简化企业级应用的开发。在 Spring 的设计和实现中,采用了多种设计模式来解决不同的问题,提高代码的可维护性、可扩展性和可重用性。

1. 单例模式(Singleton Pattern)

单例模式是一种创建型设计模式,其主要目的是确保一个类只有一个实例,并提供全局访问点。在 Spring 中,单例模式广泛用于管理 Bean 的生命周期。Spring 容器默认情况下会将所有的 Bean 定义为单例,即在容器中仅存在一个实例,并且在第一次请求时创建。

public class MySingletonBean {
    private static final MySingletonBean instance = new MySingletonBean();

    private MySingletonBean() {
        // 私有构造方法
    }

    public static MySingletonBean getInstance() {
        return instance;
    }
}

Spring 的单例模式确保了在整个应用程序中只有一个 Bean 实例,从而减少了资源消耗和提高了性能。但需要注意的是,单例模式可能引入状态共享的问题,因此在设计时需要考虑线程安全性。

2. 工厂模式(Factory Pattern)

工厂模式是一种创建型设计模式,它提供了一种将对象的实例化过程封装起来的方式。在 Spring 中,工厂模式常常用于创建和管理 Bean 对象。Spring 容器通过工厂模式来管理和创建 Bean,用户只需要配置相应的 Bean 定义,而无需直接调用构造函数。

public interface MyBean {
    void doSomething();
}

public class MyBeanImpl implements MyBean {
    @Override
    public void doSomething() {
        // 具体实现
    }
}

public class MyBeanFactory {
    public MyBean createBean() {
        return new MyBeanImpl();
    }
}

Spring 提供了多种工厂模式的实现,包括简单工厂模式、工厂方法模式和抽象工厂模式。通过配置文件或注解,Spring 容器可以根据用户的需求选择适当的工厂模式来创建和管理 Bean。

3. 代理模式(Proxy Pattern)

代理模式是一种结构型设计模式,它通过创建一个代理对象来控制对其他对象的访问。在 Spring 中,代理模式常被用于实现 AOP(面向切面编程)。

Spring AOP 使用代理模式来实现横切关注点的模块化,将横切关注点(例如日志记录、事务管理)从业务逻辑中分离出来。Spring 提供两种代理模式:静态代理和动态代理。

3.1 静态代理

public interface MyService {
    void doSomething();
}

public class MyServiceImpl implements MyService {
    @Override
    public void doSomething() {
        // 具体实现
    }
}

public class MyServiceProxy implements MyService {
    private final MyService target;

    public MyServiceProxy(MyService target) {
        this.target = target;
    }

    @Override
    public void doSomething() {
        // 执行横切关注点(例如日志记录)
        System.out.println("Before method execution");
        
        // 调用目标对象的方法
        target.doSomething();
        
        // 执行横切关注点(例如事务管理)
        System.out.println("After method execution");
    }
}

3.2 动态代理

public interface MyService {
    void doSomething();
}

public class MyServiceImpl implements MyService {
    @Override
    public void doSomething() {
        // 具体实现
    }
}

public class MyInvocationHandler implements InvocationHandler {
    private final Object target;

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 执行横切关注点(例如日志记录)
        System.out.println("Before method execution");
        
        // 调用目标对象的方法
        Object result = method.invoke(target, args);
        
        // 执行横切关注点(例如事务管理)
        System.out.println("After method execution");
        
        return result;
    }
}

动态代理通过 java.lang.reflect.Proxy 类和 InvocationHandler 接口实现,可以在运行时动态生成代理类,而不需要提前定义。

4. 观察者模式(Observer Pattern)

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在 Spring 中,观察者模式被广泛应用于事件驱动编程和消息通知。

Spring 的事件机制就是基于观察者模式实现的。通过定义事件、监听器和发布器,应用程序可以轻松实现组件之间的解耦和通信。

public class MyEvent extends ApplicationEvent {
    // 自定义事件类
    public MyEvent(Object source) {
        super(source);
    }
}

public class MyListener implements ApplicationListener<MyEvent> {
    // 自定义监听器类
    @Override
    public void onApplicationEvent(MyEvent event) {
        // 处理事件
    }
}

public class MyPublisher {
    // 事件发布器
    private final ApplicationEventPublisher eventPublisher;

    public MyPublisher(ApplicationEventPublisher eventPublisher) {
        this.eventPublisher = eventPublisher;
    }

    public void publishEvent() {
        // 发布事件
        eventPublisher.publishEvent(new MyEvent(this));
    }
}

5. 策略模式(Strategy Pattern)

策略模式是一种行为型设计模式,它定义了一族算法,将每个算法封装起来,并使它们可以互相替换。在 Spring 中,策略模式常被用于定义和管理一系列可互换的算法或行为。

Spring 中的事务管理就是一个典型的策略模式的应用。Spring 提供了多种事务管理的策略,包括编程式事务管理和声明式事务管理,用户可以根据需要选择合适的策略。

public interface TransactionStrategy {
    void beginTransaction();
    void commit();
    void rollback();
}

public class ProgrammaticTransactionStrategy implements TransactionStrategy {
    // 编程式事务管理策略的具体实现
    @Override
    public void beginTransaction() {
        // 实现具体的事务开始逻辑
    }

    @Override
    public void commit() {
        // 实现具体的事务提交逻辑
    }

    @Override
    public void rollback() {
        // 实现具体的事务回滚逻辑
    }
}

public class DeclarativeTransactionStrategy implements TransactionStrategy {
    // 声明式事务管理策略的具体实现
    @Override
    public void beginTransaction() {
        // 实现具体的事务开始逻辑
    }

    @Override
    public void commit() {
        // 实现具体的事务提交逻辑
    }

    @Override
    public void rollback() {
        // 实现具体的事务回滚逻辑
    }
}

通过定义一个通用的接口,可以轻松地切换和扩展不同的事务管理策略,而不影响业务逻辑的实现。

6. 模板方法模式(Template Method Pattern)

模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将一些步骤的具体实现延迟到子类。在 Spring 中,模板方法模式常被用于定义一些通用的算法骨架,以便子类可以按需实现具体步骤。

Spring 的 JdbcTemplate 就是模板方法模式的一个例子。JdbcTemplate 定义了一系列执行数据库操作的方法,其中一些步骤是通用的,而一些是具体的,由子类实现。

public abstract class JdbcTemplate {
    public final void execute() {
        // 通用步骤1
        getConnection();

        // 具体步骤由子类实现
        doExecute();

        // 通用步骤2
        releaseConnection();
    }

    protected abstract void doExecute();

    private void getConnection() {
        // 获取数据库连接的通用实现
    }

    private void releaseConnection() {
        // 释放数据库连接的通用实现
    }
}

public class MyJdbcTemplate extends JdbcTemplate {
    @Override
    protected void doExecute() {
        // 具体步骤的实现
    }
}

通过模板方法模式,JdbcTemplate 将通用的数据库操作流程封装在 execute 方法中,而具体的操作由子类实现,实现了算法的复用和业务逻辑的分离。

7. 适配器模式(Adapter Pattern)

适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端期望的另一个接口。在 Spring 中,适配器模式常被用于解决接口不兼容的问题。

Spring MVC 中的 HandlerAdapter 就是适配器模式的一个应用。HandlerAdapter 负责将处理请求的 Controller 转换成合适的处理器,以适应不同的 Controller 接口。

public interface Controller {
    void handleRequest();
}

public class SimpleController implements Controller {
    @Override
    public void handleRequest() {
        // 处理请求的具体实现
    }
}

public class SimpleControllerHandlerAdapter implements HandlerAdapter {
    private final SimpleController controller;

    public SimpleControllerHandlerAdapter(SimpleController controller) {
        this.controller = controller;
    }

    @Override
    public boolean supports(Object handler) {
        return handler instanceof SimpleController;
    }

    @Override
    public void handle(Object handler) {
        controller.handleRequest();
    }
}

通过适配器模式,SimpleControllerHandlerAdapter 将 SimpleController 转换成 HandlerAdapter 接口,使得它可以被 Spring MVC 框架正确地处理。

最后

Spring 框架广泛应用了多种设计模式,这些设计模式在提高代码的可维护性、可扩展性和可重用性方面发挥了重要作用。通过单例模式、工厂模式、代理模式、观察者模式、策略模式、模板方法模式和适配器模式等设计模式的应用,Spring 实现了面向对象设计原则,使得框架更加灵活、可扩展和易于维护。熟练掌握这些设计模式有助于开发者更好地理解和使用 Spring 框架,提高代码质量和开发效率。

黑马程序员新版Spring零基础入门到精通,一套搞定spring全套视频教程(含实战源码)

  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值