Spring中的InitializingBean接口的使用
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接口的使用相关推荐
- Spring中的InitializingBean接口
InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法. package o ...
- spring中基础核心接口总结
spring中基础核心接口总结 理解这几个接口,及其实现类就可以快速了解spring,具体的用法参考其他spring资料 1.BeanFactory最基础最核心的接口 重要的实现类有: XmlBean ...
- Spring中的InitializingBean的使用详解
文章目录 一.InitializingBean作用 二.InitializingBean扩展 写在前面: 我是「境里婆娑」.我还是从前那个少年,没有一丝丝改变,时间只不过是考验,种在心中信念丝毫未减, ...
- springcloud工作笔记104---Spring中的InitializingBean接口以及afterPropertiesSet的使用
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 这里为什么要说这个方法,因为我们物联网项目中,在做语音通信服务器的过程中,首先,由于 硬件设备发给 ...
- spring中的aware接口
1.实现了相应的aware接口,这个类就获取了相应的资源. 2.spring中有很多aware接口,包括applicationContextAware接口,和BeanNameAware接口. 实现了这 ...
- Spring中的RowMapper接口的作用
Spring中RowMapper接口的作用: 用来把数据库中的列字段和java bean中属性对应上,这样就可以赋值了 sping中的RowMapper可以将数据中的每一行数据封装成用户定义的类. 我 ...
- spring中的Aware接口原来是这么回事
一.介绍 使用spring开发的同学,或多或少都使用过形如XxxAware这样的接口.spring文档中是这样解释Aware接口的: Spring提供了广泛的Aware回调接口,让bean向容器表 ...
- spring中的Aware接口的作用以及代码剖析
前言 不知道大家有没有遇到这样的场景,比如,我自己有一个PersonService, 实现类是PersonServiceImpl,我想在PersonServiceImpl中使用application ...
- Spring中的BeanPostProcessor接口
由方法名字也可以看出,前者在实例化及依赖注入完成后.在任何初始化代码(比如配置文件中的init-method)调用之前调用:后者在初始化代码调用之后调用. 注意: 1.接口中的两个方法都要将传入的be ...
最新文章
- SAP Cloud for Customer客户主数据的重复检查-Levenshtein算法
- paip.按键替换映射总结
- 口红竟超10000款,IT直男谁来拯救?(文末有惊吓)
- id_Tech5_challenges--siggraph09
- Spring MVC原理学习之how is return type handled
- Struts文件上传与下载详解_上传单个文件
- [导入]全国哀悼日 网站变灰装(附代码)[转]
- 在 .NET 中设置页面元素的 javascript 事件 - IEBrowser [5]
- java http get_「面小易-面经12」阿里巴巴Java方向面试题汇总(含答案)
- SVN 使用hooks 自动更新到远程的web目录下
- css clear属性 的深入了解
- antd树形控件拖拽 改变数据位置
- 贝壳基于 Flink 的实时计算演进之路
- 校园多媒体直播系统方案
- 三阶魔方大中小魔公式_三阶魔方还原图文教程-番茄魔方
- 春来夏往,秋收冬藏,我们来日方长(第一章)
- 6 errors and 0 warnings potentially fixable with the`--fix` option
- html textarea 缩放,textarea自动撑开缩放
- Autojs-QQ每日定时给女票/男票/闺蜜/基友发送一句话
- PMBOK(第六版) 学习笔记 ——《第七章 项目成本管理》
热门文章
- AutoRun Pro Enterprise II 教程--- 教你制作软件工具箱教程清晰版(教程画面清晰,教程语音可以调高)...
- mysql数据类型优化
- oracle数据库实验讲义-读书笔记(一)
- 关于错误error C4430 error C2365 error C2078 error C2440 error C2143的处理。
- 二叉树的三叉链表存储和基本操作
- Directx11教程(55) 建立球形和锥形物体
- Windows 7 下IIS 7.5 结合Zend构建PHP集成开发环境
- 一次自定义Configuration的悲惨经历。
- 從三種方式看SQL的使用程度
- HALCON示例程序texture.hdev检测树木