Spring-IOC加载Bean【十四】bean对象的实例化-主流程
bean对象的实例化,如果没有代理对象,那么只能通过doCreateBean方法实现:
123 //实际创建指定的bean。Object beanInstance = doCreateBean(beanName, mbdToUse, args);return beanInstance;
1、doCreateBeandoCreateBean方法是真的好复杂:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114//实际创建指定的bean。在这一点上,预创建处理已经发生,例如检查postProcessBeforeInstantiation回调。区分默认bean实例化、使用工厂方法 ...
Spring-IOC加载Bean【十三】bean对象的实例化-创建BeanWrapper实例之InstantiationStrategy
在AbstractAutowireCapableBeanFactory的createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) 的方法中,获取新实例BeanWrapper有四种方式:
obtainFromSupplier回调方式没有用到InstantiationStrategy
instantiateUsingFactoryMethod工厂方法方式使用了InstantiationStrategy中的instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner, @Nullable Object factoryBean, Method factoryMethod, Object… args)
autowireConstructor自动注入方式使用了InstantiationStrategy中的instantiate(RootBeanDefinition bd, @Nu ...
Spring-IOC加载Bean【十二】bean对象的实例化-创建BeanWrapper实例之autowireConstructor
本篇分析AbstractAutowireCapableBeanFactory中的autowireConstructor方式获取新实例的BeanWrapper:
1234567891011121314151617181920/** * “自动装配构造函数”(按类型提供构造函数参数)行为。 * 如果指定了显式构造函数参数值, * 还可以使用bean工厂中的bean匹配所有剩余的参数。 * 这对应于构造函数注入: * 在这种模式下,Spring bean工厂能够承载期望基于构造函数的依赖项解析的组件。 * * @param beanName bean的名称 * @param mbd bean的bean定义 * @param ctors 选择的候选构造函数 * @param explicitArgs 参数值通过getBean方法以编程方式传入,如果没有参数值, * 则为{@code null}(->使用bean定义中的构造函数参数值) * @ ...
Spring-IOC加载Bean【十一】bean对象的实例化-创建BeanWrapper实例之instantiateBean
这一部分分析默认构造方法实例化获取实例对象的BeanWrapper,代码相对于前几种方式简单的多,因为没有参数,所以简单:
12345678910111213141516171819202122protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) { try { //调用实例化策略中的instantiate方法实例化 Object beanInstance; final BeanFactory parent = this; if (System.getSecurityManager() != null) { beanInstance = AccessController.doPrivileged((PrivilegedAction<Object>) () -> getInsta ...
Spring-IOC加载Bean【十】bean对象的实例化-创建BeanWrapper实例之instantiateUsingFactoryMethod
使用工厂方法获取新实例的BeanWrapper,使用命名的工厂方法实例化bean。如果mbd参数指定了一个类,而不是factoryBean,或者在使用依赖项注入配置的工厂对象本身上指定了一个实例变量,那么该方法可能是静态的。
123456protected BeanWrapper instantiateUsingFactoryMethod( String beanName, RootBeanDefinition mbd, @Nullable Object[] explicitArgs) { //首先为给定的工厂和实例化策略创建一个新的构造解析器。 //之后调用instantiateUsingFactoryMethod,使用命名的工厂方法实例化bean。 return new ConstructorResolver(this).instantiateUsingFactoryMethod(beanName, mbd, explicitArgs);}
下面分析ConstructorResolver类中的instantiateUsingFac ...
Spring-IOC加载Bean【九】bean对象的实例化-创建BeanWrapper实例之obtainFromSupplier
通过Supplier回调的方式获取新实例的BeanWrapper
12345678910111213141516171819202122232425262728293031protected BeanWrapper obtainFromSupplier(Supplier<?> instanceSupplier, String beanName) { Object instance; //当前创建的bean的名称,用于从用户指定的Supplier回调中触发的getBean等调用的隐式依赖项注册。 //NamedThreadLocal<String> currentlyCreatedBean //获取原先创建bean的名字 String outerBean = this.currentlyCreatedBean.get(); this.currentlyCreatedBean.set(beanName); try { //得到一个结果。有点像工厂模式 instance = in ...
Spring-IOC加载Bean【八】bean对象的实例化-创建BeanWrapper实例之总览
1、创建BeanWrapper实例bean对象实例化的第一步:创建BeanWrapper实例:
1234567891011// 实例化bean。BeanWrapper:Spring底层javabean基础设施的中心接口。 BeanWrapper instanceWrapper = null; //如果是单例模式 if (mbd.isSingleton()) { //未完成的FactoryBean实例缓存中删除beanName instanceWrapper = this.factoryBeanInstanceCache.remove(beanName); } if (instanceWrapper == null) { //使用适当的实例化策略为指定的bean创建一个新实例:工厂方法、构造函数自动装配或简单实例化。 instanceWrapper = createBeanInstance(beanName, mbd, args); }
...
Spring-IOC加载Bean【七】bean对象的实例化准备
不管是单例还是原型模式,bean原始实例都是通过createBean方法创建,在AbstractBeanFactory中,createBean是一个抽象方法:
123//为给定的合并bean定义(和参数)创建bean实例。对于子定义,bean定义已经与父定义合并。所有bean检索方法都将委托给该方法进行实际的bean创建。 protected abstract Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException;
该方法的默认实现在AbstractAutowireCapableBeanFactory中定义。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354//该类的中心方法:创建bean实例、填充bean实例、应用后处理程序等。 @O ...
Spring-IOC加载Bean【六】获取原始bean实例getObjectForBeanInstance
引言从单例缓存中获取的bean原始实例,通过单例模式、原型模式或者request/session/global session等获取的bean原始实例,可能并不是我们想要的bean对象,需要通过方法:getObjectForBeanInstance获取真正的bean对象。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546//获取给定bean实例的对象,对于FactoryBean,要么是bean实例本身,要么是它创建的对象。 protected Object getObjectForBeanInstance( Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) { // name以“&”开头 if (BeanFactoryUtils.isFactoryDerefe ...
Spring-IOC加载Bean【五】各scope的bean原始实例的创建
本篇文章分析各个作用域的bean的获取
单例
原型
其他
在这贴上整个流程代码:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768//创建bean实例。 //判断scope是不是"singleton",如果scope为空,也走单例模式。 if (mbd.isSingleton()) { //返回在给定名称下注册的(原始)单例对象,如果还没有注册,则创建并注册一个新的单例对象。 sharedInstance = getSingleton(beanName, () -> { try { //为给定的合并bean定义(和参数)创建bean实例。 ...