1.spring源码解析bean初始化与依赖注入四
2.Spring 中经典的创建 9 种设计模式,打死也要记住啊!单例单例
3.Spring创建bean详解--实例化bean
spring源码解析bean初始化与依赖注入四
深入解析Spring源码的源码bean初始化与依赖注入部分,我们将继续从上一篇文章的实现
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean方法入手。
随后,创建方法调用
org.springframework.beans.factory.support.AbstractBeanFactory#registerDisposableBeanIfNecessary进行注册
紧接着,单例单例燕窝溯源码025厂调用
org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean获取bean实例。源码
在这一过程中,实现我们到达了
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#destroySingleton用于销毁单例bean。创建
然后,单例单例再次深入
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean方法进行bean的源码创建。
紧接着,实现调用
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation对bean进行前置解析。创建laravel源码解析
之后,单例单例再次返回
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean进行bean实例化。源码
然后,调用
org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean再次获取bean实例。
紧接着,进入
org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons进行单例bean的预实例化。
最终,完成bean的初始化后触发回调。
返回
org.springframework.context.support.AbstractApplicationContext#refresh执行上下文刷新,完成bean初始化与依赖注入。
至此,本次关于Spring源码中bean初始化与依赖注入的随便下源码解析告一段落,以上内容仅供学习参考。
Spring 中经典的 9 种设计模式,打死也要记住啊!
Spring中的设计模式总结,包含以下经典9种模式,是开发者不可忽视的核心知识。
简单工厂模式,通过BeanFactory实现,基于唯一标识动态生成Bean对象,实现松耦合与额外处理。
工厂方法模式,利用FactoryBean接口,英文导航源码其返回值并非Factory实例,而是Factory.getObject()方法返回的值,典型应用如Spring与MyBatis的集成。
单例模式,Spring默认实现单例,通过AbstractBeanFactory的getSingleton()方法创建实例,提供全局访问点。
适配器模式,SpringMVC中的HandlerAdapter实现,根据规则执行不同Handler,简化扩展过程。
装饰器模式,源码创建程序通过Wrapper或Decorator类动态添加对象职责,相比生成子类更灵活。
代理模式,SpringAOP底层实现动态代理,不需手动编写代理类,简化对象控制。
观察者模式,Spring事件驱动模型使用,通过事件源、事件、事件监听器实现。
策略模式,通过Resource接口访问底层资源,Spring提供不同实现类对应不同资源。
模板方法模式,父类定义调用顺序与部分特定方法由子类实现,利于代码复用与减少重复代码。
Spring模板方法模式实质结合模板方法与回调模式,几乎全部外接扩展采用此模式实现。
JdbcTemplate使用模板方法与回调接口相结合,统一资源获取与释放,简化数据访问。
Spring创建bean详解--实例化bean
Spring框架中,创建bean是一个核心过程,下面将详细阐述其步骤。
首先,进入createBean的入口,需要参考Spring的初始化单例池的相关内容。
接下来,确认当前的bean定义已经解析了class,并复制当前的bean定义,这一步骤在AbstractAutowireCapableBeanFactory.createBean方法中执行。
在实例化bean之前,会执行实现了InstantiationAwareBeanPostProcessor接口的postProcessBeforeInstantiation方法。如果该方法返回了对象,则会跳过实例化后的方法,并设置对象已实例化,返回当前bean。
在实例化bean时,首先需要获取构造方法。这一过程包括以下步骤:从工厂bean的缓存中获取并移除缓存,如果不存在实例化bean,则进行推断构造方法。Spring使用SmartInstantiationAwareBeanPostProcessor的determineCandidateConstructors方法来推断构造方法。如果推断出有参数的构造方法,则使用有参构造方法进行初始化;否则,使用无参构造方法。
对于无参实例化,使用CglibSubclassingInstantiationStrategy的instantiate方法。该方法包括获取Class、获取默认无参构造方法和创建实例对象并返回等步骤。
在有参实例化时,基于bean工厂创建构造方法解析器,并对多个构造方法进行排序(根据参数的个数),使用第一个。接下来,获取有参构造方法的构造参数的参数数量,并判断是否使用ConstructorProperties指定参数的名字。如果没有指定,则获取参数的名字。然后,获取构造参数用于实例化bean,执行Autowired注解逻辑,并根据构造参数实例化bean并返回。
在实例化完成后,执行postProcessMergedBeanDefinition切入点,添加三级缓存,并执行实例化后的切点服务,这一步在AbstractAutowireCapableBeanFactory.populateBean方法中完成。