学习
实践
活动
工具
TVP
写文章
专栏首页JavaEdgeInitializingBean使用

InitializingBean使用

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

package org.springframework.beans.factory;

/**
 * 所有由BeanFactory设置的所有属性都需要响应的bean的接口:例如,执行自定义初始化,或者只是检查所有强制属性是否被设置。
 *实现InitializingBean的替代方法是指定一个自定义init方法,例如在XML bean定义中。
 */
public interface InitializingBean {

    /**
     * 在BeanFactory设置了提供的所有bean属性后,由BeanFactory调用。 
     *这个方法允许bean实例在所有的bean属性被设置时才能执行
     */
    void afterPropertiesSet() throws Exception;

}

在spring初始化bean的时候,如果该bean是实现了InitializingBean接口,并且同时在配置文件中指定了init-method,系统则先调用afterPropertiesSet方法,再调用init-method中指定的方法。

<bean id="testInitializingBean" class="com.TestInitializingBean" init-method="testInit"></bean>

这种方式在spring中是怎么实现的呢? 通过查看spring加载bean的源码类(AbstractAutowireCapableBeanFactory)可以看出玄机 AbstractAutowireCapableBeanFactory类中的invokeInitMethods方法讲解的非常清楚,源码如下:

protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)
            throws Throwable {
        //首先看该bean是否实现了实现了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>() {
                        @Override
                        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-method
            if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
                    !mbd.isExternallyManagedInitMethod(initMethodName)) {
                //进一步查看该方法的源码,可以发现init-method方法中指定的方法是通过反射实现的
                invokeCustomInitMethod(beanName, bean, mbd);
            }
        }
    }

观察源码可得出以下结论 summary:

  1. spring为bean提供了两种初始化bean的方式,实现InitializingBean接口而实现afterPropertiesSet方法,或者在配置文件中同过init-method指定,两种方式可以同时使用
  2. 实现InitializingBean接口是直接调用afterPropertiesSet方法,比通过反射调用init-method指定的方法相对来说效率要高。但init-method方式消除了对spring的依赖
  3. 若调用afterPropertiesSet方法时产生异常,则也不会再调用init-method指定的方法
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://blog.csdn.net/qq_33589510复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • spring InitializingBean

    先说总结: 1:spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSe...

    全栈程序员站长
  • InitializingBean接口

    IT云清
  • Spring核心接口之InitializingBean

    InitializingBean接口为bean提供了属性初始化后的处理方法,它只包括afterPropertiesSet方法,凡是继承该接口的类,在bean的属...

    BUG弄潮儿
  • spring的InitializingBean的 afterPropertiesSet 方法

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

    全栈程序员站长
  • 策略模式加上InitializingBean的编程实现

    场景:最近在写一些接口,发现堆了太多的if…eles,所以通过实现Spring框架的InitializingBean接口,加上策略模式,避免代码里堆了太多if…...

    SmileNicky
  • Spring之InitializingBean接口和DisposableBean接口介绍

      本文来介绍下InitializingBean接口和DisposableBean接口的作用

    用户4919348
  • Spring初始化之ApplicationRunner、InitializingBean、@PostConstruct执行顺序问题

    因为要用到Spring的初始化加载bean,比如Spring上下文的获取类应该优先加载,监听什么的类应该在启动后加载,所以考虑先后顺序,所以研究一下Applic...

    执笔记忆的空白
  • 【死磕 Spring】----- IOC 之 深入分析 InitializingBean 和 init-method

    Spring 在 bean 初始化时进行三个检测扩展,也就是说我们可以对 bean 进行三个不同的定制化处理,前面两篇博客 【死磕 Spring】----- I...

    用户1655470
  • 【Spring注解驱动开发】Spring中的InitializingBean和DisposableBean,你真的了解吗?

    作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了...

    冰河
  • 如果你不知道spring中的这些初始化方法,你就out了

    很多时候,我们在spring实例化bean之前,需要做一些准备工作,比如读取资源文件,创建其他的对象等。这些准备工作,往往写在初始化方法中,那么spring目前...

    苏三说技术
  • 不知道吧?Spring Bean初始化/销毁竟然有这么多姿势

    日常开发过程有时需要在应用启动之后加载某些资源,或者在应用关闭之前释放资源。Spring 框架提供相关功能,围绕 Spring Bean 生命周期,可以在 Be...

    Bug开发工程师
  • 羞,Spring Bean 初始化/销毁竟然有这么多姿势

    日常开发过程有时需要在应用启动之后加载某些资源,或者在应用关闭之前释放资源。Spring 框架提供相关功能,围绕 Spring Bean 生命周期,可以在 Be...

    andyxh
  • 如何写好一个 Spring 组件

    Spring 框架提供了许多接口,可以使用这些接口来定制化 bean ,而非简单的 getter/setter 或者构造器注入。细翻 Spring Cloud ...

    冷冷
  • 面试突击75:SpringBoot 有几种读取配置文件的方法?

    它们的具体使用方法如下,为了方便测试,我们在 Spring Boot 配置文件 application.properties 添加以下内容:

    Java中文社群-磊哥
  • spring源码分析:bean的初始化

    我们通过spring容器帮我们实例化并且维护bean的时候,有时候我们需要在bean在实例化完成的时候,帮我们做一些事情,这个时候我们就会使用到bean的初始化...

    全栈程序员站长
  • spring @EnableAutoConfiguration实现原理

    在refresh中调用了PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors。Po...

    平凡的学生族
  • 补习系列(21)-SpringBoot初始化之7招式

    在日常开发时,我们常常需要 在SpringBoot 应用启动时执行某一段逻辑,如下面的场景:

    美码师
  • Bean的生命周期(不要背了记思想)

    Bean的生命周期主要是Bean的创建过程,使用和销毁都比较简单 如上所说大致可以分为四个阶段: 实例化 -> 属性赋值 -> 初始化 -> 销毁

    向着百万年薪努力的小赵
  • Spring 中 Bean 的生命周期

    所谓 Bean 的生命周期,就是一个 Bean 从创建到销毁,所经历的各种方法调用。大致包含下面几个方法(不是全部)

    水货程序员

扫码关注腾讯云开发者

领取腾讯云代金券