美文网首页
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