一.spring生命周期

1. 实例化Bean

对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。

对于ApplicationContext容器,当容器启动结束后,便实例化所有的bean。 容器通过获取BeanDefinition对象中的信息进行实例化。并且这一步仅仅是简单的实例化,并未进行依赖注入。 实例化对象被包装在BeanWrapper对象中,BeanWrapper提供了设置对象属性的接口,从而避免了使用反射机制设置属性。

2. 设置对象属性(依赖注入)

实例化后的对象被封装在BeanWrapper对象中,并且此时对象仍然是一个原生的状态,并没有进行依赖注入。 紧接着,Spring根据BeanDefinition中的信息进行依赖注入。 并且通过BeanWrapper提供的设置属性的接口完成依赖注入。

3. 注入Aware接口

紧接着,Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给bean

(1)如果Bean实现了BeanNameAware接口,则调用setBeanName方法

(2)如果Bean实现了BeanClassLoaderAware接口,则调用setBeanClassLoader方法

(3)如果Bean实现了BeanFactoryAware接口,则调用setBeanFactory方法

4. BeanPostProcessor的前置处理器

当经过上述几个步骤后,bean对象已经被正确构造,但如果你想要对象被使用前再进行一些自定义的处理,就可以通过BeanPostProcessor接口实现。 该接口提供了两个函数:

postProcessBeforeInitialzation( Object bean, String beanName ) 当前正在初始化的bean对象会被传递进来,我们就可以对这个bean作任何处理。 这个函数会先于InitialzationBean执行,因此称为前置处理。 所有Aware接口的注入就是在这一步完成的。

5. InitializingBean

如果Bean实现了InitializingBean接口,调用afterPropertiesSet方法

但它与前置处理不同,由于该函数并不会把当前bean对象传进来,因此在这一步没办法处理对象本身,只能增加一些额外的逻辑。

6.init-method

如果Bean定义了init-method方法,则调用Bean的init-method方法。这是Spring为了降低对客户代码的侵入性,给bean的配置提供了init-method属性,该属性指定了在这一阶段需要执行的函数名。Spring便会在初始化阶段执行我们设置的函数。init-method本质上仍然使用了InitializingBean接口

7.BeanPostProcessor的后置处理器

postProcessAfterInitialzation( Object bean, String beanName ) 当前正在初始化的bean对象会被传递进来,我们就可以对这个bean作任何处理。

当进行到这一步,Bean已经被准备就绪了,一直停留在应用的上下文中,直到被销毁

8. DisposableBean

destroy() 方法

9.destroy-method

和init-method一样,通过给destroy-method指定函数,就可以在bean销毁前执行指定的逻辑

二.Aware

Spring的依赖注入的最大亮点就是你所有的Bean对Spring容器的存在是没有意识的。即你可以将你的容器替换成别的容器,例如Goggle Guice,这时Bean之间的耦合度很低。

但是在实际的项目中,我们不可避免的要用到Spring容器本身的功能资源,这时候Bean必须要意识到Spring容器的存在,才能调用Spring所提供的资源,这就是所谓的Spring Aware。其实Spring Aware本来就是Spring设计用来框架内部使用的,若使用了Spring Aware,你的Bean将会和Spring框架耦合。

也就是说spring aware 的这些接口的存在,让我们可以获取、修改beanName(getBeanName)、事件发布(applicationContext.publishEvent)等

最新文章

  1. php中用foreach改变数组的值的问题
  2. 1.bootstrap练习笔记-导航条
  3. FP-growth高效频繁项集发现
  4. BUAA 724 晴天小猪的神题(RMQ线段树)
  5. Linux批量替换文件内容
  6. curl抓取信息
  7. 一些实用的CSS Media Query代码片段,个人采集
  8. c# windows service 实现监控其他程序是否被关闭,关闭则报警
  9. java中文拼音字母排序
  10. SQLyog 最新版本12.5-64bit 完美破解,亲测可用!
  11. Python第十七天 抽象类
  12. alome配环境
  13. load balancer does not have available server for client: provider
  14. 汇编 sub减法指令 比较指令CMP JZ条件跳转指令
  15. Linux 查看系统硬件信息
  16. java实现函数指针
  17. Apache 调用不同的 PHP 版本
  18. The server of Nginx(三)——Nginx企业级优化
  19. 【转】Debug 运行正常,Release版本不能正常运行
  20. 使用Jsonp实现跨域请求

热门文章

  1. 推荐一款轻量小众却高效免费开源windows热键脚本语言Autohotkey
  2. 欧拉函数线性求解以及莫比乌斯反演(Mobius)
  3. 【字符串算法】字典树(Trie树)
  4. MCU(Micro Control Unit)中文名称为微控制单元
  5. JVM性能调优(3) —— 内存分配和垃圾回收调优
  6. 【git】关联本地仓库与远程仓库
  7. 2014年 实验一  C2C个人拍卖
  8. day39 Pyhton 并发编程02 后
  9. 【C语言学习笔记系列】C语言编程狼追兔子问题代码解析!
  10. 生物信息-McScan(Python-jcvi)共线性画图