spring中Bean的生命周期
2023-07-03 12:30:54 9 举报
AI智能生成
spring中Bean的生命周期
作者其他创作
大纲/内容
扫描sacn()
调用BeanDefinitionRegistry的getBeanDefinitionCount()方法获取Bean的数量
doscan()方法
调用findCandidateComponents()方法里的scanCandidateComponents()方法
获取路径下所有的.class文件的file对象
遍历获取类的元数据读取器MetadataReader
判断是否符合excludeFilter、includeFilter的判断,符合则根据元数据读取器生成ScannedGenericBeanDefinition
只是给BeanDefinition的beanClass属性赋值beanName
因为还没有加载类,所以没有类的class对象,利用ASM技术扫描的
判断是否是独立的类、是不是接口、是不是抽象类并且没有@lookup注解
返回BeanDefinition的set集合
遍历BeanDefinition集合
获取这个类的@Scope注解的值
生成beanName
解析@Component注解,取这个注解的value的值作为beanName,没有值返回空
@Component注解没有定义值,则会调用Introspector.decapitalize()方法生成默认beanName
如果类的长度大于1并且类的第一个字母和第二个字母都是大写,那么直接返回类的名字作为beanName
不是则将类名的第一个字符小写作为默认的beanName
调用postProcessBeanDefinition()方法给BeanDefinition设置默认值
解析类上的注解@Lazy、@Primary、@DependsOn、@Role、@Description
检查sprng容器里是否已经存在beanName
不存在,则注册beanName和BeanDefinition对象到beanDefinitionMap里
存在抛异常,beanName已存在,命名时重复导致
存在,判断两个BeanDefinition属于的resource是否相同,相同不抛出异常,不注册,可能是因为扫描了两次导致
初始化非懒加载的单例Bean
ConfigurableListableBeanFactory的preInstantiateSingletons()方法
获取beanName的List集合
遍历beanName,getMergedLocalBeanDefinition()根据beanName获取合并后的RootBeanDefinition
判断是否是懒加载的单例bean
根据beanDefinition的属性判断是FactoryBean
getBean(),这边get的是实现了factoryBean接口的factoryBean,不是getObject()方法返回的bean
继续判断是否实现了smartFactoryBean接口,并且isEagerInit方法返回的ture,调用getObject()返回的bean的getBean()方法将bean放入factoryBeanObjectCache中
getBean()
getBean()
getBean(beanName)
调用transformedBeanName()方法,将传进来的string转化为beanName,有可能是&xxxx,有可能是别名
创建完成再次遍历beanName
判断生成的单例bean是否实现了SmartInitializingSingleton接口
根据beanName去调用getSingleton()方法从单例池里获取bean
存在
不存在
判断父容器里是否有这个bean
getMergedLocalBeanDefinition()获取合并后的beanDefinition
判断返回的beanDefinition是否是抽象的,抽象的则报错
解析@DependOn注解,从beanDefinition的DependsOn属性中获取
循环DependOn报错
调用registerDependentBean()方法,注册被依赖关系,存入dependentBeanMap中
getBean()获取或者创建被依赖的bean
创建bean
单例bean
调用getSingleton()方法
先直接去单例池中获取bean
createBean()方法
加载bean 的类
获取类加载器,默认获取当前线程的类加载器,未取到获取ClassUtil的类加载器
将加载的class对象赋值给beanClass属性
实例化前的Beanpostprocessor
createBeanInstance()方法创建bean实例
处理MergedBeanDefinitionPoestProcessor
实例化后的InstantiationAwareBeanPostProcessor
属性赋值(spring自带的依赖注入@Bean (autowire = Auotowire.by_name)byName,byType)
调用postProcessorProperties()方法处理@Autowired,@Resouce注解,@Value注解
初始化Bean
初始化后
判断bean是否定义销毁的逻辑
将创建的bean放入单例池中
因为有可能是factoryBean需要调用getObjectForBenInstance方法获取对象
原型bean
设置正在创建标志
createBean()方法创建bean
删除设置的标志
因为有可能是factoryBean需要调用getObjectForBenInstance方法获取对象
其他Scope的bean
getBean(beanName,xxxxx.class)
getBean(beanName,Object)
0 条评论
下一页