栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring、springbean的生命周期

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring、springbean的生命周期

什么是spring

spring是一个轻量级的控制反转和面向横切面编程的框架。

springbean的生命周期

什么是springBean的生命周期?

Bean从在Spring中创建开始,到Bean被销毁结束,这一过程称之为Bean的生命周期。
soringbean的生命周期可以分为五个部分,对象的创建、依赖注入、初始化,使用和销毁。

1:对象的创建

构造器推断

首先实例化就是利用类的构造器创建对象的过程,那么在实例化之前一定要知道用哪一个构造器,这就是构造器推断,这个步骤是由AutowiredAnnotationBeanPostProcessor找出哪些构造器上有@Autowired注解,寻找的过程是
1:对beanClass中所有的构造器进行遍历,找到带有@Autowired注解的构造器加入到候选构造器集合中。
2:对候选构造器集合中的内容进行遍历,找到@Autowired注解中require属性是否是true(默认是true),如果是,则不能再有其他@Autowired注解的构造器,有的话就报异常。如果不是,那就可以继续添加带有@Autowired注解并且require属性为false的构造器。
3:如果候选构造器集合不为空,并且beanClass中还有空构造器。那么就将该空构造器加入到构造器集合中。如果构造器集合为空,且beanClass中只有一个有参的构造器那么就会将此构造器加入到构造器集合中。如果这种情况下还没有有参构造只有无参构造那就会使用无参构造,如果有多个构造器也会使用无参构造。

对象的实例化

ConstructorResolver根据候选构造器集合中构造器的优先级对beanClass进行实例化,这个过程主要有三个问题

1:在创建对象前后执行方法

创建前后的增强

postProcessBeforeInstantiation

这里返回的对象若不为 null 会替换掉原本的 bean,并且仅会走 postProcessAfterInitialization 流程 postProcessAfterInstantiation

这里如果返回 false 会跳过依赖注入阶段

2:构造器的优先级怎样确定

首先public修饰的构造器优先权高于private修饰的构造器。
修饰相同的情况下构造器参数多的优先权更高。

3:如果选定的构造器中需要的bean不在Spring容器中怎么办?

首先对根据优先级排序好的bean进行遍历尝试调用,如果正常调用就没问题,并直接退出遍历,如果出现了参数不在spring容器中则遍历下一个bean,如果没有一个可以调用的就会抛出异常。

2: 依赖注入(对属性进行填充)

依赖注入涉及到以下几个问题

依赖注入前的增强

postProcessProperties

如 @Autowired、@Value、@Resource

1:BeanDefination:找到被@Autowired、@Value,@Resource,@Inject等注解注解的属性

这个过程由下面两个处理器来进行处理

1、AutowiredAnnotationBeanPostProcessor:处理@Autowird,@Value,@Inject注解

2、CommonAnnotationBeanPostProcessor:处理@PostConstruct,@PreDestroy,@Resource注解

处理的过程是首先遍历bean中所有的属性和方法,判断是都有上面相关的注解,有的话就把他们都封装到一个叫做Injectionmetadata的对象中,然后对这个对象中的成员进行判断是否被注解了两次,比如被@Autowird、@Resource同时注解,没有被解析就会被放到已经检查的元素集合中,检查过了就不会放入,这样就避免了重复解析。

真正的依赖注入

使用beanName为key从缓存中取出Injectionmetadata,然后对它进行遍历,根据类型从spring容器中获取对应的对象,然后利用反射注入到bean的属性中。

3:初始化

初始化的过程涉及初始化前增强,初始化方法,初始化后的增强

初始化前的增强:postProcessBeforeInitialization

这里返回的对象会替换掉原本的 bean如 @PostConstruct、@ConfigurationProperties处理一系列Aware接口的回调方法

执行初始化的方法

初始化后的增强:postProcessAfterInitialization

这里返回的对象会替换掉原本的 bean如代理增强

4:使用
5:卸载

执行 @PreDestory的方法

如果 Bean 实现了 DisposableBean 这个接口,会调用那个其实现的 destroy()方法;

最后,如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调用其配置的
销毁方法。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/785572.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号