Spring Bean的生命周期(Java生命周期)

Bean和生命周期

  1. bean是由Spring IOC容器实例化,组装和管理的对象。
  2. 对于普通的Java对象,当用new创建对象就能被使用,当对象不被使用的时候就会被Java自动进行垃圾回收。
  3. Spring的对象是bean,bean和普通的Java对象一样,就是Bean不用用new去创建新对象,而是用IOC容器来帮助我们实例化并管理对象,我们要用哪个就去容器里取,IOC就是解决对象之间的耦合问题,Spring Bean的生命周期完全由容器控制。

Spring Bean的作用域

参数作用
singleton唯一的bean实例,Spring中的bean默认都是单例的。
prototype每次请求都会创建一个新的bean实例。
request每一次HTTP请求都会产生一个新的bean,该bean仅在当前的HTTP request内有效。
session:每一次HTTP请求都会发生一个新的bean,该bean仅在当前HTTP session内有效。
global-session全局session作用域,仅仅在基于Portlet的Web应用中才有意义,Spring5已经没有了。Portlet是能够生成语义代码片段的小型Java Web插件。他们是基于Portlet容器,可以像servlet一样处理HTTP请求。但是,与servlet不同,每个portlet都有不同的会话。

Spring Bean的生命周期

SpringBean的生命周期主要是指singileton bean ,对于prototype的bean,Spring在创建好之后就不会再管理后续的生命周期。

对于普通的Java对象来说,它们的生命周期就是:

实例化
该对象不再使用时就通过垃圾机制进行回收

Spring Bean的生命周期

实例化
属性赋值
初始化
销毁

Spring容器可以管理singleton作用域Bean的生命周期,在此作用域下,Spring可以精确的
地知道该Bean何时创建,何时初始化完成,以及何时被销毁。

而对于prototype作用域的Bean,Spring只负责创建,当容器创建了Bean的实例后,Bean的实例就交给客户端代码管理,Spring容器将不会再跟踪他的生命周期。每次客户端请求prototype作用域的Bean时,Sping容器都会创建一个新的实例,并且不会管那些配置成prototype作用域的Bean的生命周期。

了解Spring生命周期的意义在于可以利用Bean在其存活期间的指定时刻完成一些相关操作。这种时刻有很多,但一般情况下,会在Bean被初始化后和被销毁前执行一些相关操作。

在Spring种,Bean的生命周期时一个很复杂的执行过程,我们可以利用Spring提供的方法定制Bean的创建过程。

当一个Bean被加载到Spring容器时,它就具有了生命,而Spring容器在保证一个Bean能够使用之前,会进行很多工作。

生命周期流程

singleton
prototype
实例化Bean
设置属性值
调用BeanNameAware的setBeanName方法
调用BeanFactoryAware的setApplicationContext方法
调用InitializingBean的afterPropertiesSet方法
调用定制的初始化方法
调用BeanPostProcessor的后初始化方法
Spring缓存池种准备就绪的Bean
Spring种Bean的销毁
调用DisposableBean的destory方法
将就绪的Bean交给调用者
调用sestory-method属性方法
  1. 根据配置情况调用Bean构造方式或工厂方法实例化Bean。
  2. 利用依赖注入完成Bean种所有属性值的配置注入。
  3. 如果Bean实现了BeanNameAware接口,则Spring调用Bean的setBeanName()方法传入当前Bean的id值。
  4. 如果Bean实现了BeanFactoryWare接口,则Spring调用setBeanFactory()方法传入当前工厂实例的引用。
  5. 如果Bean实现了ApplicationContextAware接口,则Spring调用setApplicationContext()方法传入当前ApplicationContext实例的引用。
  6. 如果BeanPostProcessor和Bean关联,则Spring调用setApplicationContext()方法传入当前ApplicationContext实例的引用。
  7. 如果Bean实现了InitializingBean接口,则Spring调用afterPropertiesSet()方法。
  8. 如果在配置文件种通过init-method属性指定了初始化方法,则调用该初始化方法。
  9. 如果BeanPostProcessor和Bean关联,则Spring将调用该接口的初始化方法postProcessAfterInitialization()。此时,Bean已经可以被应用系统使用了。
  10. 如果在 中指定了该 Bean 的作用范围为 scope=“singleton”,则将该 Bean 放入 Spring IoC 的缓存池中,将触发 Spring 对该 Bean 的生命周期管理;如果在 中指定了该 Bean 的作用范围为 scope=“prototype”,则将该 Bean 交给调用者,调用者管理该 Bean 的生命周期,Spring 不再管理该 Bean。
  11. 如果 Bean 实现了 DisposableBean 接口,则 Spring 会调用 destory() 方法将 Spring 中的 Bean 销毁;如果在配置文件中通过 destory-method 属性指定了 Bean 的销毁方法,则 Spring 将调用该方法对 Bean 进行销毁。

Spring 为 Bean 提供了细致全面的生命周期过程,通过实现特定的接口或 的属性设置,都可以对 Bean 的生命周期过程产生影响。虽然可以随意配置 的属性,但是建议不要过多地使用 Bean 实现接口,因为这样会导致代码和 Spring 的聚合过于紧密。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值