锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. JAVA
  4. Spring与设计模式总览

Spring与设计模式总览

0
  • JAVA
  • 发布于 2024-08-09
  • 0 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

Spring 框架中的设计模式详解

Spring 框架不仅是 Java 企业级开发的主力军,其设计还蕴含了大量经典设计模式。这些模式贯穿于 Spring 的核心组件中,提升了框架的可维护性和扩展性。本文将深入探讨 Spring 框架中常见的设计模式及其应用。

1. 工厂模式(Factory Pattern)

工厂模式是最常见的设计模式之一。Spring 使用工厂模式来创建和管理 Bean 的实例。

1.1 工厂方法模式

工厂方法模式通过定义一个创建对象的接口,让子类决定实例化哪个类。Spring 中的FactoryBean就是一个很好的例子。

public interface FactoryBean<T> {
    T getObject() throws Exception;
    Class<?> getObjectType();
    boolean isSingleton();
}

通过实现FactoryBean接口,可以自定义 Bean 的创建逻辑。

1.2 抽象工厂模式

Spring 的BeanFactory和ApplicationContext实现了抽象工厂模式。ApplicationContext不仅继承了BeanFactory的所有功能,还提供了更强大的功能,如国际化、事件传播和声明式方式创建 Bean 等。

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
MyBean myBean = context.getBean(MyBean.class);

2. 单例模式(Singleton Pattern)

单例模式确保一个类只有一个实例,并提供一个全局访问点。Spring 默认使用单例模式管理 Bean,这意味着一个 Bean 在整个 Spring 容器中只有一个实例。

<bean id="myBean" class="com.example.MyBean" scope="singleton"/>

通过配置scope属性,可以将 Bean 定义为单例。

3. 代理模式(Proxy Pattern)

代理模式用于为其他对象提供一种代理以控制对这个对象的访问。Spring AOP(面向切面编程)大量使用了代理模式。

3.1 JDK 动态代理

Spring AOP 使用 JDK 动态代理来为实现接口的类创建代理对象。

public interface MyService {
    void performTask();
}

public class MyServiceImpl implements MyService {
    @Override
    public void performTask() {
        System.out.println("Performing task...");
    }
}

3.2 CGLIB 代理

对于没有实现接口的类,Spring 使用 CGLIB 来创建代理对象。

public class MyService {
    public void performTask() {
        System.out.println("Performing task...");
    }
}

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

模板方法模式定义了一个算法的骨架,而将一些步骤延迟到子类中。Spring 的JdbcTemplate、RestTemplate等类广泛使用了模板方法模式。

public abstract class AbstractTemplate {
    public final void templateMethod() {
        step1();
        step2();
        step3();
    }

    protected abstract void step1();
    protected abstract void step2();
    protected abstract void step3();
}

通过继承AbstractTemplate类,可以实现具体的步骤逻辑。

5. 策略模式(Strategy Pattern)

策略模式允许定义一系列算法,并将每个算法封装起来,使它们可以互换。这种模式让算法的变化独立于使用算法的客户。Spring 的TaskExecutor、TransactionManagement等模块使用了策略模式。

public interface TaskExecutor {
    void execute(Runnable task);
}

public class SimpleTaskExecutor implements TaskExecutor {
    @Override
    public void execute(Runnable task) {
        new Thread(task).start();
    }
}

通过实现TaskExecutor接口,可以定义不同的任务执行策略。

6. 观察者模式(Observer Pattern)

观察者模式定义了对象间的一对多依赖关系,当一个对象改变状态时,所有依赖于它的对象都会收到通知并自动更新。Spring 的事件驱动模型使用了观察者模式。

6.1 自定义事件

public class CustomEvent extends ApplicationEvent {
    public CustomEvent(Object source) {
        super(source);
    }
}

6.2 自定义事件监听器

@Component
public class CustomEventListener implements ApplicationListener<CustomEvent> {
    @Override
    public void onApplicationEvent(CustomEvent event) {
        System.out.println("Received custom event: " + event.getSource());
    }
}

6.3 发布事件

@Component
public class EventPublisher {
    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    public void publishEvent() {
        CustomEvent event = new CustomEvent(this);
        applicationEventPublisher.publishEvent(event);
    }
}

7. 装饰模式(Decorator Pattern)

装饰模式在不改变对象接口的情况下,动态地扩展对象的功能。Spring 中的BeanPostProcessor和BeanFactoryPostProcessor使用了装饰模式。

BeanPostProcessor 示例

@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // 在Bean初始化之前进行处理
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // 在Bean初始化之后进行处理
        return bean;
    }
}

8. 适配器模式(Adapter Pattern)

适配器模式将一个类的接口转换成客户希望的另一个接口。Spring 的HandlerAdapter、Controller等使用了适配器模式。

public interface HandlerAdapter {
    boolean supports(Object handler);
    ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
}

通过实现HandlerAdapter接口,可以适配不同的控制器。

当然,Spring 框架中还应用了其他许多设计模式。以下是一些额外的设计模式及其在 Spring 中的应用:

9. 桥接模式(Bridge Pattern)

桥接模式通过将抽象部分与实现部分分离,使它们可以独立变化。Spring 的JdbcTemplate和各种数据库抽象模块使用了桥接模式。

  • 抽象部分:定义了抽象类,并包含一个对实现部分的引用。
  • 实现部分:定义实现类接口,具体实现类实现该接口。
public abstract class DatabaseConnection {
    protected DatabaseDriver driver;

    protected DatabaseConnection(DatabaseDriver driver) {
        this.driver = driver;
    }

    public abstract void connect();
}

public interface DatabaseDriver {
    void establishConnection();
}

通过桥接模式,数据库连接和具体的数据库驱动可以独立变化。

10. 外观模式(Facade Pattern)

外观模式通过提供一个统一的接口,用来访问子系统中的一群接口,从而让子系统更容易使用。Spring 中的JdbcTemplate、RestTemplate等类提供了简化数据库访问和 HTTP 请求的统一接口。

public class DatabaseFacade {
    private JdbcTemplate jdbcTemplate;

    public DatabaseFacade(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    public void executeQuery(String sql) {
        jdbcTemplate.execute(sql);
    }
}

11. 组合模式(Composite Pattern)

组合模式允许你将对象组合成树形结构来表示 "部分 - 整体" 的层次结构。Spring 的BeanFactory和ApplicationContext使用了组合模式。

  • 组件:定义了组合对象和叶子对象的接口。
  • 叶子对象:实现组件接口,不包含子对象。
  • 组合对象:实现组件接口,包含子对象。
public interface Component {
    void operation();
}

public class Leaf implements Component {
    @Override
    public void operation() {
        System.out.println("Leaf operation");
    }
}

public class Composite implements Component {
    private List<Component> children = new ArrayList<>();

    @Override
    public void operation() {
        for (Component child : children) {
            child.operation();
        }
    }

    public void add(Component component) {
        children.add(component);
    }

    public void remove(Component component) {
        children.remove(component);
    }
}

12. 责任链模式(Chain of Responsibility Pattern)

责任链模式通过给多个对象处理请求的机会,避免请求的发送者与接收者之间的耦合。Spring 的DispatcherServlet使用责任链模式来处理 HTTP 请求。

  • 处理器接口:定义处理请求的方法。
  • 具体处理器:实现处理器接口,并处理部分请求。
  • 链:将多个处理器链接起来。
public interface Handler {
    void setNext(Handler handler);
    void handleRequest(String request);
}

public abstract class AbstractHandler implements Handler {
    protected Handler nextHandler;

    @Override
    public void setNext(Handler handler) {
        this.nextHandler = handler;
    }

    @Override
    public void handleRequest(String request) {
        if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

13. 享元模式(Flyweight Pattern)

享元模式通过共享对象来减少内存消耗。Spring 的内置缓存机制和一些池化技术使用了享元模式。

  • 享元接口:定义共享对象的接口。
  • 具体享元:实现享元接口,提供共享的具体对象。
  • 享元工厂:负责创建和管理享元对象。
public interface Flyweight {
    void operation(String extrinsicState);
}

public class ConcreteFlyweight implements Flyweight {
    private String intrinsicState;

    public ConcreteFlyweight(String intrinsicState) {
        this.intrinsicState = intrinsicState;
    }

    @Override
    public void operation(String extrinsicState) {
        System.out.println("Intrinsic State = " + intrinsicState + ", Extrinsic State = " + extrinsicState);
    }
}

public class FlyweightFactory {
    private Map<String, Flyweight> flyweights = new HashMap<>();

    public Flyweight getFlyweight(String key) {
        if (!flyweights.containsKey(key)) {
            flyweights.put(key, new ConcreteFlyweight(key));
        }
        return flyweights.get(key);
    }
}

总结

Spring 框架中设计模式的广泛应用展示了设计模式在构建灵活、可维护和可扩展系统中的重要性。通过理解和应用这些设计模式,我们开发人员可以更好地利用 Spring 框架,构建出高质量、可维护和可扩展的企业级应用程序。这些模式不仅提高了代码的可读性和可维护性,还增强了系统的扩展性和灵活性。在实际项目中,合理地应用设计模式和 Spring 特性,可以显著提升系统的设计质量和开发效率。后面会根据实际项目进行实战

标签: #JAVA 991 #软件开发 1171
相关文章

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

SpringBoot整合异步任务执行 2024-10-08 11:24

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用 户体验 异步任务: 异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源

springboot kafka多数据源,通过配置动态加载发送者和消费者 2024-10-08 11:24

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需要对架构做一定的设计了。 准备test kafka本身非常容易上手,如果我们需要单元测试,引入ja

SpringBoot 集成 Redis 2024-10-08 11:24

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客户端可以使用多种语

SpringBoot整合QQ邮箱 2024-10-08 11:24

SpringBoot可以通过导入依赖的方式集成多种技术,这当然少不了我们常用的邮箱,现在本章演示SpringBoot整合QQ邮箱发送邮件…. 下面按步骤进行: 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.