Bean和生命周期
- bean是由Spring IOC容器实例化,组装和管理的对象。
- 对于普通的Java对象,当用new创建对象就能被使用,当对象不被使用的时候就会被Java自动进行垃圾回收。
- 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能够使用之前,会进行很多工作。
生命周期流程
- 根据配置情况调用Bean构造方式或工厂方法实例化Bean。
- 利用依赖注入完成Bean种所有属性值的配置注入。
- 如果Bean实现了BeanNameAware接口,则Spring调用Bean的setBeanName()方法传入当前Bean的id值。
- 如果Bean实现了BeanFactoryWare接口,则Spring调用setBeanFactory()方法传入当前工厂实例的引用。
- 如果Bean实现了ApplicationContextAware接口,则Spring调用setApplicationContext()方法传入当前ApplicationContext实例的引用。
- 如果BeanPostProcessor和Bean关联,则Spring调用setApplicationContext()方法传入当前ApplicationContext实例的引用。
- 如果Bean实现了InitializingBean接口,则Spring调用afterPropertiesSet()方法。
- 如果在配置文件种通过init-method属性指定了初始化方法,则调用该初始化方法。
- 如果BeanPostProcessor和Bean关联,则Spring将调用该接口的初始化方法postProcessAfterInitialization()。此时,Bean已经可以被应用系统使用了。
- 如果在 中指定了该 Bean 的作用范围为 scope=“singleton”,则将该 Bean 放入 Spring IoC 的缓存池中,将触发 Spring 对该 Bean 的生命周期管理;如果在 中指定了该 Bean 的作用范围为 scope=“prototype”,则将该 Bean 交给调用者,调用者管理该 Bean 的生命周期,Spring 不再管理该 Bean。
- 如果 Bean 实现了 DisposableBean 接口,则 Spring 会调用 destory() 方法将 Spring 中的 Bean 销毁;如果在配置文件中通过 destory-method 属性指定了 Bean 的销毁方法,则 Spring 将调用该方法对 Bean 进行销毁。
Spring 为 Bean 提供了细致全面的生命周期过程,通过实现特定的接口或 的属性设置,都可以对 Bean 的生命周期过程产生影响。虽然可以随意配置 的属性,但是建议不要过多地使用 Bean 实现接口,因为这样会导致代码和 Spring 的聚合过于紧密。