Spring的bean生命周期
2023-07-31 18:22:26 0 举报
Spring的bean生命周期
作者其他创作
大纲/内容
Spring提供了一个扩展点,允许用户来控制是否在某个或某些Bean实例化之前做一些启动动作。这个扩展点叫InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()
得到包路径下所有class文件对象,不是class对象而是文件对象【可以理解为File对象】
实例化前
Bean对象实例化出来之后,接下来就应该给对象的属性赋值了。在真正给属性赋值之前,Spring又提供了一个扩展点MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition(),可以对此时的BeanDefinition进行加工
ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry
属性注入后
推断构造方法
如果是抽象类,但是有@Lookup注解的方法则通过
实例化后
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);获取合并的BeanDefinition
初始化BeanFactory
在处理完BeanDefinition后,Spring又设计了一个扩展点:InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()
完成了属性赋值之后,Spring会执行一些回调,包括:1. BeanNameAware:回传beanName给bean对象。2. BeanClassLoaderAware:回传classLoader给bean对象。3. BeanFactoryAware:回传beanFactory给对象。
实例化
构造方法注册的this.reader = new AnnotatedBeanDefinitionReader(this);里面有个重要的方法调用 AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry) 它注册了几个重要的后置处理器ConfigurationClassPostProcessor AutowiredAnnotationBeanPostProcessor
根据BeanDefinition去创建一个对象
初始化后
调用AnonotionBeanNameGenertor 生成beanName
执行BeanFactory后置处理器
加载类
初始化前,也是Spring提供的一个扩展点:BeanPostProcessor.postProcessBeforeInitialization(),比如执行@PostConstruct的方法, ApplicationContextAware
我们会进行属性注入,我们把它分为注入和后置,注入指的是Spring自动注入set这些方法,后置就是调用后置处理器对前面查找到的注解(@Autowired等)字段或方法进行注入
如果是抽象类或者接口则不通过
初始化
就会处理@Autowired、@Resource、@Value等注解,也是通过InstantiationAwareBeanPostProcessor.postProcessProperties()扩展点来实现的
扫描结束
初始化前
进一步进行条件注解【用@Condition】匹配筛选
1. 查看当前Bean对象是否实现了InitializingBean接口,如果实现了就调用其afterPropertiesSet()方法2. 执行BeanDefinition中指定的初始化方法
利用ASM技术,解析每个class文件对象,并得到元数据信息
遍历每个BeanDefinition
给BeanDefinition中的对象赋默认值
执行Aware
解析@Lazy @Primary @DependOn @Role @Description等属性 并赋值给BeanDefinition对应的属性
属性注入
最终扫描到某些BeanDefinition
如果不是顶级类或者静态内部类则不通过
调用org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#scanCandidateComponents(String basePackage)扫描某个包路径,并得到BeanDefinition的Set集合扫描包路径下所有.class文件MetadataReader metadataReader =getMetadataReaderFactory().getMetadataReader(resource);使用ASM技术去读取,不用实际加载整个class对象到JVM。
使用
进行扫描
先后顺序1.调用@PreDestroy注解 2. 当前Bean是否实现了DisposableBean接口或者AutoCloseable接口 3.BeanDefinition中是否指定了destroyMethod
销毁
创建BeanFactory
如果当前类和某个inclludeFilter匹配,那就通过这个类
生成BeanDifinittion
合并BeanDifinittion
总结BeanPostProcessor1. InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()2. 实例化3. MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()4. InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()5. 自动注入6. InstantiationAwareBeanPostProcessor.postProcessProperties()7. Aware对象8. BeanPostProcessor.postProcessBeforeInitialization()9. 初始化10. BeanPostProcessor.postProcessAfterInitialization()
都匹配成功后,根据当前类生成一个ScanedFGerenicBeanDefinition
BeanDefinition的后置处理器
包路径
启动ApplicationContext
这是Bean创建生命周期中的最后一个步骤,也是Spring提供的一个扩展点:BeanPostProcessor.postProcessAfterInitialization(),Spring中的AOP就是基于初始化后实现的,初始化后返回的对象才是最终的Bean对象。
如果当前类和某个exclludeFilter匹配,那就排除这个类
0 条评论
下一页