Spring学习笔记——Bean的作用域以及生命周期

Spring Bean 的作用域

  • singleton(单例):默认值,spring容器中只有一个Bean实例,Bean以单例的方式存在。该Bean实例将存储在高速缓存中,并且对所有Bean的请求,只要id与Bean定义相匹配都会返回该缓存对象。这种单例模式对于无会话状态的 Bean(如 DAO 层、Service 层)来说,是最理想的选择。

  • prototype(原型):每次通过Spring容器获取Bean时,容器都会创建一个Bean实例。prototype 作用域适用于需要保持会话状态的 Bean(如 Struts2 的 Action 类)

  • request(请求):每次HTTP请求,容器都会创建一个Bean实例,该作用域只在当前HTTP Reques内有效。

  • session(会话):同一个HTTP Session共享一个Bean实例,不同的session使用不同的Bean实例。该作用域仅在当前HTTP Session内有效。

  • appliction:同一个Web应用共享一个Bean实例,该作用域在当前ServletContext内有效。

  • websocket:websocket的作用域是WebSocket,即在整个WebSocket中有效。

request、session、application、websocket 和 global Session 作用域只能在 Web 环境下使用,如果使用 ClassPathXmlApplicationContext 加载这些作用域中的任意一个的 Bean,就会抛出以下异常。

java.lang.IllegalStateException: No Scope registered for scope name 'xxx'

Spring Bean的生命周期

Spring中Bean的生命周期可以简单表示为:Bean的定义——>Bean的初始化-——>Bean的使用——>Bean的销毁

  • 对于singleton作用域的Bean,Spring能够精确是知道该Bean何时被创建,何时初始化,以及何时销毁。

  • 对于prototype作用域的Bean,Spring只负责创建,当容器创建了Bean之后,Bean实例就交给客户端代码管理,Spring容器就不在跟踪其生命周期。

Bean生命周期执行流程示意图:

Spring学习笔记——Bean的作用域以及生命周期_第1张图片

 

Bean生命周期的执行过程描述:

  1. Spring启动,查找并加载需要被Spring管理的Bean,并实例化Bean。

  2. 利用依赖注入完成Bean中所有属性值的配置注入。

  3. 如果Bean实现了BeanNameAware接口,则Spring调用Bean的setBeanName()方法传入当前Bean的id值。

  4. 如果Bean实现了BeanFactoryAware接口,则Spring调用setBeanFactory()方法传入当前工厂实例的引用。

  5. 如果 Bean 实现了 ApplicationContextAware 接口,则 Spring 调用 setApplicationContext() 方法传入当前 ApplicationContext 实例的引用。

  6. 如果 Bean 实现了 BeanPostProcessor接口,则 Spring 调用该接口的预初始化方法 postProcessBeforeInitialzation() 对 Bean 进行加工操作,此处非常重要,Spring 的 AOP 就是利用它实现的。

  7. 如果 Bean 实现了 InitializingBean 接口,则 Spring 将调用 afterPropertiesSet() 方法。

  8. 如果在配置文件中通过 init-method 属性指定了初始化方法,则调用该初始化方法。

  9. 如果 BeanPostProcessor和 Bean 关联,则 Spring 将调用该接口的初始化方法 postProcessAfterInitialization()。此时,Bean 已经可以被应用系统使用了。

  10. 如果在 中指定了该 Bean 的作用域为 singleton,则将该 Bean 放入 Spring IoC 的缓存池中,触发 Spring 对该 Bean 的生命周期管理;如果在 中指定了该 Bean 的作用域为 prototype,则将该 Bean 交给调用者,调用者管理该 Bean 的生命周期,Spring 不再管理该 Bean。

  11. 如果 Bean 实现了 DisposableBean 接口,则 Spring 会调用 destory() 方法销毁 Bean;如果在配置文件中通过 destory-method 属性指定了 Bean 的销毁方法,则 Spring 将调用该方法对 Bean 进行销毁。

Spring 官方提供了 3 种方法实现初始化回调和销毁回调:

回调优先级:注解>接口>xml

初始化回调实现 InitializingBean 接口;org.springframework.beans.factory.InitializingBean 接口提供了以下方法

  1. 实现 InitializingBean 接口;org.springframework.beans.factory.InitializingBean 接口提供了以下方法

     void afterPropertiesSet() throws Exception;

  2. 在 XML 中配置 init-method;

     

  3. 使用 @PostConstruct 注解,标明该方法为 Bean 初始化后的方法。

销毁回调

  1. 实现 DisposableBean 接口,org.springframework.beans.factory.DisposableBean 接口提供了以下方法

     void destroy() throws Exception;

  2. 在 XML 中配置 destroy-method;

     

  3. 使用 @PreDestory 注解,标明该方法为 Bean 销毁前执行的方法。

你可能感兴趣的:(Spring,java,spring)