spring中InitializingBean的使用
1、InitializingBean接口
InitializingBean接口中只包含一个afterPropertiesSet()方法,继承该接口的类,在初始化bean的时候都会执行该方法,且只执行一次
测试如下
package com.rookie.bigdata.Initializingbean;
import org.springframework.beans.factory.InitializingBean;
/**
* @author
* @date 2019/5/22
*/
public class AfterInitializingBean implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("执行afterPropertiesSet()方法");
}
public void init() {
System.out.println("执行了init的方法");
}
}
application-bean.xml
<?xml version="1.0" encoding="UTF-8"?>
测试类及测试结果
@Test
public void afterPropertiesSet() throws Exception {
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("com/rookie/bigdata/Initializingbean/application-bean.xml");
}
在spring初始化bean的时候,如果该bean是实现了InitializingBean接口,并且同时在配置文件中指定了init-method,系统则是先调用afterPropertiesSet方法,然后在调用init-method中指定的方法
2、AbstractAutowireCapableBeanFactory
出现上面结果的原因为在加载bean的时候执行了AbstractAutowireCapableBeanFactory类中的invokeInitMethods()方法
protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
throws Throwable {
//判断给bean对象是否实现了InitializingBean,如果实现了该接口,就调用afterPropertiesSet方法
boolean isInitializingBean = (bean instanceof InitializingBean);
if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
if (logger.isTraceEnabled()) {
logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
}
if (System.getSecurityManager() != null) {
try {
AccessController.doPrivileged((PrivilegedExceptionAction
3、总结
1、spring执行的时候,首先会调用afterPropertiesSet方法,其次当配置文件中配置了init-method,会调用init-method指定的方法
2、spring执行的时候,首先会调用afterPropertiesSet方法,当配置文件中配置了init-method,且方法为afterPropertiesSet时,该方法只调用一次