本文共 3609 字,大约阅读时间需要 12 分钟。
关于bean的生命周期,其实过程非常多,总结起来就是在构造方法前面有其他方法可以执行,在属性设置前面,后面都也可以插入具体的方法执行,最后在关闭掉ApplicationContext的实现类时,也会有方法执行。先给出一个简易版的,仅在一个bean内需要调用的顺序
public class Person implements BeanFactoryAware,BeanNameAware,InitializingBean,DisposableBean { private String name; private String address; private int phone; private BeanFactory beanFactory; private String beanName; public Person() { System.out.println("【构造方法】"); } public String getName() { return name; } public void setName(String name) { System.out.println("【注入属性】注入name属性"); this.name = name; } public String getAddress(){ return address; } public void setAddress(String address) { System.out.println("【注入属性】注入address属性"); this.address = address; } public int getPhone(){ return phone; } public void setPhone(int phone) { System.out.println("【注入属性】注入phone属性"+phone); this.phone = phone; } public String toString() { return "Person [address=" + address + ", name=" + name + ", phone=" + phone + "]"; } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { System.out.println("【BeanFactoryAware接口】调用BeanFactoryAware.setBeanFactory("+beanFactory.getClass()+")"); this.beanFactory = beanFactory; } @Override public void setBeanName(String name) { System.out.println("【BeanNameAware接口】调用BeanNameAware.setBeanName()"); this.beanName = name; } @Override public void destroy() throws Exception { System.out.println("【DiposibleBean接口】调用DiposibleBean.destory()"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("【InitializingBean接口】调用InitializingBean.afterPropertiesSet()"); } public void myInit() { System.out.println("【init-method】调用的init-method属性指定的初始化方法"); } public void myDestory() { System.out.println("【destroy-method】调用 的destroy-method属性指定的初始化方法"); }}
接下来配置beans.xml文件
测试类
public class BeanLifeCycle { public static void main(String[] args) { System.out.println("--------------------------------------------"); ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); System.out.println("--------------------------------------------"); Person person = (Person)context.getBean("person",Person.class); System.out.println(person); System.out.println("--------------------------------------------"); ((ClassPathXmlApplicationContext)context).registerShutdownHook(); }}
执行结果
【构造方法】【注入属性】注入address属性【注入属性】注入name属性【注入属性】注入phone属性15900000【BeanNameAware接口】调用BeanNameAware.setBeanName()【BeanFactoryAware接口】调用BeanFactoryAware.setBeanFactory(class org.springframework.beans.factory.support.DefaultListableBeanFactory)【InitializingBean接口】调用InitializingBean.afterPropertiesSet()【init-method】调用的init-method属性指定的初始化方法--------------------------------------------Person [address=广州, name=张三, phone=15900000]--------------------------------------------【DiposibleBean接口】调用DiposibleBean.destory()【destroy-method】调用 的destroy-method属性指定的初始化方法
总结下,bean的生命周期
1、执行构造方法
2、设置属性值
3、如果实现beanNameAware接口,执行setBeanName方法
4、如果实现了BeanFactoryAware接口,执行setBeanFactory方法
5、如果实现了InitializingBean接口,执行afterPropertiesSet接口
6、最后调用设置的init方法
---------------------------------
关闭ApplicationContext时,如果bean实现了DiposibleBean接口,调用destory方法
最后执行设置的desotry方法
总结:网上关于bean生命周期中每个步骤调用过程非常详细,其实这个大家平时开发时候用的到不多,主要是面试,但是这个过程太tm长了,我真是背不会,如果面试的时候,说个大概就行,谁天天背作文一样,背这些东西。
如果想了解详细过程可以看我下面的参考文章。
参考:
转载地址:http://amvti.baihongyu.com/