SpringBean生命周期
一般指的是 bean 在容器中创建 -初始化-销毁的过程,在这之前会先进行bean的定义
先定义,再初始化
定义:
- Resource定位,定位到配置XML或者注解
- BeanDefinition载入,将Resource定位到的bean的信息保存到Bean的定义(BeanDefinition中,此时并不会创建Bean实例
- BeanDefinition的注册,将BeanDefinition的信息发布到Spring Ioc容器中,此时仍旧没有对应的Bean实例创建
到这里,Bean就在Spring Ioc容器中被定义了,而没有初始化,也没有完成依赖注入
这里开始bean在容器中的生命周期,通过一系列的接口穿插管控bean的整个生命周期
构造(创建对象)
单实例:在容器启动的时候创建对象
多实例:在每次获取时创建对象
容器启动的时候会创建单例对象并对其初始化(非延迟加载的)
下面是Ioc容器对Bean 的初始化过程
org.springframework.beans.factory.BeanFactory; 中给出了整套初始化方法及标准顺序
- BeanNameAware's {@code setBeanName} 如果实现了,就执行该方法
- BeanClassLoaderAware's {@code setBeanClassLoader}
- BeanFactoryAware's {@code setBeanFactory}
- EnvironmentAware's {@code setEnvironment}
- EmbeddedValueResolverAware's {@code setEmbeddedValueResolver}
- ResourceLoaderAware's {@code setResourceLoader} (only applicable when running in an application context)
- ApplicationEventPublisherAware's {@code setApplicationEventPublisher} (only applicable when running in an application context)
- MessageSourceAware's {@code setMessageSource} (only applicable when running in an application context)
- ApplicationContextAware's {@code setApplicationContext} (only applicable when running in an application context)
- ServletContextAware's {@code setServletContext} (only applicable when running in a web application context)
一系列Awar接口:初始化前的预处理 操作
- {@code postProcessBeforeInitialization} methods of BeanPostProcessors #进行预初始化
- InitializingBean's {@code afterPropertiesSet} #spring提供的初始化接口,可以覆写afterPropertiesSet方法来初始化
- a custom init-method definition #bean中自定义的初始化
- {@code postProcessAfterInitialization} methods of BeanPostProcessors #初始化后的后置处理器
此时就已经可以投入使用了
关闭
On shutdown of a bean factory, the following lifecycle methods apply:
- {@code postProcessBeforeDestruction} methods of DestructionAwareBeanPostProcessors 销毁前的后置处理
- DisposableBean's {@code destroy} #spring提供的销毁方法,覆写该接口的destroy方法来实现
- a custom destroy-method definition #bean中自定义的销毁方法
单实例:容器关闭的时候销毁
多实例:容器不会管理这个bean,不会自动调用他的销毁方法
![](https://img2023.cnblogs.com/blog/1628202/202303/1628202-20230312170628044-1452837003.png)
大致过程:
加载元信息BeanDefinition
如果有多个构造方法会推断构造方法,然后利用反射实例化bean
进行属性填充,@Autowired 先bytype, @Resource 先byName
回调Aware接口的相关方法,如果有实现
BeanPsotProcessor 进行前置处理
自定义init-method
BeanPostProcessor进行后置处理, AOP动态代理的创建
bean是单例的会放入单例池
可以使用了
容器关闭时调用destory方法销毁
spring Ioc在执行了初始化和依赖注入后会执行一些步骤来完成初始化,我们能根据这来设置自定义初始化和销毁。
实现了相关接口才会在生命周期中调用它的方法
spring Ioc容器正常关闭时会调用一些步骤来关闭容器,释放资源。
spring Ioc容器的最低要求是实现BeanFactory接口,而非ApplicationContext接口,如果采用了非ApplicationContext子类创建Ioc容器,那么即使覆写了相应接口,也不会在生命周期中被调用。
当服务器正常关闭,或者遇到其他关闭spring Ioc容器的时间,它就会调用对应的方法完成Bean的销毁,步骤如下:
- 如果bean实现了接口DisposableBean的destroy方法,那么就会调用它
- 如果定义了自定义销毁方法,那么就会调用它
- 如果两者都有,先执行实现的DisposableBean的destroy,再执行自定义的销毁方法
初始化和销毁方法,可以通过
- xml的init-method 和 destroy-method指定
- 注解@Bean来指定
- JSR250 javax.annotation的注解@postCunstruct和@preDestroy
BeanPostProcessor接口针对的是所有的Bean,不需要每一个bean都来实现它,用一个Bean实现该接口,在Spring Ioc容器中定义它,就能对所有的Bean产生影响。
作者: deity-night
出处: https://www.cnblogs.com/deity-night/
关于作者:码农
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(***@163.com)咨询.