使用方法
@Slf4j
@Component
public class MyBean implements InitializingBean {public MyBean() {log.info("===================> 構造方法");}@Overridepublic void afterPropertiesSet() throws Exception {log.info("===================> afterPropertiesSet方法");}
}
Spring中的Bean注入流程
afterPropertieSet()和init-method
在Spring初始化bean的時候,如果該bean實現了InitializingBean接口,并且同時在配置了init-method,系統則是先調用afterPropertieSet()方法,然后再調用init-method中指定的方法。
通過查看Spring加載bean的源碼類AbstractAutowiredCapableBeanFactory可以看出:
protected void invokeInitMethods(String beanName, Object bean, @Nullable RootBeanDefinition mbd)throws Throwable {// 判斷bean是否實現InitializingBean接口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<Object>) () -> {((InitializingBean) bean).afterPropertiesSet();return null;}, getAccessControlContext());}catch (PrivilegedActionException pae) {throw pae.getException();}}else {// 執行InitializingBean接口實現的方法((InitializingBean) bean).afterPropertiesSet();}}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);}}
}