首页 > 其他分享 >Spring与设计模式总览

Spring与设计模式总览

时间:2024-07-16 19:26:57浏览次数:16  
标签:设计模式 Spring void 模式 class 接口 总览 public

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的BeanFactoryApplicationContext实现了抽象工厂模式。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的JdbcTemplateRestTemplate等类广泛使用了模板方法模式。

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的TaskExecutorTransactionManagement等模块使用了策略模式。

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中的BeanPostProcessorBeanFactoryPostProcessor使用了装饰模式。

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的HandlerAdapterController等使用了适配器模式。

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中的JdbcTemplateRestTemplate等类提供了简化数据库访问和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的BeanFactoryApplicationContext使用了组合模式。

  • 组件:定义了组合对象和叶子对象的接口。
  • 叶子对象:实现组件接口,不包含子对象。
  • 组合对象:实现组件接口,包含子对象。
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特性,可以显著提升系统的设计质量和开发效率。后面会根据实际项目进行实战

标签:设计模式,Spring,void,模式,class,接口,总览,public
From: https://blog.csdn.net/weixin_40735063/article/details/140474603

相关文章

  • springboot+vue前后端分离项目-项目搭建13-树形表
    效果一、后端1.新建表category 2.新建entity,com/example/demo/entity/Category.java3.新建Mapper,com/example/demo/mapper/CategoryMapper.java 4.新建Controller,com/example/demo/controller/CategoryController.java主要代码逻辑如下,封装成List<Category>,前端结合......
  • Springboot Study-入门&配置
    SpringbootStudy入门&配置1.入门构建了Springboot工程,创建springboot项目,完成了第一个项目helloworld2.配置2.1配置分类:properties>yml>yaml(优先级)2.2yaml基本语法:大小写敏感,数值前要有空格,空格缩进表示层级关系数据格式:*对象*数组(使用“-”表示数组每个元......
  • 基于Springboot的博物馆管理系统
    全文内容包括:1、采用技术;2、系统功能;3、系统截图;4、配套内容。索取方式见文末微信号,欢迎关注收藏!一、采用技术语言:Java1.8框架:SpringBoot数据库:MySQL5.7、8.0开发工具:IntelliJIDEA旗舰版其他:Maven3.8以上二、系统功能用户管理:负责注册用户的信息维护,包括用户账号的创建......
  • SpringBoot-集成 webSocket
    1.WebSocket简介2.springboot集成javax注解方式pom<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>配置类/*****blog.coder4j.cn*......
  • 设计模式——桥接模式
    设计模式——桥接模式1.概述2.基本介绍3.结构4.案例4.1代码实现4.2注意事项4.3使用场景1.概述现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系:我们可以发现有很多的类,假如我们再增加一个形状或再......
  • SpringMVC-拦截器
    文章目录1、拦截器的配置2、拦截器的三个抽象方法3、多个拦截器的执行顺序SpringMVC中的拦截器(Interceptor)是一种强大的机制,用于拦截请求和响应。它允许开发者在请求处理的不同阶段执行预处理和后处理操作,比如日志记录、权限检查、国际化等。以下是关于Sprin......
  • [2024] springboot Hadoop技术下的校园二手交易系统的设计与实现
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......
  • 使用Spring Cloud构建分布式配置中心
    使用SpringCloud构建分布式配置中心大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代的分布式系统中,配置管理是一个至关重要的方面。本文将详细介绍如何利用SpringCloud构建和管理分布式系统的配置中心,以提高系统的灵活性和可维护性。一、SpringC......
  • 使用Spring Data JPA实现持久化层的简化开发
    使用SpringDataJPA实现持久化层的简化开发大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代的Java应用开发中,SpringDataJPA为我们提供了一种简单而强大的方式来操作数据库,本文将深入探讨如何利用SpringDataJPA简化持久化层的开发。一、Spring......
  • 使用Spring Boot和Docker实现微服务的部署与扩展
    使用SpringBoot和Docker实现微服务的部署与扩展大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代软件开发中,微服务架构被广泛采用,而SpringBoot和Docker是实现微服务架构的两大重要技术。本文将详细介绍如何使用SpringBoot和Docker实现微服务的部署......