Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring中使用到的设计模式及其源码分析

Spring中使用到的设计模式及其源码分析

原创
作者头像
祁画
发布于 2024-07-24 02:44:21
发布于 2024-07-24 02:44:21
1500
举报

前言

众所周知,Spring框架是一个强大而灵活的开发框架。这不,上周的面试刚问到这些,没防住!!!因此下来总结一下。这篇文章主要介绍Spring中使用到的设计模式,自己做个面试复盘,同时希望能帮助到其他小伙伴儿们。

工厂模式

相信大家面试题都背过,Spring通过工厂模式来创建和管理Bean的实例。工厂模式主要定义了一个用于创建对象的接口,让子类决定实例化哪一个类。在Spring中,BeanFactoryApplicationContext接口是实现工厂模式的关键。

那么什么是BeanFactoryApplicationContext呢???👇👇👇

BeanFactory是Spring中最底层的容器接口,它提供了基础的依赖注入功能。ApplicationContext扩展了BeanFactory,并添加了更多高级功能,比如国际化、事件传播、资源加载等(这个也是面试重点!!!)。

我们以ApplicationContext为例,它提供了getBean(String name)方法来获取Bean实例。当调用这个方法的时候,ApplicationContext会根据配置信息创建或获取Bean实例。

代码语言:java
AI代码解释
复制
	ApplicationContext context = new ClassPathXmlApplicationContext("springDemo.xml");  

	MyBean myBean = context.getBean("myBean", MyBean.class);

AbstractApplicationContextgetBean方法通过调用getBeanFactory().getBean()来实际获取Bean实例。而BeanFactory的实现类(比如DefaultListableBeanFactory)负责根据Bean的定义和依赖关系来创建和管理Bean实例。

单例模式

Spring中的Bean默认都是单例的,因此在整个Spring IoC容器中,每个Bean只会有一个实例。这是通过Bean的scope属性来进行控制的,当scopesingleton时,就表示使用单例模式。

翻阅了Spring的源码发现:👇👇👇

Spring通过DefaultSingletonBeanRegistry类中的singletonObjects(类型为ConcurrentHashMap)来管理单例Bean的实例。当请求一个Bean时,Spring会首先检查这个Map中是否已存在该Bean的实例,如果存在则直接返回,否则创建新的实例并添加到Map中。

代码语言:java
AI代码解释
复制
	private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);  
	public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {  
	    Assert.notNull(beanName, "Bean name must not be null");  
	    synchronized (this.singletonObjects) {  
	        Object singletonObject = this.singletonObjects.get(beanName);  
	        if (singletonObject == null) {  
	            // 创建新的Bean实例
	            singletonObject = singletonFactory.getObject();  
	            // 添加到单例注册表中
	            this.singletonObjects.put(beanName, singletonObject);  
	        }  
	        return singletonObject;  
	    }  
	}

代理模式

这道题相信大家都会,面试经常被问到哈哈。Spring的AOP功能中使用了代理模式。AOP通过在目标方法执行前后添加额外的行为(比如日志、事务管理这些),而这些额外的行为是通过代理对象来实现的。Spring提供了两种代理方式:JDK动态代理和CGLIB代理。

Spring的AOP实现主要在DefaultAopProxyFactory类中。这个类负责根据配置决定使用哪种代理方式,并创建代理对象。

代码语言:java
AI代码解释
复制
	if (isProxyTargetClass()) {  
	    // 使用CGLIB代理  
	    return createCglibProxy(beanClassLoader, beanFactory, beanClass, beanName, targetSource, interceptedMethods, proxyTargetClass);  
	} else {  
	    // 使用JDK动态代理  
	    return createJdkDynamicProxy(beanClassLoader, beanFactory, beanClass, interfaces, interceptedMethods, proxyTargetClass);  
	}

createJdkDynamicProxy这个方法中,Spring通过Proxy.newProxyInstance方法创建一个实现了目标对象接口的代理对象,并将所有调用转发到目标对象,同时还可以在调用前后插入额外的行为。

模板方法模式

谈论到模板方法模式,相信大家都较为熟悉。比如在前面提过的AQS中也有模板方法模式的影子。

在Spring的JdbcTemplateHibernateTemplate这些类中,都使用了模板方法模式。这些类定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。

JdbcTemplate为例,它定义了如queryupdate等方法,这些方法包含了数据库操作的通用流程(打开连接、执行SQL、处理结果集、关闭连接等),而具体的SQL语句和参数则由调用者提供。

观察者模式

Spring的事件驱动模型使用了观察者模式。当某个事件发生时,所有注册为该事件监听器的对象都会收到通知,并且根据需要作出响应。

Spring的ApplicationEvent和ApplicationListener接口是实现观察者模式的关键。ApplicationEvent是事件对象,包含了事件的信息;ApplicationListener是监听器接口,定义了处理事件的方法。

代码语言:java
AI代码解释
复制
public class CustomEvent extends ApplicationEvent {  
    private final String message;  
    public CustomEvent(Object source, String message) {  
        super(source);  
        this.message = message;  
    }  
  
    public String getMessage() {  
        return message;  
    }  
}  
  
// 实现监听器  
@Component  
public class CustomEventListener implements ApplicationListener<CustomEvent> {  
    @Override  
    public void onApplicationEvent(CustomEvent event) {  
        // 处理事件  
        System.out.println("Received custom event - " + event.getMessage());  
    }  
}

在Spring的AbstractApplicationContext中,通过ApplicationEventMulticaster来管理事件的发布和监听。当事件被发布时,ApplicationEventMulticaster会通知所有注册的监听器。

策略模式

策略模式在Spring中主要用于定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换。相信大家看过Spring中bean的生命周期这道面试题。Spring的BeanFactoryPostProcessorBeanPostProcessor这些接口可以被视为策略模式的应用,因为它们允许开发者在Bean的创建和初始化过程中插入自定义的逻辑。

BeanFactoryPostProcessor允许在BeanFactory标准初始化之后,修改BeanFactory的内容。这个时候我们可以实现这个接口来定义自己的策略,然后在Spring的配置文件中注册这个Bean。

Spring还有一些其他的设计模式,看到这里面试以及能防得住了,后续再介绍其他的设计模式。

本篇文章到这里就结束了,感谢各位小伙伴们的支持!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊Spring中最常用的10种设计模式
苏三的宝藏网站(面试题、简历模版、项目实战什么都有):http://www.susan.net.cn
苏三说技术
2025/06/16
2360
聊聊Spring中最常用的10种设计模式
谈谈Spring用到了哪些设计模式?
所谓代理,是指它与被代理对象实现了相同的接口,客户端必须通过代理才能与被代理的目标类进行交互,而代理一般在交互的过程中(交互前后),进行某些特定的处理,比如在调用这个方法前做前置处理,调用这个方法后做后置处理。
名字是乱打的
2022/06/08
4260
谈谈Spring用到了哪些设计模式?
9种设计模式在Spring中的运用,一定要非常熟练!
BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。
良月柒
2020/03/04
2.7K0
9种设计模式在Spring中的运用,一定要非常熟练!
Spring技术知识点总结之七——Spring的设计模式
接上篇《Spring技术知识点总结之六——Spring 事务传播等级》 七. SpringBean 的设计模式? 7.1 简单工厂(非23种设计模式中的一种) 参考地址:《【小家Spring】Spring的Bean定义注册中心BeanDefinitionRegistry详解》 实现方式:BeanFactory。 Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是在传入参数后创建,还是传入参数前创建,这个要根据具体情况来定。 实质:由一个工厂
剑影啸清寒
2020/07/10
3860
常用开源框架中设计模式使用分析(全)
说起来设计模式,大家应该都耳熟能详,设计模式代表了软件设计的最佳实践,是经过不断总结提炼出来的代码设计经验的分类总结,这些模式或者可以简化代码,或者可以是代码逻辑开起来清晰,或者对功能扩展很方便...。
加多
2018/09/06
1.3K0
常用开源框架中设计模式使用分析(全)
谈谈Spring中都用到了那些设计模式
看看Spring和SpringMVC源码还是有必要的,而且里面用了很多经典的设计模式,所以从源码角度分析一下Spring中的设计模式。
CBeann
2023/12/25
2020
面试官:“谈谈Spring中都用到了那些设计模式?”。
JDK 中用到了那些设计模式?Spring 中用到了那些设计模式?这两个问题,在面试中比较常见。我在网上搜索了一下关于 Spring 中设计模式的讲解几乎都是千篇一律,而且大部分都年代久远。所以,花了
用户2164320
2019/05/23
5300
面试官:“谈谈Spring中都用到了那些设计模式?”。
能讲一下Spring用了哪些设计模式吗?
一个优秀的框架肯定离不开各种设计模式的运用,Spring框架也不例外。因为网上很多文章比较散乱,所以想总结一下在Spring中用到的设计模式,希望大家看完之后能对spring有更深层次的理解。
用户5546570
2020/12/16
5320
能讲一下Spring用了哪些设计模式吗?
面试官:谈谈Spring中用到了哪些设计模式?
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。 Spring 框架中广泛使用了不同类型的设计模式。
共饮一杯无
2022/11/28
5480
面试官:谈谈Spring中用到了哪些设计模式?
Spring中用到了哪些设计模式?
一位应届毕业生被问到这样一道面试题,说Spring用到了哪些设计模式?其实只要Spring使用得够熟练,回答这道题还是非常轻松的。因为Spring的命名非常规范,基本上从类名就可以看得出来用到了哪些设计模式。
Tom弹架构
2022/12/19
4190
Spring中用到了哪些设计模式?
Spring中使用的设计模式
  Spring框架是每个java程序猿入门级的框架也是最重要的框架,而Spring中也采用了很多的设计模式,这些也会成为我们面试过程中经常会问到的问题,所以本文就整理出Spring中具体使用的哪些设计模式。
用户4919348
2019/04/02
5050
Spring中使用的设计模式
Spring中所使用的设计模式
Spring是一个非常优秀的开源框架,项目源码中所使用的设计模式随处可见,这篇文章主要记录一下Spring中常见的设计模式:
全栈程序员站长
2022/06/29
5870
Spring中所使用的设计模式
Spring源码浅析——事件和异步事件
观察者模式(Observer Pattern)是一种设计模式,用于在对象之间定义一种一对多的依赖关系,以便当一个对象的状态发生变化时,所有依赖于它的其他对象都能够自动接收通知并做出相应的处理。
用户1413827
2023/11/28
4730
阿里二面:Spring框架使用了哪些设计模式?
当A对象需要调用B对象的方法时,我们需要在A中new一个B的实例,我们把这种方式叫作硬编码耦合,缺点是一旦需求发生变化,比如需要使用C类来代替B时,就要改写A类的方法。
JavaEdge
2021/12/07
2790
阿里二面:Spring框架使用了哪些设计模式?
Spring框架的设计模式
Spring 的核心功能是 IOC 容器以及 AOP 面向切面编程,同样也引入很多设计模式,提高代码的扩展性和灵活性。
微观技术
2020/08/20
3820
面试官来了:说说你对Spring事件发布&监听源码的理解?
之前做个数据统计的需求,就是用的Spring事件发布与监听机制(用于采集基础数据),今天做个小小的总结。
后台技术汇
2022/05/28
4150
面试官来了:说说你对Spring事件发布&监听源码的理解?
Spring项目中使用的设计模式
ServletContextResource:访问相对于 ServletContext 路径里的资源的实现类.
JiahuiZhu1998
2022/10/09
3960
Spring读源码系列08----容器扩展功能--下
前两篇文章已经讲述完了refresh方法中一部分的步骤,今天这篇文章就结束该方法的讲解,那么先从registerBeanPostProcessors方法讲起吧
大忽悠爱学习
2022/05/10
3790
Spring读源码系列08----容器扩展功能--下
7000字长文带你深入IOC加载流程
来看一下传统的干活方式:在对象单一职责原则的基础上,一个对象很少有不依赖其他对象而完成自己的工作,所以这个时候就会出现对象之间的依赖。而体现在我们的开发中,就是需要什么对象的时候,就创建什么对象,此时对象创建的控制权在我们自己手里。当对象创建的太多的时候,就会出现一个对象更改,就得更改所有依赖它的对象,耦合性大。自主性体现的同时也出现了对象耦合严重的情况。
石的三次方
2021/01/05
8300
最简 Spring IOC 容器源码分析
许多文章都是分析的 xml 配置,但是现在 Spring Boot 开发多基于注解。本文从注解的角度分析 Spring IOC 容器源码。
Yano_nankai
2019/11/11
6230
相关推荐
聊聊Spring中最常用的10种设计模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档