Spring中的InitializingBean接口

使用方法

java 复制代码
@Slf4j
@Component
public class MyBean implements InitializingBean {
 
    public MyBean() {
        log.info("===================> 构造方法");
    }
 
    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("===================> afterPropertiesSet方法");
    }
}

Spring中的Bean注入流程


afterPropertieSet()和init-method

在Spring初始化bean的时候,如果该bean实现了InitializingBean接口,并且同时在配置了init-method,系统则是先调用afterPropertieSet()方法,然后再调用init-method中指定的方法。

通过查看Spring加载bean的源码类AbstractAutowiredCapableBeanFactory可以看出:

java 复制代码
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);
		}
	}
}
相关推荐
callJJ10 小时前
Nacos 详解——从概念到实战
java·spring boot·spring·spring cloud·微服务·nacos
小马爱打代码10 小时前
Spring源码 第三篇:Spring 源码深度拆解:循环依赖 + 三级缓存
java·spring·缓存
用户3983461612012 小时前
Go-Spring 实战第 13 课 —— Bean 元信息:名称、生命周期、接口导出、条件和显式依赖
spring·go
小马爱打代码12 小时前
Spring源码 第二篇:Spring Bean 生命周期:从实例化到销毁全源码解析
java·后端·spring
C137的本贾尼12 小时前
Spring AI Alibaba 进阶:DashScope 原生能力与最佳实践
人工智能·spring
暗冰ཏོ15 小时前
springboot_从入门到高级详细讲解
java·spring boot·后端·spring·maven
小当家.10515 小时前
Spring AI vs LangChain4j:Java 后端接大模型,两条路线怎么选
java·人工智能·spring·langchain·springai
Mahir0815 小时前
Spring MVC 深度解密:从 DispatcherServlet 到请求处理全流程
java·后端·spring·面试·mvc
Mr-Wanter15 小时前
Spring Boot 2 升级到 Spring Boot 3 后 Nacos 热更新失效问题分析
java·spring boot·spring
小马爱打代码16 小时前
Spring源码 第六篇:Spring 5 源码深度拆解:SpringMVC 全流程核心原理
java·后端·spring