美文网首页
spring-bean模块中InitializingBean接口

spring-bean模块中InitializingBean接口

作者: 0爱上1 | 来源:发表于2019-06-13 16:38 被阅读0次

接口设计描述

当BeanFactory将bean创建成功,并设置完成所有它们的属性后,我们想在这个时候自定义的反应,比如检查一些强制属性是否被设置成功,这个时候我们可以让我们的bean的class实现InitializingBean接口,以被触发

另一种替代实现InitializingBean的可选方案是在我们的bean的类内部定义一个init方法,然后在xml的bean定义中添加init属性即可触发调用

接口方法定义

该接口仅有一个afterPropertiesSet方法,该方法会在bean的所有属性被设置完成(包括各种Aware的设置,如BeanFactoryAware, ApplicationContextAware等)后由容器(BeanFactory)调用

此方法允许bean实例在设置了所有bean属性执行总体配置的验证最终初始化

源码

public interface InitializingBean {

  void afterPropertiesSet() throws Exception;
}

通俗示例

我们首先定义一个Book类,类中定义一些基本属性(如name,author等)

@Component
public class Book implements InitializingBean , BeanFactoryAware  {
  // 基本属性
  // 书名
  private String name;

  // 作者
  private String author;

  private BeanFactory beanFactory;

    public Book() {
        System.out.println("实例化book......");
    }

    @Override
    public void setBeanFactory(@NonNull BeanFactory beanFactory) throws BeansException {
        System.out.println("初始化beanFactoryAware属性......");
        this.beanFactory = beanFactory;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("所有属性设置完成,调用InitializingBean的afterPropertiesSet方法......");
        System.out.println("这里可以做一些校验逻辑......");
    }
}

启动应用后打印如下:

实例化book......
初始化beanFactoryAware属性......
所有属性设置完成,调用InitializingBean的afterPropertiesSet方法......
这里可以做一些校验逻辑......

总结以下Bean的创建流程就是:

  1. BeanFactory.doCreateBean(...),调用bean的构造函数实例化bean

  2. BeanFactory.initializeBean(...),调用初始化方法执行bean的初始化

下面截图看下初始化的细节,主要分为四步

initializeBean.png

至此我们知道了InitializingBean接口的作用就体现在初始化细节的第三步,后面还有bpp的afterInitialization方法的调用,整个初始化的流程就结束了

相关文章

网友评论

      本文标题:spring-bean模块中InitializingBean接口

      本文链接:https://www.haomeiwen.com/subject/inssfctx.html