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 已经初始化。