Spring 5 AbstractAutowireCapableBeanFactory -- initializeBean源码解析

58 篇文章 13 订阅
56 篇文章 3 订阅

相关源码注释

ApplicationContext

Spring 5 DefaultResourceLoader 源码注释
Spring 5 AbstractApplicationContext 源码注释

BeanFactory

Spring 5 SimpleAliasRegistry 源码注释
Spring 5 DefaultSingletonBeanRegistry 源码注释
Spring 5 FactoryBeanRegistrySupport 源码注释
Spring 5 AbstractBeanFactory 源码注释
Spring 5 AbstractAutowireCapableBeanFactory 源码注释
Spring 5 DefaultLisbaleBeanFactory 源码注释

initializeBean(String , Object , RootBeanDefinition )

初始化给定的Bean实例,应用工厂回调以及init方法和BeanPostProcessors

/**
	 * Initialize the given bean instance, applying factory callbacks
	 * as well as init methods and bean post processors.
	 * <p>初始化给定的Bean实例,应用工厂回调以及init方法和BeanPostProcessors</p>
	 * <p>Called from {@link #createBean} for traditionally defined beans,
	 * and from {@link #initializeBean} for existing bean instances.
	 * <p>对于传统定义的Bean,从createBean调用;对于现有的Bean实例,从initalizeBean调用</p>
	 * @param beanName the bean name in the factory (for debugging purposes)
	 *                 -- 工厂中的Bean名称(用于调试)
	 * @param bean the new bean instance we may need to initialize
	 *             -- 我们可能需要初始化的新Bean实例
	 * @param mbd the bean definition that the bean was created with
	 * (can also be {@code null}, if given an existing bean instance)
	 *            -- 创建Bean时使用的BeanDefinition(如果给定现有的Bean实例,也可以为null)
	 * @return the initialized bean instance (potentially wrapped)
	 * 		-- 初始化的Bean实例(可能已包装)
	 * @see BeanNameAware
	 * @see BeanClassLoaderAware
	 * @see BeanFactoryAware
	 * @see #applyBeanPostProcessorsBeforeInitialization
	 * @see #invokeInitMethods
	 * @see #applyBeanPostProcessorsAfterInitialization
	 */
	protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
		//如果安全管理器不为null
		if (System.getSecurityManager() != null) {
			//以特权的方式执行 回调 bean 中 Aware接口 方法
			AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
				invokeAwareMethods(beanName, bean);
				return null;
			}, getAccessControlContext());
		}
		else {
			//回调 bean 中 Aware接口 方法
			invokeAwareMethods(beanName, bean);
		}

		//初始化 包装后的Bean 为 bean
		Object wrappedBean = bean;
		//如果mdb不为null || mbd不是"synthetic"。一般是指只有AOP相关的prointCut配置或者Advice配置才会将 synthetic设置为true
		if (mbd == null || !mbd.isSynthetic()) {
			//将BeanPostProcessors应用到给定的现有Bean实例,调用它们的postProcessBeforeInitialization初始化 方法。
			// 	-- 返回的Bean实例可能是原始Bean包装器
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}

		try {
			//调用初始化方法,先调用bean的InitializingBean接口方法,后调用bean的自定义初始化方法
			invokeInitMethods(beanName, wrappedBean, mbd);
		}
		catch (Throwable ex) {
			//捕捉调用初始化方法时抛出的异常,重新抛出Bean创建异常:调用初始化方法失败
			throw new BeanCreationException(
					(mbd != null ? mbd.getResourceDescription() : null),
					beanName, "Invocation of init method failed", ex);
		}
		//如果mbd为null || mbd不是"synthetic"。一般是指只有AOP相关的prointCut配置或者Advice配置才会将 synthetic设置为true
		if (mbd == null || !mbd.isSynthetic()) {
			//将BeanPostProcessors应用到给定的现有Bean实例,调用它们的postProcessAfterInitialization方法。
			// 	-- 返回的Bean实例可能是原始Bean包装器
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}
		//返回包装后的Bean
		return wrappedBean;
	}

invokeAwareMethods(beanName, bean);

回调 bean 中 Aware接口 方法

/**
	 * 回调 bean 中 Aware接口 方法
	 * @param beanName bean名
	 * @param bean 当前Bean对象
	 */
	private void invokeAwareMethods(final String beanName, final Object bean) {
		//如果 bean 是 Aware 实例
		if (bean instanceof Aware) {
			//如果bean是BeanNameAware实例
			if (bean instanceof BeanNameAware) {
				//调用 bean 的setBeanName方法
				((BeanNameAware) bean).setBeanName(beanName);
			}
			//如果bean是 BeanClassLoaderAware 实例
			if (bean instanceof BeanClassLoaderAware) {
				//获取此工厂的类加载器以加载Bean类(即使无法使用系统ClassLoader,也只能为null)
				ClassLoader bcl = getBeanClassLoader();
				if (bcl != null) {
					//调用 bean 的 setBeanClassLoader 方法
					((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
				}
			}
			//如果bean是 BeanFactoryAware 实例
			if (bean instanceof BeanFactoryAware) {
				//调用 bean 的 setBeanFactory 方法。
				((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
			}
		}
	}

applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);

将BeanPostProcessors应用到给定的现有Bean实例,调用它们的postProcessBeforeInitialization初始化 方法。返回的Bean实例可能是原始Bean包装实例。
applyBeanPostProcessorsBeforeInitialization 是 AutowireCapableBeanFactory 的抽象方法,由 AbstractAutowireCapableBeanFactory 实现具体逻辑。

@Override
	public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
			throws BeansException {
		//初始化返回结果为existingBean
		Object result = existingBean;
		//遍历 该工厂创建的bean的BeanPostProcessors列表
		for (BeanPostProcessor processor : getBeanPostProcessors()) {
			//postProcessBeforeInitialization:在任何Bean初始化回调之前(如初始化Bean的afterPropertiesSet或自定义的init方法)
			// 		将此BeanPostProcessor 应用到给定的新Bean实例。Bean已经填充了属性值。返回的Bean实例可能时原始Bean的包装器。
			//		默认实现按原样返回给定的 Bean
			Object current = processor.postProcessBeforeInitialization(result, beanName);
			// 如果 current为null
			if (current == null) {
				//直接返回result,中断其后续的BeanPostProcessor处理
				return result;
			}
			//让result引用processor的返回结果,使其经过所有BeanPostProcess对象的后置处理的层层包装
			result = current;
		}
		//返回经过所有BeanPostProcess对象的后置处理的层层包装后的result
		return result;
	}

invokeInitMethods(beanName, wrappedBean, mbd);

调用初始化方法,先调用bean的InitializingBean接口方法,后调用bean的自定义初始化方法

/**
	 * <p>调用初始化方法,先调用bean的InitializingBean接口方法,后调用bean的自定义初始化方法</p>
	 * Give a bean a chance to react now all its properties are set,
	 * and a chance to know about its owning bean factory (this object).
	 * This means checking whether the bean implements InitializingBean or defines
	 * a custom init method, and invoking the necessary callback(s) if it does.
	 * <p>现在让Bean有机会对它所有的属性进行反应,并有机会了解它所拥有的Bean工厂(这个对象)。
	 * 这意味着检查Bean是否实现了InitalizingBean或定义了一个自定以init方法,如果实现了,则
	 * 调用必要的回调</p>
	 * @param beanName the bean name in the factory (for debugging purposes)
	 *                 -- 工厂中的Bean名(用于调试)
	 * @param bean the new bean instance we may need to initialize
	 *             -- 我们可能需要初始化的新Bean实例
	 * @param mbd the merged bean definition that the bean was created with
	 * (can also be {@code null}, if given an existing bean instance)
	 *            -- 创建Bean时使用的合并BeanDefinition(如果给定现有Bean实例,也可以为null)
	 * @throws Throwable if thrown by init methods or by the invocation process
	 * 		-- 如果由init方法或调用进程抛出
	 * @see #invokeCustomInitMethod
	 */
	protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
			throws Throwable {
		//InitialziingBean:当Bean的所有属性都被BeanFactory设置好后,Bean需要执行相应的接口:例如执行自定义 初始化,或者仅仅是检查所有强制属性是否已经设置好。
		//bean是InitializingBean实例标记
		boolean isInitializingBean = (bean instanceof InitializingBean);
		//isExternallyManagedInitMethod是否外部受管理的Init方法名
		//如果 bean是InitializingBean实例 && (mdb为null || 'afterPropertiesSet' 不是外部受管理的Init方法名)
		if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
			//如果是日志级别为跟踪模式
			if (logger.isTraceEnabled()) {
				//跟踪日志:在具体名称的Bean上调用 afterPrpertiesSet()
				logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
			}
			//如果安全管理器不为null
			if (System.getSecurityManager() != null) {
				try {
					//以特权方式调用 bean的 afterPropertiesSet 方法
					AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
						((InitializingBean) bean).afterPropertiesSet();
						return null;
					}, getAccessControlContext());
				}
				catch (PrivilegedActionException pae) {
					throw pae.getException();
				}
			}
			else {
				//调用 bean的 afterPropertiesSet 方法
				((InitializingBean) bean).afterPropertiesSet();
			}
		}
		//如果mbd不为null && bean不是 NullBean类
		if (mbd != null && bean.getClass() != NullBean.class) {
			//获取mbd指定的初始化方法名
			String initMethodName = mbd.getInitMethodName();
			//如果initMethodName不为null && (bean不是InitializingBean实例 && 'afterPropertiesSet'是初始化方法名)
			// && initMethodName不是外部受管理的Init方法名
			if (StringUtils.hasLength(initMethodName) &&
					!(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
					!mbd.isExternallyManagedInitMethod(initMethodName)) {
				//在bean上调用指定的自定义init方法
				invokeCustomInitMethod(beanName, bean, mbd);
			}
		}
	}

applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

对 existingBean 进行初始化后的后处理:

  1. 初始化结果对象为result,默认引用existingBean
  2. 遍历该工厂创建的bean的BeanPostProcessors列表:
    1. 回调BeanPostProcessor#postProcessAfterInitialization来对result进行包装【变量 current】
    2. 如果current为null,直接返回result,中断其后续的BeanPostProcessor处理
    3. 让result引用current,使其经过所有BeanPostProcess对象的后置处理的层层包装
  3. 返回经过所有BeanPostProcess对象的后置处理的层层包装后的result
/**
	 * 对 existingBean 进行初始化后的后处理
	 * @param existingBean the existing bean instance -- 现有的bean实例
	 * @param beanName the name of the bean, to be passed to it if necessary
	 * (only passed to {@link BeanPostProcessor BeanPostProcessors};
	 * can follow the {@link #ORIGINAL_INSTANCE_SUFFIX} convention in order to
	 * enforce the given instance to be returned, i.e. no proxies etc)
	 * Bean名称,必要时将传递给它(仅传递给BeanPostProcessor;可以遵循ORIGINAL_INSTANCE_SUFFIX
	 * 约定以强制返回给定的实例,即没有代理等)
	 * @return
	 * @throws BeansException
	 */
	@Override
	public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
			throws BeansException {
		//初始化结果对象为result,默认引用existingBean
		Object result = existingBean;
		//遍历该工厂创建的bean的BeanPostProcessors列表
		for (BeanPostProcessor processor : getBeanPostProcessors()) {
			//回调BeanPostProcessor#postProcessAfterInitialization来对现有的bean实例进行包装
			Object current = processor.postProcessAfterInitialization(result, beanName);
			//一般processor对不感兴趣的bean会回调直接返回result,使其能继续回调后续的BeanPostProcessor;
			// 但有些processor会返回null来中断其后续的BeanPostProcessor
			//如果current为null
			if (current == null) {
				//直接返回result,中断其后续的BeanPostProcessor处理
				return result;
			}
			//让result引用processor的返回结果,使其经过所有BeanPostProcess对象的后置处理的层层包装
			result = current;
		}
		//返回经过所有BeanPostProcess对象的后置处理的层层包装后的result
		return result;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值