你的浏览器不支持canvas

做你害怕做的事情,然后你会发现,不过如此。

Spring的InitializingBean接口使用

时间: 作者: 黄运鑫

本文章属原创文章,未经作者许可,禁止转载,复制,下载,以及用作商业用途。原作者保留所有解释权。


InitializingBean接口介绍

  • 首先看一下InitializingBean接口的代码,如下
    package org.springframework.beans.factory;
    public interface InitializingBean {
      void afterPropertiesSet() throws Exception;
    }
    
  • 可以看到,接口中只有一个afterPropertiesSet()方法
  • afterPropertiesSet() 方法的作用是,在初始化 bean 后,执行 afterPropertiesSet() 方法,执行顺序是在类的构造方法之后执行

InitializingBean接口使用

  • 创建MessageRouter类,实现 InitializingBean 接口并覆写 afterPropertiesSet() 方法,代码如下:
    public class MessageRouter implements InitializingBean{
      @Override
      public void afterPropertiesSet() throws Exception {
          System.out.println("----------messageRouter的afterPropertiesSet方法----------");
      }
    }
    
  • 在spring中配置bean

      <!--bean默认是单例的-->
      <bean id="messageRouter" class="com.xxx.xxx.xxx.MessageRouter">
      </bean>
    
  • 启动项目,控制台输出如下

    log4j:WARN No appenders could be found for logger (org.jboss.logging).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    ———-messageRouter的afterPropertiesSet方法———-
    十一月 01, 2017 5:02:31 下午 org.apache.catalina.core.ApplicationContext log
    信息: Initializing Spring FrameworkServlet ‘spring’
    2017-11-01 17:02:31 JRebel: Monitoring Spring bean definitions in ‘E:\GitProject\TransnalBear\backend\trunk\api\target\classes\spring-mvc.xml’.
    2017-11-01 17:02:32 JRebel: Monitoring Spring bean definitions in ‘E:\GitProject\TransnalBear\backend\trunk\api\target\classes\spring-mvc-shiro.xml’.

  • 成功执行了 afterPropertiesSet() 方法

InitializingBean和构造方法的区别

  • 既然 afterPropertiesSet() 方法是在构造方法之后执行,那为什么不把 afterPropertiesSet() 方法中的代码写到构造方法中呢?
  • 下面就看一下InitializingBean和构造方法的区别
  • 将MessageRouter类的代码修改如下:
    public class MessageRouter implements InitializingBean{
    
      @Autowired
      private UserService userService;
    
      public MessageRouter() {
          System.out.println("构造方法:" + userService);
      }
    
      @Override
      public void afterPropertiesSet() throws Exception {
          System.out.println("afterPropertiesSet方法:" + userService);
      }
    }
    
  • 在代码中注入了另一个类 userService
  • 启动项目,控制台输出如下

    log4j:WARN No appenders could be found for logger (org.jboss.logging).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    构造方法:null
    afterPropertiesSet方法:com.controller.UserService@44b24143 十一月 01, 2017 5:02:31 下午 org.apache.catalina.core.ApplicationContext log
    信息: Initializing Spring FrameworkServlet ‘spring’
    2017-11-01 17:02:31 JRebel: Monitoring Spring bean definitions in ‘E:\GitProject\TransnalBear\backend\trunk\api\target\classes\spring-mvc.xml’.
    2017-11-01 17:02:32 JRebel: Monitoring Spring bean definitions in ‘E:\GitProject\TransnalBear\backend\trunk\api\target\classes\spring-mvc-shiro.xml’.

  • 可以看到构造方法输出的 userService 是 null,而 afterPropertiesSet 方法输出的 userService 已经被初始化
  • 所以如果在构造方法中操作 userService,就会报空指针错误,而在 afterPropertiesSet 方法中则不会报错,因为 afterPropertiesSet 方法执行时,Spring的 bean 已经初始化。

对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。