博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring中bean的生命周期
阅读量:4149 次
发布时间:2019-05-25

本文共 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/

你可能感兴趣的文章
第十一章 - 直接内存
查看>>
JDBC核心技术 - 上篇
查看>>
一篇搞懂Java反射机制
查看>>
Single Number II --出现一次的数(重)
查看>>
Palindrome Partitioning --回文切割 深搜(重重)
查看>>
对话周鸿袆:从程序员创业谈起
查看>>
Mysql中下划线问题
查看>>
Xcode 11 报错,提示libstdc++.6 缺失,解决方案
查看>>
idea的安装以及简单使用
查看>>
Windows mysql 安装
查看>>
python循环语句与C语言的区别
查看>>
vue 项目中图片选择路径位置static 或 assets区别
查看>>
vue项目打包后无法运行报错空白页面
查看>>
Vue 解决部署到服务器后或者build之后Element UI图标不显示问题(404错误)
查看>>
element-ui全局自定义主题
查看>>
facebook库runtime.js
查看>>
vue2.* 中 使用socket.io
查看>>
openlayers安装引用
查看>>
js报错显示subString/subStr is not a function
查看>>
高德地图js API实现鼠标悬浮于点标记时弹出信息窗体显示详情,点击点标记放大地图操作
查看>>