spring 源码个人浅浅分析(5)--- bean生命周期之BeanNameAware、BeanFactoryAware、InitializingBean

Bean生命周期之BeanNameAware、BeanFactoryAware、InitializingBean

在源码AbstractAutowireCapableBeanFactory的创建bean方法doCreate方法中。

spring 源码个人浅浅分析(5)--- bean生命周期之BeanNameAware、BeanFactoryAware、InitializingBean_第1张图片

bean已经实例化后,且populateBean方法是填充属性之后,就开始调用初始化方法initializeBean。

进入其方法。

protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
		if (System.getSecurityManager() != null) {
			AccessController.doPrivileged(new PrivilegedAction() {
				public Object run() {
                    //对特殊的bean处理:Aware、BeanClassloadAware、BeanFactoryAware
					invokeAwareMethods(beanName, bean);
					return null;
				}
			}, getAccessControlContext());
		}
		else {
            //对特殊的bean处理:Aware、BeanClassloadAware、BeanFactoryAware
			invokeAwareMethods(beanName, bean);
		}
		
		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
            //开始调用BeanPostProcessor的初始化前处理器
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}

		try {
            //激活用户自定义的init方法 
			invokeInitMethods(beanName, wrappedBean, mbd);
		}
		catch (Throwable ex) {
			throw new BeanCreationException(
					(mbd != null ? mbd.getResourceDescription() : null),
					beanName, "Invocation of init method failed", ex);
		}

		if (mbd == null || !mbd.isSynthetic()) {
            //开始调用BeanpostProcessor的初始化后处理器
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}
		return wrappedBean;
	} 
  

1、进入invokeAwareMethods方法可以看到:

spring 源码个人浅浅分析(5)--- bean生命周期之BeanNameAware、BeanFactoryAware、InitializingBean_第2张图片

激活Aware接口:1、BeanNameAware。2、BeanClassLoaderAware。3、BeanFactoryAware。

Spring中提供了一些Aware相关接口,比如BeanFactoryAware、ApplicationContextAware、ResourceLoaderAware、ServletContextAware等。实现这些Aware接口的bean在被初始化之后,可以取得一些相对应的资源,而实现ApplicationContextAware的bean,在bean被初始化之后,将被注入ApplicationContext的实例等。

2、在执行bean初始化前处理器之后,开始调用init方法

spring 源码个人浅浅分析(5)--- bean生命周期之BeanNameAware、BeanFactoryAware、InitializingBean_第3张图片

进入方法invokeInitMethods(beanName, wrappedBean, mbd);

protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)
			throws Throwable {
        //bean是否实现InitializingBean接口中的方法afterPropertiesSet
        //如果实现,则优先执行afterPropertiesSet方法
		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(new PrivilegedExceptionAction() {
						public Object run() throws Exception {
							((InitializingBean) bean).afterPropertiesSet();
							return null;
						}
					}, getAccessControlContext());
				}
				catch (PrivilegedActionException pae) {
					throw pae.getException();
				}
			}				
			else {
				((InitializingBean) bean).afterPropertiesSet();
			}
		}

		if (mbd != null) {
            //如果用户在xml配置文件中配置了属性init-method,则在执行用户自定义的initMethod
			String initMethodName = mbd.getInitMethodName();
			if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
					!mbd.isExternallyManagedInitMethod(initMethodName)) {
				invokeCustomInitMethod(beanName, bean, mbd);
			}
		}
	} 
  

由上面方法很容易看得出2点:

1、bean是否实现InitializingBean接口中的方法afterPropertiesSet,如果实现,则优先执行afterPropertiesSet方法,实现自己的初始化业务逻辑。

2、用户在xml配置文件中配置了初始化属性init-method

都是在初始化bean的时候执行的。执行顺序afterPropertiesSet先执行---> init-method后执行

 

即Bean的生命周期:

postProcessBeforeInstantiation(实例化前置处理器{前提是返回null})--->  postProcessAfterInstantiation(实例化后置处理器) ---> postProcessPropertyValues(实例化的属性值) ---> Aware(BeanNameAware、BeanFactoryAware...) ----> postProcessBeforeInitialization(初始化前处理器) ---> lnitializingBean接口的afterPropertiesSet ---> init-method(自定义配置的初始化init-method方法) ---> postProcessAfterInitialization(初始化后处理器)

 

你可能感兴趣的:(Spring,的问题,spring,源码分析)