spring获取bean底层实现详解
2022-11-23 17:38:36 0 举报
spring获取bean底层实现详解
作者其他创作
大纲/内容
bean是FactoryBean对象,并且name是beanName(userService),就是获取FactoryBean的getObject方法返回的对象
判断是否循环依赖,即A depends B && B depends A
BeanFactoryName
否
如果bean实现了BeanFactory接口,那么传 &beanName 是获取实现了BeanFactory的这个bean实例,若传的是 beanName,那么获取的就是BeanFactory的getObject方法返回的bean对象实例
是否存在父BeanFactory,若存在且beanDefinitionMap中没有存在此bean的BeanDefinition,那么从父BeanFactory中取获取bean实例对象
是否需要进行初始化后处理
放入两个map缓存中dependentBeanMap:某个Bean被哪些Bean依赖了dependenciesForBeanMap:某个Bean依赖了哪些Bean
是否是单例 &&singletonObjects中是否有beanName对象实例
从别名 aliasMap中获取真正的beanName,例如@Bean(name = {\"user\
getSingleton(beanName);
!(beanInstance instanceof FactoryBean)
检查BeanDefinition是不是Abstract的
BeanFactoryUtils.transformedBeanName(name)
1.getBean(String name) (通过beanName获取bean对象实例)例如:serService userService = (UserService) applicationContext.getBean(\"userService\
factoryBeanObjectCache中没有bean对象,则执行getObject方法获取对象
BeanFactoryUtils.isFactoryDereference(name)
是否有@DependsOn注解
否,判断是否是单例的bean
从aliasMap中获取真正的beanName
AbstractBeanFactory.java
是
mbd.isSingleton()
sharedInstance != null && args == null
markBeanAsCreated(beanName);
getMergedLocalBeanDefinition(beanName);
单例池中的对象不是FactoryBean,则直接返回bean实例
parentBeanFactory != null && !containsBeanDefinition(beanName)
否,放入缓存factoryBeanObjectCache
factory.isSingleton() && containsSingleton(beanName)
如果&xxx(&userService),那么就直接返回单例池中的对象
!(mbd != null && mbd.isSynthetic())
mbd.getDependsOn();
getBean(dep);
检查通过name所获得到的beanInstance的类型是否是requiredType
创建bean实例,添加到singletonObjects缓存中
是单例的
创建bean实例
否,则创建bean实例,标记bean正在创建中
canonicalName(BeanFactoryUtils.transformedBeanName(name));
canonicalName(String name)
放入缓存factoryBeanObjectCache
直接从单例池(singletonObjects)中获取bean实例
这里没有区分bean的scope,也就是单例,原型等就去单例池中获取bean对象,我觉得是80%以上的bean都是单例的,而且直接从内存的concurrentMap中获取对象速度也非常快
transformedBeanName(name);
从factoryBeanObjectCache缓存中获取
是原型的:prototype
如果从单例池中拿到的对象不为null,并且构造函数的参数为null
return object;
从mergedBeanDefinitions缓存中获取RootBeanDefinition,若没有则合并(父子属性合并,取并集,子类覆盖父类相同的属性,若没有父类,new RootBeanDefinition
表示单例池中没有此bean实例,所以需要创建
获取真正的beanName
返回对象
创建依赖的bean实例
执行getObject()方法,返回的object不可能为null(会返回NullBean)
其他类型的:session,request等
获取beanName
spring 5.3.10
0 条评论
下一页