zoukankan      html  css  js  c++  java
  • 【Spring】Spring中的Bean

    Bean的生命周期

    简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean

    了解Spring中Bean的生命周期有何意义?

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

    Spring容器可以管理Bean部分作用域的生命周期。

    Bean的生命周期管理

    singleton作用域

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

    prototype作用域

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

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

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

    在Spring中,Bean生命周期的执行是一个很复杂的过程,我们可以利用Spring提供的方法来定制Bean的创建过程。** ,而Spring容器在保证一个Bean能够使用之前,会做很多工作**。Spring容器中,Bean的生命周期流程如图所示。

    在这里插入图片描述

    这个图,Bean的生命周期的整个执行过程描述如下。

    (1)根据配置情况调用Bean构造方法或工厂方法实例化Bean。

    ​ 实例化Bean

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

    ​ 设置属性值

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

    ​ 调用BeanNameAware的setBeanName()方法

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

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

    ​ 调用ApplicationContextAware的setApplicationContext()方法

    (6)如果BeanPostProcessor和Bean关联,则Spring将调用该接口的预初始化方法postProcessBeforeInitialzation()对Bean进行加工操作,这个非常重要,Spring的AOP就是用它实现的。

    ​ 调用BeanPostProcessor的预初始化方法

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

    ​ 调用InitializingBean的afterPropertiesSet()方法

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

    ​ 调用定制的初始化方法

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

    ​ 调用BeanPsotProcessor的初始化方法

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

    ​ [singleton] Spring缓冲池中准备就绪的Bean

    ​ [prototype] 将准备就绪的Bean交给调用者

    (11)如果Bean实现了DisposableBean接口,则Spring会调用destory()方法将Spring中的Bean销毁;如果在配置文件中通过destory-method属性指定了Bean的销毁方法,则Spring将调用该方法进行销毁。Spring为Bean提供了细致全面的生命周期过程,通过实现特定的接口或通过的属性设置,都可以对Bean的生命周期过程产生影响。我们可以随意地配置的属性,但是在这里建议不要过多地使用Bean实现接口,因为这样会使代码和Spring聚合比较紧密。

    ​ [Spring中Bean的销毁]

    ​ 调用Disposable的destory()方法

    ​ 调用destory-method属性配置的销毁方法

  • 相关阅读:
    基于Delphi的三层数据库系统的实现方法
    用数据表创建树_delphi教程
    多层数据库开发十三:剖析几个数据库应用程序
    多层数据库开发十二:使用数据控件
    多层数据库开发九:查询数据库
    第十一章 TClientDataSet
    用python做线性规划
    Python-sympy科学计算与数据处理(求极限及其它功能)
    Python-sympy科学计算与数据处理(方程,微分,微分方程,积分)
    Python-sympy科学计算与数据处理(数学表达式)
  • 原文地址:https://www.cnblogs.com/liuawen/p/12310600.html
Copyright © 2011-2022 走看看