十二、Spring MVC源码学习(AbstractAutowireCapableBeanFactory)

createBean执行流程分析:

1.根据beanDefinition获取字节码(resolveBeanClass)

2.对方法重写的处理(RootBeanDefinition.prepareMethodOverrides)

3.实例化前的解析(resolveBeforeInstantiation)-------------->后置处理器(BeanPostProcessors)执行,返回代理后的对象

4.创建bean(doCreateBean)

           4.1 为单例---------->factoryBeanInstanceCache中  移除key = ‘name’的对象

           4.2 如果4.1步返回的对象==null  执行createBeanInstance()


createBeanInstance执行流程:

1.根据beanDefinition获取字节码(resolveBeanClass)

2.判断类是否是public---------->否,抛异常

3.获取工厂方法的名称(RootBeanDefinition.getFactoryMethodName)------------>不为null,返回instantiateUsingFactoryMethod

4.RootBeanDefinition.resolvedConstructorOrFactoryMethod !=null  并且constructorArgumentsResolved==true------------> return autowireConstructor()

   RootBeanDefinition.resolvedConstructorOrFactoryMethod !=null  并且constructorArgumentsResolved==false------->return instantiateBean()

5.根据条件 调用return autowireConstructor();

6.默认调用无参构造 instantiateBean( );---------------->对象创建完成

7.bean不需要后置处理--------------->执行后置处理器去修改合并后的beanDefinition

8.将对象放入缓存

9.填充对象中的属性,注入对象(populateBean)


instantiateBean执行流程:

1.系统开启了安全管理    ----------------->授予特权AccessController.doPrivileged,执行getInstantiationStrategy().instantiate

2.系统没开启安全管理---------------------->执行getInstantiationStrategy().instantiate(),返回实例化的对象

3.将实例化的对象填充一些属性变为BeanWrapper

4.初始化BeanWrapper(注册定制的处理器)

注:getInstantiationStrategy() 默认返回CglibSubclassingInstantiationStrategy


CglibSubclassingInstantiationStrategy.instantiate执行流程:

1.没有方法的重写

          1.1 如果resolvedConstructorOrFactoryMethod ==null,特殊处理

                   1.1.1 获取类的字节码 ,如果为接口,抛异常

                   1.1.2  在字节码中获取构造器

                   1.1.3  把构造器存入resolvedConstructorOrFactoryMethod

          1.2 根据构造器实例化对象(BeanUtils.instantiateClass)--------------->反射创建对象

2.有方法的重写

                                                                                                   

猜你喜欢

转载自blog.csdn.net/qq2413273056/article/details/82789803
今日推荐