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怎么处理这些类的依赖关系,闭环依赖等等。
循环依赖
循环依赖根据注入的时机分成两种类型:
如果是构造器循环依赖,本质上是无法解决的。比如我们准调用 A 的构造器,发现依赖 B,于是去调用 B 的构造器进行实例化,发现又依赖 C,于是调用 C 的构造器去初始化,结果依赖 A,整个形成一个死结,导致 A 无法创建。
如果是设值循环依赖,Spring 框架只支持单例下的设值循环依赖。Spring 通过对还在创建过程中的单例,缓存并提前暴露该单例,使得其他实例可以引用该依赖。
作者:Oblee
链接:https://www.jianshu.com/p/9ea61d204559
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。