关于spring的生命周期见解

第一种理解
1.Bean的建立
由BeanFactory读取Bean定义文件,并生成各个实例
如果是默认的单例模式,那么在加载spring的配置文件的时候,会将bean实例化,放进Spring的IOC容器中。
可以利用无参构造函数追踪实例化时机。
2.设置属性(属性注入)
注入属性值,对应的属性需要有set方法
值加载spring配置文件时,会实例化User对象,在调用无参构造方法实例化对象后,紧接着调用了setUserName方法,为userName属性注入值
3.BeanNameAware接口的setBeanName():
可以获取正在被实例化的bean的id的值
配置文件中有几个User类型的bean,就会打印几个id值
4.BeanFactoryAware的setBeanFactory():
如果Bean实现BeanFactoryAware接口,则执行setBeanFactory(),可以获取到beanFactory,即bean工厂。我们可以清晰的看到bean工厂中的所有bean。
5.ApplicationContextAware接口:
ApplicationContextAware接口获取ApplicationContext。
User类实现了接口ApplicationContextAware并复写了setApplicationContext方法。Spring初始化的时候就将ApplicationContext装配好了,那么项目中就可以直接使用applicationContext.getBean(“beanId”);
6.BeanPostProcessor的processBeforeInitialization():
BeanPostProcessor(后置处理器)接口作用是:
如果我们需要在Spring容器完成Bean的实例化、配置和其他的初始化前后添加一些自己的逻辑处理,我们就可以定义一个或者多个BeanPostProcessor接口的实现,然后注册到容器中。
如果有任何BeanPostProcessors实例与Bean实例关联,则执行BeanPostProcessors实例processBeforeInitialization()
7.Bean定义文件中定义init-method初始化:
<beanid="userSecond"class="com.hyq.entity.User"init-method=“userInit”>
<propertyname="userName"value=“hyq”>

8.BeanPostProcessors的processaAfterInitialization():
Spring在设置完一个bean所有的合作者后,会检查bean是否实现了InitializingBean接口,如果实现就调用bean的afterPropertiesSet方法。
9.DisposableBean的destroy():
bean销毁。在容器关闭时,如果Bean类实现DisposableBean接口,则执行destroy()。

第二种理解
关于spring的生命周期见解
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(Objectobj,Strings)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;
7、如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。
8、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Objectobj,Strings)方法、;
注:以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton,这里我们不做赘述。
9、当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;
10、最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。