当前位置: 首页 > news >正文

Bean生命周期

链接:https://www.zhihu.com/question/38597960/answer/77600561

深究Spring中Bean的生命周期

Bean 的生命周期

如上图所示,Bean 的生命周期还是比较复杂的,下面来对上图每一个步骤做文字描述:

  1. Spring启动**,查找并加载需要被Spring管理的bean,进行Bean的实例化**
  2. Bean实例化后对将Bean的引入和值注入到Bean的属性
  3. 如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法**(实现BeanNameAware清主要是为了通过Bean的引用来获得Bean的ID,一般业务中是很少有用到Bean的ID的**)
  4. 如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入**(实现BeanFactoryAware 主要目的是为了获取Spring容器,如Bean通过Spring容器发布事件等)**
  5. 如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。(作用与BeanFactory类似都是为了获取Spring容器,不同的是Spring容器在调用setApplicationContext方法时会把它自己作为setApplicationContext 的参数传入,而Spring容器在调用setBeanDactory前需要程序员自己指定(注入)setBeanDactory里的参数BeanFactory )
  6. 如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。(作用是在Bean实例创建成功后对进行增强处理,如对Bean进行修改,增加某个功能)
  7. 如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用**(作用与6的一样,只不过6是在Bean初始化前执行的,而这个是在Bean初始化后执行的,时机不同 )**
  8. 如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。
  9. 此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
  10. 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。

相关文章:

  • Spring事务及事务传播
  • [转]优秀的程序员不会觉得累成狗是一种荣耀
  • 一种SPA(单页面应用)架构
  • 【学习目标】
  • 浅析 Linux 初始化 init 系统,第 2 部分: UpStart
  • Android的四大组件
  • Java、Web工程师发展——路在何方?
  • Java之正则表达式
  • Android的五大布局
  • 第二节 join从句--内连接
  • Android常用控件
  • C# 特性详解
  • Android五大存储方式
  • 移动社交广告价值显现,腾讯之后,陌陌开始捞金
  • 【Activity专题】
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • Babel配置的不完全指南
  • GitUp, 你不可错过的秀外慧中的git工具
  • go语言学习初探(一)
  • JS专题之继承
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Spring声明式事务管理之一:五大属性分析
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • windows下mongoDB的环境配置
  • 订阅Forge Viewer所有的事件
  • 蓝海存储开关机注意事项总结
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 数据仓库的几种建模方法
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 数据库巡检项
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #pragma预处理命令
  • %@ page import=%的用法
  • (a /b)*c的值
  • (笔试题)合法字符串
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)Google的Objective-C编码规范
  • .NET : 在VS2008中计算代码度量值
  • .net 4.0发布后不能正常显示图片问题
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET Core中Emit的使用
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .net 使用ajax控件后如何调用前端脚本
  • .net和php怎么连接,php和apache之间如何连接
  • .NET建议使用的大小写命名原则
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .Net小白的大学四年,内含面经
  • .net中我喜欢的两种验证码
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48