我是靠谱客的博主 等待云朵,最近开发中收集的这篇文章主要介绍spring初始化接口InitializingBeanspring初始化接口InitializingBean,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
spring初始化接口InitializingBean
InitializingBean接口用于初始化bean。此接口只有一个方法afterPropertiesSet,
继承此接口的bean,在bean的属性初始化会执行这个方法。
下面看一下此接口定义
/**
* 当需要在BeanFactory设置完bean的所有属性后,还需做一些初始化的操作,可让该bean实现此接口
*/
public interface InitializingBean {
/**
* 由BeanFactory在设置完bean的属性后调用
* 该方法可用于实现bean的初始化操作,不过需要在bean的属性设置完毕后(从名字也可以看出)
*/
void afterPropertiesSet() throws Exception;
}
我们可以在 AbstractAutowireCapableBeanFactory
类中找到此接口的调用位置,如下:
protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
throws Throwable {
//是否实现了 InitializingBean 接口
boolean isInitializingBean = (bean instanceof InitializingBean);
if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
if (logger.isDebugEnabled()) {
logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
}
if (System.getSecurityManager() != null) {
try {
AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
// 调用该方法
((InitializingBean) bean).afterPropertiesSet();
return null;
}, getAccessControlContext());
}
catch (PrivilegedActionException pae) {
throw pae.getException();
}
}
else {
// 调用该初始化方法
((InitializingBean) bean).afterPropertiesSet();
}
}
// 判断是否指定了init-method方法
if (mbd != null && bean.getClass() != NullBean.class) {
String initMethodName = mbd.getInitMethodName();
if (StringUtils.hasLength(initMethodName) &&
!(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
!mbd.isExternallyManagedInitMethod(initMethodName)) {
// 执行init-method 方法
invokeCustomInitMethod(beanName, bean, mbd);
}
}
}
spring还有一种初始化方式,指定 init-method 方法,如xml配置的bean
<bean id="initAndDestroySeqBean" class="com.wthfeng.dubboapi.beans.InitAndDestroyBean" init-method="initMethod"
destroy-method="destroyMethod"/>
从源码分析可知,init-method的初始化方法在InitializingBean.afterPropertiesSet 方式之后。
总结如下:
- spring有两种初始化bean的方式,实现InitializingBean接口以及配置init-method方法,两种方式可以同时使用,实现接口的方式比指定init-method先调用。
- 如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。
参考文章
- Spring核心接口之InitializingBean
- InitializingBean的作用
最后
以上就是等待云朵为你收集整理的spring初始化接口InitializingBeanspring初始化接口InitializingBean的全部内容,希望文章能够帮你解决spring初始化接口InitializingBeanspring初始化接口InitializingBean所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复