SpringBean的生命周期:
Spring容器可以管理singleton作用域的Bean的生命周期
- singleton
在此作用域下,Spring能够精确的知道该Bean何时作用域被创建,何时初始化完成,以及何时被销毁。 - prototype
prototype作用域的Bean, Spring只 负责创建,当容器创作用域建了Bean实例后,Bean的实例就交给客户端代码来管理,Spring容器将不再跟踪其生命周期。
特别要记住一点,Spring是根据beanDefinition来创建Spring bean的
为什么不直接使用对象的class对象来创建bean呢?
因为在class对象仅仅能描述一个对象的创建,它不足以用来描述一个Spring bean,而对于是否为懒加载、是否是首要的、初始化方法是哪个、销毁方法是哪个,这个Spring中特有的属性在class对象中并没有,所有Spring就定义了beanDefinition来完成bean的创建。
步骤如下:
Spring有 BeanDefinition来存储着我们日常给Spring Bean定义的元数据(@Scope、 @Lazy、@DependsOn等)
Spring启动时进行扫描注解或者XMl或者JavaConfig中需要被Spring进行管理的Bean
封装进BeanDefinition再放入BeanDefinitionMap(K是BeanName,V是BeanDefinition)加载数据但未实例化
- 调用构造方法进行创建一个Bean的实例;
- 如有此Bean对象有相关属性,进行set方法设置属性值;
- 然后根据Bean对象是否实现某些感知接口(Awave)
- 如果实现了
SetBeanNameAware
接口,重写setBeanName方法,传入Bean的名字; - 如果实现了
SetBeanClassLoaderAware
接口,重写setBeanClassLoader方法,传入ClassLoader的实例; - 如果实现了
SetBeanFactoryAware
接口,重写setBeanFactory方法,传入BeanFactory - …对应实现***Aware接口,就重写对应的方法
- 如果实现了
- 如果此Bean对象有和
BeanPostProcessor
对象有关的话,重写postProcessBeforeInitialization
方法,在Bean对象初始化之前执行一些操作 - 如果Bean对象实现了
InitializingBean
接口,重写afterPropertiesSet方法,进行初始化Bean对象 - 如果Bean对象有对应的
init-method
方法,则执行对应的方法 - 如果此Bean对象有和
BeanPostProcessor
对象有关的话,重写postProcessAfterInitialization
方法,在Bean对象初始化之后执行一些操作 - 如果Bean对象实现了
DisposableBean
接口,则要销毁Bean的时候执行initDestory方法 - 如果Bean对象有对应的
destroy-method
方法,执行指定的方法。
Bean对象:
public class MyBean implements BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean ,BeanClassLoaderAware{
private String name;
public MyBean() {
System.out.println("构造方法");
}
public void setName(String name) {
System.out.println("属性的set方法");
this.name = name;
}
@Override
public String toString() {
return "MyBean{" +
"name='" + name + '\'' +
'}';
}
public void initBefore(){
System.out.println("初始化前方法");
}
public void initDestory(){
System.out.println("摧毁方法");
}
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("setBeanFactory");
}
public void setBeanName(String name) {
System.out.println("setBeanName");
}
public void destroy() throws Exception {
System.out.println("DisposableBean");
}
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBean");
}
public void setBeanClassLoader(ClassLoader classLoader) {
System.out.println("setBeanClassLoader");
}
}
测试对象:
public class test {
public static void main(String[] args) {
Resource resource = new ClassPathResource("bean.xml");
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
beanDefinitionReader.loadBeanDefinitions(resource);
beanFactory.addBeanPostProcessor(new MyPostProcessor());
Object bean = beanFactory.getBean("MyBean");
beanFactory.destroySingletons();
System.out.println(bean);
}
}
BPP对象:
public class MyPostProcessor implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization");
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization");
return bean;
}
}
注入:
<bean id="MyBean"
class="com.xiao.BeanLifeCycle.MyBean"
init-method="initBefore"
destroy-method="initDestory">
<property name="name" value="Bean对象的生命周期"></property>
</bean>
运行结果: