Spring DI
2020-12-15 21:06:37 0 举报
Spring源码分析之DI时序图
作者其他创作
大纲/内容
transformedBeanName:在该方法中,主要完成两项工作:1、去除对工厂的依赖,即如果传入的名称以&开头,则将&去除,并将处理后的beanName缓存到transformedBeanNamecache中2、如果传入的是别名,则获取原始名称,即以传入的name为key,从aliasMap中获取
getLocalPropertyHandler()
涉及一个简单的策略模式:1、集合类型的属性,解析为目标属性后直接赋值2、非集合类型,通过JDK反射setter()方法进行赋值
getPropertyNameTokens()解析属性名
setPropertyValue()
resolveValueIfNecessary()对注入的属性类型转换
依赖注入
transformedBeanName()
合并Bean定义getMergedLocalBeanDefinition
AbstractPropertyAccessor
createBeanInstance()根据不同的配置选择相应的生成策略:简单工厂、工厂方法、有参构造、无参构造
根据是否存在nstantiationAwareBeanPostProcessorBeanPostProcessor开启AOP代理resolveBeforeInstantiation()
BeanFactory
setPropertyValues()
doGetBean()
若需要提前暴露,则执行addSingletonFactory()
需要注意:1.getSingleton()传入的参数是lambda表达式,类型是ObjectFactory,在执行getObject()时,会触发lambda表达式执行createBean()方法2、该方法中有一些before、after以及单例池缓存,对于理解循环依赖有帮助
判断单例是否存在getSingleton()
instantiateClass()
1、InstantiationAwareBeanPostProccessor调用AbstractAutoProxyCreator中的postProcessBeforeInstantiation()方法生成代理类2、BeanPostProcessor进行advise织入
createBean()
执行属性注入populateBean()
applyPropertyValues
BeanWrapperImpl
processLocalProperty()
AbstractBeanFactory
AbstractAutowireCapableBeanFactory
BeanUtils
在创建、注入完成之后,返回sharedInstancegetObjectForBeanInstance()
DefaultSingletonBeanRegistry
SimpleInstantiationStrategy
这是一个策略模式:如果有方法覆盖,则采用CGLIB代理;如果没有则采用JDK代理。以JDK为例,采用反射,构造方法
processKeyedProperty()
若存在单例getObjectForBeanInstance()
Bean定义为单例getSingleton()
以默认无参为例:instantiate()
setValue()
若不需要生成代理类则调用doCreateBean()
getBean()
AbstractNestablePropertyAccessor
BeanDefinitionValueResolver
实例化
0 条评论
下一页