spring bean 生命周期,作用域,加载过程

spring bean 生命周期:

一个类从创建到销毁,主要经过了十个过程,实例化 织入 aware 设置属性 实例化完成,生命周期开始 lifecycle start 调用业务

lifecycle stop 生命周期结束 ,进行 销毁 destroy。

一个类什么时候销毁,如果是单例的 singleton 由容器管理,容器关闭的时候会销毁,或者调用了destroy时会销毁。如果是prototype 原生的类,则由客户端来管理,当不引用的时候,jvm不可到达,然后由垃圾回收进行销毁。

----------------------------------------------------------------------------

  1、实例化一个Bean--也就是我们常说的new;

    2、按照Spring上下文对实例化的Bean进行配置(属性注入)--也就是IOC注入;

    3、如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值

    4、如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以);

    5、如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);

    6、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;

    7、如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。

    8、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法、;

    注:以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton。

    9、当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;

    10、最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

----------------------------------------------------------------------------------------

spring bean 作用域 :

 Singleton 在Spring IOC 容器仅存在一个Bean实例,Bean以单例方式存在,这个是默认值。
prototype 每次从容器调用bean时,都会返回一个新的实例,也就是每次调用getBean()时都会实例化一个新的bean。
request 每次HTTP请求都会创建一个新的Bean,该作用于仅适用于web环境
session 每个HTTP Session共享一个Bean,不同的Session使用不同的Bean,同样只适用于web环境。
Global Session 一般作用于Portlet应用环境,只作用于Web环境。
五种作用域中,其中request、session、global session三种作用域仅适用于web环境。

----------------------------------------------------------------------------------------

spring bean 加载过程:

getBean  然后类的信息,进行递归反射 获得一个 bean ,就加载成功了,  主要想了解spring怎么处理这些类的依赖关系,闭环依赖等等。

循环依赖

循环依赖根据注入的时机分成两种类型:

  • 构造器循环依赖。依赖的对象是通过构造器传入的,发生在实例化 Bean 的时候。
  • 设值循环依赖。依赖的对象是通过 setter 方法传入的,对象已经实例化,发生属性填充和依赖注入的时候。

如果是构造器循环依赖,本质上是无法解决的。比如我们准调用 A 的构造器,发现依赖 B,于是去调用 B 的构造器进行实例化,发现又依赖 C,于是调用 C 的构造器去初始化,结果依赖 A,整个形成一个死结,导致 A 无法创建。

如果是设值循环依赖,Spring 框架只支持单例下的设值循环依赖。Spring 通过对还在创建过程中的单例,缓存并提前暴露该单例,使得其他实例可以引用该依赖。



作者:Oblee
链接:https://www.jianshu.com/p/9ea61d204559
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(spring3)