InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法,具体说spring初始化bean之后执行该方法

配置文件

<bean id="userServices" class="com.UserServices" ></bean>
public class Main {public static void main(String[] args){ApplicationContext context = new FileSystemXmlApplicationContext("/src/main/java/com/beans.xml");}
}

测试结果为:

InitializingBean

这说明在spring初始化bean的时候,如果bean实现了InitializingBean接口,会自动调用afterPropertiesSet方法。

那么问题来了,在配置bean的时候使用init-method配置也可以为bean配置初始化方法,那这两个哪个会先执行呢,接下来测试一下,修改配置文件,加上init-method:

<bean id="userServices" class="com.UserServices" init-method="test"></bean>

运行程序,得出结果:

InitializingBean
init-method

从结果可以看出,在Spring初始化bean的时候,如果该bean实现了InitializingBean接口,并且同时在配置文件中指定了init-method,系统则是先调用afterPropertieSet()方法,然后再调用init-method中指定的方法。

那么这种方式在spring中是怎么实现的呢,通过查看Spring加载bean的源码类AbstractAutowiredCapableBeanFactory可以看出其中的奥妙,AbstractAutowiredCapableBeanFactory类中的invokeInitMethods说的非常清楚,如下:

protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd) throws Throwable {//判断该bean是否实现了实现了InitializingBean接口,如果实现了InitializingBean接口,则只掉调用bean的afterPropertiesSet方法boolean isInitializingBean = (bean instanceof InitializingBean);if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {if (logger.isDebugEnabled()) {logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");}if (System.getSecurityManager() != null) {try {AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {public Object run() throws Exception {//直接调用afterPropertiesSet((InitializingBean) bean).afterPropertiesSet();return null;}},getAccessControlContext());} catch (PrivilegedActionException pae) {throw pae.getException();}}                else {//直接调用afterPropertiesSet((InitializingBean) bean).afterPropertiesSet();}}if (mbd != null) {String initMethodName = mbd.getInitMethodName();//判断是否指定了init-method方法,如果指定了init-method方法,则再调用制定的init-methodif (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&!mbd.isExternallyManagedInitMethod(initMethodName)) {//进一步查看该方法的源码,可以发现init-method方法中指定的方法是通过反射实现invokeCustomInitMethod(beanName, bean, mbd);}}
}

总结:

1、Spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中通过init-method指定,两种方式可以同时使用。

2、实现InitializingBean接口是直接调用afterPropertiesSet方法,比通过反射调用init-method指定的方法效率要高一点,但是init-method方式消除了对spring的依赖。

3、如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。

Spring中的InitializingBean接口的使用相关推荐

  1. Spring中的InitializingBean接口

    InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法. ​package o ...

  2. spring中基础核心接口总结

    spring中基础核心接口总结 理解这几个接口,及其实现类就可以快速了解spring,具体的用法参考其他spring资料 1.BeanFactory最基础最核心的接口 重要的实现类有: XmlBean ...

  3. Spring中的InitializingBean的使用详解

    文章目录 一.InitializingBean作用 二.InitializingBean扩展 写在前面: 我是「境里婆娑」.我还是从前那个少年,没有一丝丝改变,时间只不过是考验,种在心中信念丝毫未减, ...

  4. springcloud工作笔记104---Spring中的InitializingBean接口以及afterPropertiesSet的使用

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 这里为什么要说这个方法,因为我们物联网项目中,在做语音通信服务器的过程中,首先,由于 硬件设备发给 ...

  5. spring中的aware接口

    1.实现了相应的aware接口,这个类就获取了相应的资源. 2.spring中有很多aware接口,包括applicationContextAware接口,和BeanNameAware接口. 实现了这 ...

  6. Spring中的RowMapper接口的作用

    Spring中RowMapper接口的作用: 用来把数据库中的列字段和java bean中属性对应上,这样就可以赋值了 sping中的RowMapper可以将数据中的每一行数据封装成用户定义的类. 我 ...

  7. spring中的Aware接口原来是这么回事

    一.介绍   使用spring开发的同学,或多或少都使用过形如XxxAware这样的接口.spring文档中是这样解释Aware接口的: Spring提供了广泛的Aware回调接口,让bean向容器表 ...

  8. spring中的Aware接口的作用以及代码剖析

    前言 不知道大家有没有遇到这样的场景,比如,我自己有一个PersonService,  实现类是PersonServiceImpl,我想在PersonServiceImpl中使用application ...

  9. Spring中的BeanPostProcessor接口

    由方法名字也可以看出,前者在实例化及依赖注入完成后.在任何初始化代码(比如配置文件中的init-method)调用之前调用:后者在初始化代码调用之后调用. 注意: 1.接口中的两个方法都要将传入的be ...

最新文章

  1. SAP Cloud for Customer客户主数据的重复检查-Levenshtein算法
  2. paip.按键替换映射总结
  3. 口红竟超10000款,IT直男谁来拯救?(文末有惊吓)
  4. id_Tech5_challenges--siggraph09
  5. Spring MVC原理学习之how is return type handled
  6. Struts文件上传与下载详解_上传单个文件
  7. [导入]全国哀悼日 网站变灰装(附代码)[转]
  8. 在 .NET 中设置页面元素的 javascript 事件 - IEBrowser [5]
  9. java http get_「面小易-面经12」阿里巴巴Java方向面试题汇总(含答案)
  10. SVN 使用hooks 自动更新到远程的web目录下
  11. css clear属性 的深入了解
  12. antd树形控件拖拽 改变数据位置
  13. 贝壳基于 Flink 的实时计算演进之路
  14. 校园多媒体直播系统方案
  15. 三阶魔方大中小魔公式_三阶魔方还原图文教程-番茄魔方
  16. 春来夏往,秋收冬藏,我们来日方长(第一章)
  17. 6 errors and 0 warnings potentially fixable with the`--fix` option
  18. html textarea 缩放,textarea自动撑开缩放
  19. Autojs-QQ每日定时给女票/男票/闺蜜/基友发送一句话
  20. PMBOK(第六版) 学习笔记 ——《第七章 项目成本管理》

热门文章

  1. AutoRun Pro Enterprise II 教程--- 教你制作软件工具箱教程清晰版(教程画面清晰,教程语音可以调高)...
  2. mysql数据类型优化
  3. oracle数据库实验讲义-读书笔记(一)
  4. 关于错误error C4430 error C2365 error C2078 error C2440 error C2143的处理。
  5. 二叉树的三叉链表存储和基本操作
  6. Directx11教程(55) 建立球形和锥形物体
  7. Windows 7 下IIS 7.5 结合Zend构建PHP集成开发环境
  8. 一次自定义Configuration的悲惨经历。
  9. 從三種方式看SQL的使用程度
  10. HALCON示例程序texture.hdev检测树木