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.有方法的重写