Spring ioc 依赖注入及lazy-init
2016-03-10 10:05:34 38 举报
Spring IOC 流程图
作者其他创作
大纲/内容
资源定位、加载、解析、注册:obtainFreshBeanFactory()
根据类型自动注入--属性注入:autowireByType()
DefaultSingletonBeanRegistry
获取bean属性值 :resolveValueIfNecessary()
AbstractBeanFactory(各种方式依赖注入口)
回调:init-mehtod配置的bean方法
根据-当前bean如果不是抽象类,且是单例,且lazy-init 不为true,循环调用getBean(),生成所有bean实例及其依赖的bean并ioc注册。preInstantiateSingletons()
1:普通class实例化:instantiateClass()
获取创建实例策略getInstantiationStrategy()
1:BeanDefinition保存所有bean定义及依赖关系2:解析所有bean定义,存储到BeanDefinition中3:getBean()时,触发ioc依赖注入4:getBean()由使用或者context中的finishBeanFactoryInitialization()循环触发(判断是否lazy,是否是单例)5:创建bean自身---由factoryBean或者自定义的facotry-method或者默认构造方法(cglib或class.newInstance())6:ioc 依赖注入: A: - BeanDefinitionValueResolver,判断各种属性类型获取属性值(如果ref引用类型,递归调用getBean(),其它则返回对应值---注意此处会调用converter???) B: - 正式注入:BeanWrapper.setPropertyValues()
AbstractAutowireCapableBeanFactory
实现化bean:instantiate()
类classloader双亲委派-不过先由本factory--getBean()
自动注入--autowired自动注入:postProcessPropertyValues
处理集合类型:
执行processor:applyBeanPostProcessorsBeforeInitialization()
通过bean定义的工厂方法创建实例instantiateUsingFactoryMethod()
2:spring ioc - 依赖注入及lazy-init
BeanDefinitionValueResolver(IOC依赖注入核心)
doCreateBean()
自动注入是否返回bean
refresh()
获取bean实例-getSingleton()
bean实现化后处理procesor---postProcessAfterInstantiation()
实现化:Class.newInstance()
AbstractApplicationContext
1:检查是否配置destroy方法2:检查是否配置 了DestructionAwareBeanPostProcessor3:如果有以上方法,把当前bean包括以下功能封装成包括对象缓存起来
2:cglib 实例化(由子类实现)instantiateWithMethodInjection()
for循环
RootBeanDefinition
cglib 实例化instantiateWithMethodInjection()
注册bean-destory方法:registerDisposableBeanIfNecessary()
获取bean实例-createBean()
调用bean-init方法:initializeBean()
BeanPostProcessor
核心:处理引用类型:ref--resolveReference()
获取当前bean所有依赖的bean名-getDependsOn
通过带参构造方法创建实例determineConstructorsFromBeanPostProcessors()
CglibSubclassingInstantiationStrategy(CGLIB)
递归调用:最终的beann属性一定是基本类型,从而停止递归
执行init-method前拦截:postProcessBeforeInitialization()
SimpleInstantiationStrategy
BeanUtils
创建bean及触发依赖注入doGetBean()
执行init-method后拦截:postProcessAfterInitialization()
processor是否返回false
执行processor:applyBeanPostProcessorsAfterInitialization()
InstantiationAwareBeanPostProcessor
创建实例createBeanInstance()
bean后处理:finishBeanFactoryInitialization()
普通注入:开始注入:applyPropertyValues()
正式注入:BeanWrapper.setPropertyValues()
ConfigurableListableBeanFactory(DefaultListableBeanFactory )
是否有自动注入processor
Start
ioc属性注入:populateBean()
通过默认不带参构造方法创建实例instantiateBean()
处理普通类型:string
根据名自动注入--属性注入:autowireByName()
0 条评论
回复 删除
下一页