生命周期
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, Strings)
方法,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
属性,会自动调用其配置的销毁方法。
结合代码理解一下
Bean的定义
Spring
通常通过配置文件定义Bean
。如:
<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”http://www.springframework.org/schema/beans”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://www.springf