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指定的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WLAN

WPA加密 1&#xff0e;WPA的功能是替代现行的WEP&#xff08;Wired Equivalent Privacy&#xff09;协议。WPA是继承了WEP基本原理而又解决了WEP缺点的一种新技术。由于加强生成加密密钥的算法&#xff0c;因此即便收集到分组信息并对其进行解析&#xff0c;也几乎无法计算出通…

Spring事务CallbackPreferringPlatformTransactionManager

CallbackPreferringPlatformTransactionManager if (txInfo.transactionAttribute ! null && txInfo.transactionAttribute.rollbackOn(ex)) {} 判断属性的默认值不为nul l且判断当前的异常是RuntimeException还是Error&#xff0c;会返回1&#xff0c;其他异常返回0…

java ranger rest_kafka ranger integration issuse

kafka-rangerranger-1.0.0 kafka-1.0.0(confluent-4.0.0)安装ranger-1.0.0-kafka-plugin下面是安装过程中遇到的一些问题下载并解压 ranger-1.0.0-kafka-plugin.tar.gz修改配置文件install.propertiesCOMPONENT_INSTALL_DIR_NAME/usr/local/confluent/POLICY_MGR_URLhttp://192…

vuejs组件通信

<body><div id"example"><father></father></div> </body> <script>Vue.component(child, {// 声明 propsprops: [message],// 就像 data 一样&#xff0c;prop 可以用在模板内// 同样也可以在 vm 实例中像 “this.messag…

Windows 10 Creators Update [ISO官方镜像][15063][1703][x64][x86][创意者更新正式版]

请把下载地址手动复制到迅雷里面去,谢谢! 【64 位简体中文专业/家庭版】 文件名&#xff1a;cn_windows_10_multiple_editions_version_1703_updated_march_2017_x64_dvd_10194190.iso SHA1&#xff1a;054C741DED8989F4D0D419946EB37182F20E4482 文件大小&#xff1a;4.27GB 下…

@PostConstruct注解学习

PostConstruct注解好多人以为是Spring提供的。其实是Java自己的注解。 Java中该注解的说明&#xff1a;PostConstruct该注解被用来修饰一个非静态的void&#xff08;&#xff09;方法。被PostConstruct修饰的方法会在服务器加载Servlet的时候运行&#xff0c;并且只会被服务器…

java mathematica_用Java获取Mathematica图像

我试图使用J / Link从Mathematica获取图像到Java.我可以在Mathematica中打印图像,如下所示&#xff1a;Print[ Graphics[Raster[ img[[1]] ], AspectRatio->Automatic, ImageSize->530 ] ];我试过以各种方式从Mathematica函数返回数据&#xff1a;Return [ Image[Graphic…

C语言 · 出栈次序

标题&#xff1a;出栈次序 X星球特别讲究秩序&#xff0c;所有道路都是单行线。一个甲壳虫车队&#xff0c;共16辆车&#xff0c;按照编号先后发车&#xff0c; 夹在其它车流中&#xff0c;缓缓前行。 路边有个死胡同&#xff0c;只能容一辆车通过&#xff0c;是临时的检查站&a…

idea for mac 控制台 mvn command not found

一&#xff1a;现在的IDEA 自带maven库maven库的地址如下图查看 二:完idea 需要配置maven库的环境变量才能找到该命令 Mac系统的环境变量&#xff0c;加载顺序为&#xff1a; a. /etc/profile b. /etc/paths c. ~/.bash_profile d. ~/.bash_login e. ~/.profile f. ~/.bashrc 其…

java swing 总结_java实验之swing图形用户界面程序设计及总结

8.1组件和容器顶层容器有小应用程序(Applet和JApplet)、对话框(Dialog和JDialog)、框架(Frame和JFrame)。这些容器都存在于java.swing*;中.一般容器有面板(JPanel)、滚动窗格(JScrollPane)、分裂窗格(JSplitPane)、选项卡窗格(JTabbedPane)和工具条(JToolBar).专用容器有什么作…

06jQuery-04-DOM操作

jQuery既然是为了帮助你能从js的繁琐中解脱出来&#xff0c;自然在DOM操作上也有自己的一套。1、修改Text和HTML之前我们提到过&#xff0c;如果用JS的话&#xff0c;你要修改Text或者HTML需要用到其innerHTML和innerText属性&#xff0c;但是放在jQuery里面&#xff0c;你需要…

解决 swap file “*.swp”already exists!问题

Linux下难免要开启多个vim共同编辑同一个文件&#xff0c;这时再次保存就会出现&#xff1a; swap file "*.swp" already exists! [O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:原因&#xff1a; 使用vim编辑文件实际是先copy一份临…

java天气预报webservice_webservice之实现天气预报

前通过传智的视频自学了webservice的基本使用&#xff0c;也了解到webservice就是一种跨编程语言和跨操作系统平台的远程调用技术。对于这些理论知识在这里也不再做过多的解释&#xff0c;本次主要就是记录与分享使用cxf 框架完成远程调用气象局提供的接口&#xff0c;来实现天…

CSS下拉菜单

例子&#xff1a; 鼠标移动到按钮上打开下拉菜单。&#xff08;在这里我将下拉菜单的内容的链接设置为百度首页&#xff09; 下拉菜单 菜单内容 1 菜单内容 2 菜单内容 3HTML 部分&#xff1a; 制作下拉菜单可以使用任何的 HTML元素来打开下拉菜单&#xff0c;如&#xff1a;&l…

maven跳过单元测试-maven.test.skip和skipTests的区别

第一种 -Dmaven.test.skiptrue&#xff0c;不执行测试用例&#xff0c;也不编译测试用例类。 一 使用maven.test.skip&#xff0c;不但跳过单元测试的运行&#xff0c;也跳过测试代码的编译。 mvn package -Dmaven.test.skiptrue<plugin> <groupId>org.apache.m…

linux下java命令行参数_Java调用Linux命令行

Java调用Linux命令行Java语言以其跨平台性和简易性而著称&#xff0c;在Java里面的lang包里(java.lang.Runtime)提供了一个允许Java程序与该程序所运行的环境交互的接口&#xff0c;这就是Runtime类&#xff0c;在Runtime类里提供了获取当前运行环境的接口。那么java怎么调用Li…

BZOJ 4810 莫队+bitset

思路&#xff1a; 看完这道题根本没有思路啊.... 然后我就膜拜了一波题解... 这神tm乱搞思路 维护两个bitset 第一个bitset代表当前区间哪些数出现过 第二个bitset是 maxp-p出现过 差为x的时候 就用第一个bitset与一下它右移x就好了 和为x的时候 就第一个bitset与一下第二个bi…

java -p_javap命令详解 - JackieYeah的个人空间 - OSCHINA - 中文开源技术交流社区

一、用法javap [ 选项 ] classes二、描述javap命令反汇编一个或多个类文件。它的输出由使用的选项决定。如果没有使用选项&#xff0c;javap命令将打印输出传递给它的类的包&#xff0c; protected和public属性和方法。javap打印输出到标准输出。选项命令行选项。classes一个或…

初识RPC概念

什么是RPC RPC 全称 Remote Procedure Call——远程过程调用。在学校学编程&#xff0c;我们写一个函数都是在本地调用就行了。但是在互联网公司&#xff0c;服务都是部署在不同服务器上的分布式系统&#xff0c;如何调用呢&#xff1f; RPC技术简单说就是为了解决远程调用服务…