Spring-Bean初始化顺序

原创 2017年07月25日 17:47:36




在验证spring-Bean初始化顺序前,先看几个关键接口

 

InitializingBean

    Spirng的InitializingBean为bean提供了定义初始化方法的方式。InitializingBean是一个接口,它仅仅包含一个方法:afterPropertiesSet()。

   在spring 初始化后,执行完所有属性设置方法(即setXxx)将自动调用 afterPropertiesSet(), 在配置文件中无须特别的配置,但此方式增加了bean对spring 的依赖,应该尽量避免使用

init-method(非接口)

  Spring虽然可以通过InitializingBean完成一个bean初始化后对这个bean的回调,但是这种方式要求bean实现 InitializingBean接口。一但bean实现了InitializingBean接口,那么这个bean的代码就和Spring耦合到一起了。通常情况下我不鼓励bean直接实现InitializingBean,可以使用Spring提供的init-method的功能来执行一个bean 子定义的初始化方法。

BeanFactoryPostProcessor接口

可以在spring的bean创建之前,修改bean的定义属性。也就是说,Spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前读取配置元数据,并可以根据需要进行修改,例如可以把bean的scope从singleton改为prototype,也可以把property的值给修改掉。可以同时配置多个BeanFactoryPostProcessor,并通过设置'order'属性来控制各个BeanFactoryPostProcessor的执行次序。

注意:BeanFactoryPostProcessor是在spring容器加载了bean的定义文件之后,在bean实例化之前执行的。接口方法的入参是ConfigurrableListableBeanFactory,使用该参数,可以获取到相关bean的定义信息

 

BeanPostProcessor接口

BeanPostProcessor,可以在spring容器实例化bean之后,在执行bean的初始化方法前后,添加一些自己的处理逻辑。这里说的初始化方法,指的是下面两种:

1)bean实现了InitializingBean接口,对应的方法为afterPropertiesSet

2)在bean定义的时候,通过init-method设置的方法

 

注意:BeanPostProcessor是在spring容器加载了bean的定义文件并且实例化bean之后执行的。BeanPostProcessor的执行顺序是在BeanFactoryPostProcessor之后。

 

初始化bean顺序

 

1.构造函数

2.初始化属性

3.如果实现了BeanFactoryAware 接口执行setBeanFactory方法

4..如果实现了InitializingBean 接口执行afterPropertiesSet方法

5.如果在配置文件中指定了init-method,那么执行该方法

6..如果实现了BeanFactoryPostProcessor 接口在 “new”其他类之前执行 postProcessBeanFactory 方法(通过这个方法可以改变配置文件里面的属性值的配置)

7.如果实现了BeanPostProcessor 接口,那么会在其他bean初始化方法之前执行postProcessBeforeInitialization 方法,之后执行postProcessAfterInitialization方法

感觉奇怪的地方就是没有执行destroy方法

在此方法中没有执行接口BeanPostProcessor的方法,不知道何原因

 


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java常用数据结构总结

Java中有几种常用的数据结构,主要分为Collection和Map两个主要接口,而程序中最终使用的数据结构是继承自这些接口的数据结构类。其主要关系: 1、几个常用类的区别: 1.Arra...

Java中字符串定义,初始化,赋值为null的区别

1、概述: 字符串定义 只定义不分配内存空间,不做任何操作; 字符串初始化 两种方式直接等号赋值,用new初始化,直接等号赋值放入内存池,其它变量也可以引用;new初始化分配内存空间,不可引用; 字...

Spring容器中的Bean几种初始化方法和销毁方法的先后顺序

Spring 容器中的 Bean 是有生命周期的,Spring 允许 Bean 在初始化完成后以及销毁前执行特定的操作。下面是常用的三种指定特定操作的方法: 通过实现InitializingBe...

Spring容器中的Bean几种初始化方法和销毁方法的先后顺序

Spring 容器中的 Bean 是有生命周期的,Spring 允许 Bean 在初始化完成后以及销毁前执行特定的操作。下面是常用的三种指定特定操作的方法: 通过实现InitializingBe...

Spring-Bean初始化顺序

InitializingBean     Spirng的InitializingBean为bean提供了定义初始化方法的方式。InitializingBean是一个接口,它仅仅包含一个方法:after...

Spring bean 的初始化和销毁的三种方式和执行顺序

Spring 容器中的 Bean 是有生命周期的,spring 允许 Bean 在初始化完成后以及销毁前执行特定的操作。 下面是常用的三种指定特定操作的方法: 通过实现InitializingBe...

spring的bean加载顺序样例项目

  • 2017年03月19日 20:26
  • 14KB
  • 下载

浅析Spring IoC源码(十)Spring Bean的初始化顺序

上几节我们比较详细地说明了一下BeanFactoryPostProcessor和BeanPostProcessor这2个接口的作用和意义,并且也花了一个章节,讲了一下BeanFactory和Facto...
  • clypm
  • clypm
  • 2017年01月12日 17:10
  • 213

Spring bean 加载执行顺序

问题来源: 有一个bean为A,一个bean为B。想要A在容器实例化的时候的一个属性name赋值为B的一个方法funB的返回值。 如果只是在A里单纯的写着: private B b;...

spring、web服务器加载bean顺序

最近在项目中用到listener,并需要在listener的构造方法中做一些动作,其中需要调用其他的service类,这个类加载使用@Autowired注入。后考虑利用setter方式注入,发现Nul...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring-Bean初始化顺序
举报原因:
原因补充:

(最多只允许输入30个字)