本文从几个spring提供的关键的PostProcessor处理器,来帮助理解spring创建bean的过程:

下面是按方法执行的前后顺序排列

  • BeanFactoryPostProcessor.postProcessBeanFactory()

    用来在所有的bean definitions加载后,但是还没有实例化bean之前调用本方法,所以本方法非常超前执行
    可以修改bean的定义,如是否是单例,是否lazy init,DependsOn,FactoryBeanName等等等等,一般用来修改属性值,一个典型的实现是PropertyResourceConfigurer,用来从配置文件里加载属性放进bean里,或者更换${…}placeHolder

  • bean的构造方法
  • BeanPostProcessor.postProcessBeforeInitialization()

    在bean进行初始化方法(如InitializingBean.afterPropertiesSet或者自定义的init方法@PostConstruct)的回调之前调用
    调用此方法时,bean的属性值已经设置好
    可以返回一个包装类

  • @PostConstruct

    用来标注在bean的方法上,在依赖注入后,放入spring容器前执行一些init逻辑(init方法中可以使用依赖属性)。一个bean中只能有一个@PostConstruct
    然后注意,这是java规定的注解!!
    如果在拦截器中,(没见过这个用法,不太懂)
    必须有InvocationContext方法参数,可以有Object返回值
    如果不是在拦截器类中:
    不能有返回值和方法参数
    标注的方法可以是public, protected,package private or private
    可以是final的
    不能抛出运行时异常,会导致容器启动失败

  • InitializingBean.afterPropertiesSet()

    用来BeanFactory将bean的所有属性都设置后,执行一些init逻辑或者只是check属性是否正确和缺失。

  • BeanPostProcessor.postProcessAfterInitialization()

    在bean执行初始化方法(如InitializingBean.afterPropertiesSet或者自定义的init方法@PostConstruct之后调用
    调用此方法时,bean的属性值已经设置好
    可以返回一个包装类
    可能被多次调用

  • SmartInitializingSingleton

    这个接口可以被一个单例的bean实现,在BeanFactory实例化所有单例bean之后执行。
    一般用来执行一些init逻辑,在想要急切获取其他bean时可以用来替换InitializingBean.afterPropertiesSet()的方案

  • SmartLifecycle.start()

    Lifecycle接口的扩展,用来实现想在容器启动刷新,或者shutdown时执行一些逻辑。
    isAutoStartup()用来表示在容器刷新时这个bean是否启动,否则只有容器start时重新创建
    stop(Runnable)用于需要异步的关闭逻辑,必须要调用callback.run()
    Phased用于控制多个bean的启动顺序,value较小的会先启动,shutdown时会后关闭。
    如ComponentB依赖componentA先启动,则componentA.phase()应该返回一个较小的值,关闭时B会先关闭。
    如果明确指定depends-on,以depends-on为准。
    任何没有实现SmartLifecycle的bean的phase会是0,这也就意味着如果SmartLifecycle Bean的phase返回负数,将优先于所有的容器bean启动,正数反之。
    SmartLifecycle的DEFAULT_PHASE = Integer.MAX_VALUE;

Spring容器实例bean中的几个关键PostProcessor相关推荐

  1. 【Spring】普通类获取Spring容器的bean的方法

    我们通常在项目中获取Spring容器里bean的方式,一般是使用注解的方式(@Autowired.@Resource)直接注入就可以直接使用了,那么如果在一个普通的类里(其他地方使用它的实例是以new ...

  2. Spring容器和Bean加载

    Spring容器的IOC和DI概念 IOC(控制反转):对于组件的控制权进行了转移,传统的程序设计是由客户端new出对象,是程序主动创建所依赖的对象.而IOC是专门将对象的创建交给容器处理,组件的控制 ...

  3. Spring系列之bean中的autowire-candidate又是干什么的?

    当容器中某种类型的bean存在多个的时候,此时如果我们从容器中查找这种类型的bean的时候,会报下面这个异常: org.springframework.beans.factory.NoUniqueBe ...

  4. 解决在非spring上下文的环境中无法获取Spring容器的bean【nullpointer:connot invoke because xxx is null问题】

    文章目录 1.背景: 2.原代码: 非spring环境中获取bean 1.背景: 项目在nio监听端口的事件中需要在接收到客户端数据以后把数据封装然后调用service层间接访问数据库插入数据,调试了 ...

  5. 关于Spring容器管理Bean的过程以及加载模式

    1.需要将bean的定义信息声明在Spring的配置文件中: 2.需要通过Spring抽象出的各种Resource来指定对应的配置文件: 3.需要显示声明一个Spring工厂,该工厂用来掌控我们在配置 ...

  6. Spring容器初始化Bean、销毁Bean前所做操作的定义方式汇总

    1.通过@javax.annotation.PostConstruct和@javax.annotation.PreDestroy定义 package com.xiaochuange.platform. ...

  7. spring容器实例化bean的3种方式

    1. 使用公共的无参构造器 2. 使用静态工厂 (与设计模式的工厂无关) 3. 使用实例工厂 (与设计模式的工厂无关) 注解:第一种常用 转载于:https://www.cnblogs.com/wan ...

  8. Spring容器中的Bean是否会被GC呢?

    Spring容器中的Bean是否会被GC呢?最近好几次被校招实习生问及,对于初学者来说,这应该是一个有意思的问题,鉴于此,笔者顺便写个这个文档. 1.Spring容器中Bean的作用域 当通过Spri ...

  9. Spring注解驱动开发第7讲——如何按照条件向Spring容器中注册bean?这次我懂了!!

    写在前面 当bean是单实例,并且没有设置懒加载时,Spring容器启动时,就会实例化bean,并将bean注册到IOC容器中,以后每次从IOC容器中获取bean时,直接返回IOC容器中的bean,而 ...

最新文章

  1. 清华中德大数据研究学生交换项目成果报告会成功举办
  2. Docker之Linux Cgroups
  3. member pm.php,Dedecms 会员中心注入漏洞5
  4. 做个插件MaterialSpinner笔记
  5. PowerShell因为在此系统中禁止执行脚本解决方法
  6. centOS中网络配置相关文件配置选项说明
  7. 华为机试HJ33:整数与IP地址间的转换
  8. 云计算8项核心技术分析
  9. linux全局搜索是什么,linux之文本搜索工具(grep、egrep)用法
  10. 开源python语音识别_5 款不错的开源语音识别/语音文字转换系统
  11. python3可视化-pyecharts图形库,大饼图Pie的创建和使用
  12. 加速度运动/弹性运动/模拟重力场/拖拽运动
  13. 推荐几个不错的美术游戏资源
  14. 云联惠认证时间_警方要求云联惠涉案成员限期投案,是自首寻求轻判的最佳时机...
  15. BAT批处理脚本教程
  16. 湖南计算机录取位次,2019-2020年湖南一本重点大学投档线及最低录取位次统计表...
  17. AD10长方形通孔焊盘的画法
  18. 【教程】制作能在ARM板上直接运行的gcc本地编译器
  19. Cura代码编译所需的环境配置
  20. cleanmymac x激活免费秘钥v2021.4.7.8如何清空DNS缓存教程分享

热门文章

  1. 100w氮化镓充电器_SHARGE闪极-100W大功率氮化镓充电器体验
  2. 数据结构与算法(一):链表
  3. 下载Java Jar包的网站(托管厂库)
  4. 卡尺测量的最小范围_不知道这四大基本原则,你还有脸在测量圈混?
  5. java class 是否相等_Java重要技术(30)类加载器之Class类型的相等比较
  6. m40型工业机器人_工业机器人在汽车生产中有的应用范围
  7. 【数据分析R语言系列】R语言函数与函数式编程、作用域和apply 家族
  8. 二十二、面试必备:final、finally、finalize有什么不同?
  9. KDD 2021 | 异质图神经网络的可微元图搜索
  10. 推荐3个C++系统项目!初级开发者必学!