我是靠谱客的博主 乐观嚓茶,最近开发中收集的这篇文章主要介绍spring bean生命周期四---Initialization阶段,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

属性填充后,就是初始化值。

// 生命周期中的初始化方法调用。
exposedObject = initializeBean(beanName, exposedObject, mbd);

代码如下:

//初始容器创建的Bean实例对象,为其添加BeanPostProcessor后置处理器
	protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
		//JDK的安全机制验证权限
		if (System.getSecurityManager() != null) {
			//实现PrivilegedAction接口的匿名内部类
			AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
				invokeAwareMethods(beanName, bean);
				return null;
			}, getAccessControlContext());
		}
		else {
			//为Bean实例对象包装相关属性,如名称,类加载器,所属容器等信息
			//todo Spring Bean Aware 接口回调阶段
			invokeAwareMethods(beanName, bean);
		}
 
		Object wrappedBean = bean;
		//todo  第七次调用后置处理器 BeanPostProcessor后置处理器的postProcessBeforeInitialization
		//回调方法的调用,为Bean实例初始化前做一些处理
		if (mbd == null || !mbd.isSynthetic()) {
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}
 
		//todo 1、先处理了 InitializingBean#afterPropertiesSet()
		// 2、调用Bean实例对象初始化的方法,这个初始化方法是在Spring Bean定义配置
		//文件中通过init-method属性指定的
		try {
			invokeInitMethods(beanName, wrappedBean, mbd);
		}
		catch (Throwable ex) {
			throw new BeanCreationException(
					(mbd != null ? mbd.getResourceDescription() : null),
					beanName, "Invocation of init method failed", ex);
		}
		//todo 第八次调用 BeanPostProcessor后置处理器的postProcessAfterInitialization
		//回调方法的调用,为Bean实例初始化之后做一些处理
		if (mbd == null || !mbd.isSynthetic()) {
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}
 
		return wrappedBean;
	}

Spring Bean 初始化后阶段

//todo 第八次调用 BeanPostProcessor后置处理器的postProcessAfterInitialization
		//回调方法的调用,为Bean实例初始化之后做一些处理
		if (mbd == null || !mbd.isSynthetic()) {
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}

Spring Bean 初始化完成阶段
主要是回调:SmartInitializingSingleton#afterSingletonsInstantiated
使用场景:实现SmartInitializingSingleton的接口后,当所有单例 bean 都初始化完成以后, Spring的IOC容器会回调该接口的 afterSingletonsInstantiated()方法。
主要应用场合就是在所有单例 bean 创建完成之后,可以在该回调中做一些事情,例如:

import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.stereotype.Component;
 
@Component
public class MyRegister implements SmartInitializingSingleton {
 
	private ListableBeanFactory beanFactory;
 
	public MyRegister(ListableBeanFactory beanFactory) {
		this.beanFactory = beanFactory;
	}
 
	@Override
	public void afterSingletonsInstantiated() {
		String[] beanNames = beanFactory.getBeanNamesForType(IPerson.class);
		for (String s : beanNames) {
			System.out.println(s);
		}
	}
 
}

最后

以上就是乐观嚓茶为你收集整理的spring bean生命周期四---Initialization阶段的全部内容,希望文章能够帮你解决spring bean生命周期四---Initialization阶段所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部