spring_Bean生命周期流程
2022-11-27 14:59:39 1 举报
登录查看完整内容
记录Bean在spring中生命周期
作者其他创作
大纲/内容
给BeanDefinition对象中的属性赋默认值
如果当前类和某个includeFilter匹配,那就通过这个类
最终获得某些BeanDefinition集合
进行扫描
初始化前
初始化后
利用ASM技术解析每个class文件对象,得到class元数据信息
如果是抽象类,但是又@Lookup注解的方法,则通过
推断构造方法
初始化
实例化前
加载类
public AnnotationConfigApplicationContext() {StartupStep createAnnotatedBeanDefReader = this.getApplicationStartup().start(\"spring.context.annotated-bean-reader.create\");// 额外会创建StandardEnvironmentthis.reader = new AnnotatedBeanDefinitionReader(this);createAnnotatedBeanDefReader.end();this.scanner = new ClassPathBeanDefinitionScanner(this);//BeanDefinition扫描器}
如果当前类和某个excludeFilter匹配,那就排除这个类
使用AnnotationBeanNameGenerator生成beanName(解析@Component注解所指定的beanName,没有则默认生成)
属性注入
如果时抽象类或者接口,则不通过
执行Aware
属性注入后
合并BeanDefinition
都匹配成功后。根据当前类生成一个ScannedGenericBeanDefinition
遍历每个BeanDefinition
判断当前beanName是否在spring容器中已经存在,如果不存在则把beanName以及BeanDefinition注册到Spring容器中,如果扫描多次发现容器中存在beanNama,则返回false,什么都不做(是否兼容,如果兼容返回false表示不会重新注册到Spring容器中,如果不冲突则会抛异常)如果存在则报错
实例化
进一步进行条件注解@Conditional的匹配条件(protected boolean isCandidateComponent(MetadataReader metadataReader))
得到包路径下的所有class文件对象,注意不是Class对象,而是文件对象(可以理解为File对象)
生成Beandefinition
包路径
如果不是顶级类。或静态内部类,则不通过
BeanDefinition后置处理
解析@Lazy、@Primary、@DependsOn、@Role、@Description,并赋给BeanDefinition对应的属性
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);UserService userService = (UserService) applicationContext.getBean(\"userService\");
实例化后
0 条评论
回复 删除
下一页