IoC容器流程图
2020-10-12 19:25:28 9 举报
IoC容器流程图
作者其他创作
大纲/内容
将该BeanDefinitition存入BeanDefinitionReader中
执行Bean中的初始化方法
判断成员变量是否为final
该Bean是否正在被创建?
找到了
将构造方法的每个参数封装为一个InjectedPoint,保存到MultInjectedPoint中,将MultInjectedPoint保存到BeanDefinition中。
用户调用getBean方法,输入指定的Bean
是否是单例Bean?
是
是否找到?
将委托工厂设置为DefaultBeanFactory
容器中是否已经含有这个Bean了?
将ResourceReader注册到委托工厂中
否
根据@Configuration和@Value注解,将配置文件中的值,封装到InjectPoint中。
解析构造方法
是否还有下一个元素?
遍历injectedFields,为Bean的成员变量注入依赖
没有找到
开始
抛出循环依赖异常
该Bean是否为单例Bean?
将委托工厂设置为DefaultJSR250BeanFactory
判断是否循环依赖
如果是单例Bean,将其注册到容器中,下次直接调用
根据@Inject注解,将要注入的成员变量类型储存到InjectPoint,保存到BeanDefination中
抛出BeansException
是否启用jsr250?
返回Bean
将registerSingletons、singletons、singletonProvidersearlySingletons、creatingSingletons中的该Bean移除,并在destroyingSingletons中添加该Bean
获取Bean流程结束,人为调用close方法
将要注入的方法信息封装到InjectPoint中,保存到BeanDefination中
将未注入的Bean注册到creatingSingletons
结束
被@Inject标注的构造方法是否只有一个?
遍历所有单例Bean执行Bean中的destroy方法
是否还有下一个单例Bean?
设置初始化方法
抛出ResolvedException程序终止
将BeanDefinitionReader中的BeanDefinition注册到委托工厂
是否还有下一个Bean?
判断是否启用jsr250注解
获取从扫描路径扫描到的Bean的class对象,存储到Set集合中
方法是否被@PostConstruct标注?
先从单例Bean中寻找该Bean
属性注入完成
抛出NoSuchBean异常
解析成员变量
根据名字/类型,在容器中寻找Bean
调用构造方法,并根据BeanDefinition中的MultInjectedPoint注入参数
生成该Bean的BeanDefinition
解析成员方法
判断方法是否为非抽象方法且为Setter方法
遍历injectedSetter,为setter方法注入依赖,执行setter方法
方法是否被@PreDestroy标注?
抛出ConflictedBeanException运行终止
设置销毁方法
0 条评论
回复 删除
下一页