GVKun编程网logo

Spring bean 的生命周期(springbean的生命周期面试回答)

24

如果您想了解Springbean的生命周期的相关知识,那么本文是一篇不可错过的文章,我们将对springbean的生命周期面试回答进行全面详尽的解释,并且为您提供关于Bean在SpringBean应用

如果您想了解Spring bean 的生命周期的相关知识,那么本文是一篇不可错过的文章,我们将对springbean的生命周期面试回答进行全面详尽的解释,并且为您提供关于Bean在Spring Bean应用上下文中的生命周期 与 Bean工厂中的生命周期、spring --bean的生命周期、spring bean的生命周期、spring bean的生命周期与springmvc的生命周期的有价值的信息。

本文目录一览:

Spring bean 的生命周期(springbean的生命周期面试回答)

Spring bean 的生命周期(springbean的生命周期面试回答)

学习 spring 源码主框架,从源码角度开发学习 Spring bean 的生命周期。

spring 创建 bean 方法

org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String, java.lang.Class<T>)

public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
		//doGetBean是获取bean的真实方法
		return doGetBean(name, requiredType, null, false);
	}

真正执行 spring 创建 bean 方法 doGetBean

org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean

protected <T> T doGetBean(
			final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)
			throws BeansException {
        //获取的beanname可能是重命名后的,这个获取原始的beanname,这里做别名解析
		final String beanName = transformedBeanName(name);
		Object bean;

		//先从spring缓存池中获取bean,这里是解决循环依赖的根本
		Object sharedInstance = getSingleton(beanName);
		if (sharedInstance != null && args == null) {
			if (logger.isDebugEnabled()) {
				if (isSingletonCurrentlyInCreation(beanName)) {
					logger.debug("Returning eagerly cached instance of singleton bean ''" + beanName +
							"'' that is not fully initialized yet - a consequence of a circular reference");
				}
				else {
					logger.debug("Returning cached instance of singleton bean ''" + beanName + "''");
				}
			}
			//如果从缓存中获取到bean,进行后续处理。
			bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
		}

		else {
			//判断当前创建的bean是不是原型的,如果存在循环依赖,则抛异常
			if (isPrototypeCurrentlyInCreation(beanName)) {
				throw new BeanCurrentlyInCreationException(beanName);
			}

			//获取父工厂
			BeanFactory parentBeanFactory = getParentBeanFactory();
			//判断父工厂是否为空,以及当前容器中是否包含bean定义
			if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
				// Not found -> check parent.
				String nameToLookup = originalBeanName(name);
				//根据构造函数是否有参数,来创建不同的bean
				if (args != null) {
					// Delegation to parent with explicit args.
					return (T) parentBeanFactory.getBean(nameToLookup, args);
				}
				else {
					// No args -> delegate to standard getBean method.
					return parentBeanFactory.getBean(nameToLookup, requiredType);
				}
			}
            
			if (!typeCheckOnly) {
				markBeanAsCreated(beanName);
			}

			try {
			    //合并bean定义,存在抽象父bean定义,专门给子bean做继承的
				final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
				//检查bean定义的是否为抽象的,如果是则抛出异常
				checkMergedBeanDefinition(mbd, beanName, args);

				//获取bean初始化的前置依赖beanname
				String[] dependsOn = mbd.getDependsOn();
				if (dependsOn != null) {
					for (String dep : dependsOn) {
						if (isDependent(beanName, dep)) {
							throw new BeanCreationException(mbd.getResourceDescription(), beanName,
									"Circular depends-on relationship between ''" + beanName + "'' and ''" + dep + "''");
						}
						//解析以来的bean,并注册依赖的bean
						registerDependentBean(dep, beanName);
						try {
					        //递归调用获取依赖bean
							getBean(dep);
						}
						catch (NoSuchBeanDefinitionException ex) {
							throw new BeanCreationException(mbd.getResourceDescription(), beanName,
									"''" + beanName + "'' depends on missing bean ''" + dep + "''", ex);
						}
					}
				}

				// 创建bean的实例
				if (mbd.isSingleton()) {
					sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
						@Override
						public Object getObject() throws BeansException {
							try {
							    //构建bean的实例
								return createBean(beanName, mbd, args);
							}
							catch (BeansException ex) {
								// Explicitly remove instance from singleton cache: It might have been put there
								// eagerly by the creation process, to allow for circular reference resolution.
								// Also remove any beans that received a temporary reference to the bean.
								destroySingleton(beanName);
								throw ex;
							}
						}
					});
					//如果获取的bean是factroybean,那么要处理工厂bean。
					bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
				}

				else if (mbd.isPrototype()) {
					//创建原型bean
					Object prototypeInstance = null;
					try {
					    //在原型bena创建之前回调底层spring函数,开放性方法
						beforePrototypeCreation(beanName);
						prototypeInstance = createBean(beanName, mbd, args);
					}
					finally {
					    //开放性方法
						afterPrototypeCreation(beanName);
					}
					//如果获取的bean是factroybean,那么要处理工厂bean。
					bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
				}

				else {
					String scopeName = mbd.getScope();
					final Scope scope = this.scopes.get(scopeName);
					if (scope == null) {
						throw new IllegalStateException("No Scope registered for scope name ''" + scopeName + "''");
					}
					try {
					    //根据bean定义的scope来创建bean
						Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() {
							@Override
							public Object getObject() throws BeansException {
								beforePrototypeCreation(beanName);
								try {
									return createBean(beanName, mbd, args);
								}
								finally {
									afterPrototypeCreation(beanName);
								}
							}
						});
						bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
					}
					catch (IllegalStateException ex) {
						throw new BeanCreationException(beanName,
								"Scope ''" + scopeName + "'' is not active for the current thread; consider " +
								"defining a scoped proxy for this bean if you intend to refer to it from a singleton",
								ex);
					}
				}
			}
			catch (BeansException ex) {
				cleanupAfterBeanCreationFailure(beanName);
				throw ex;
			}
		}

		// 判断获取的类型是否匹配实际的bean实例
		if (requiredType != null && bean != null && !requiredType.isInstance(bean)) {
			try {
				return getTypeConverter().convertIfNecessary(bean, requiredType);
			}
			catch (TypeMismatchException ex) {
				if (logger.isDebugEnabled()) {
					logger.debug("Failed to convert bean ''" + name + "'' to required type ''" +
							ClassUtils.getQualifiedName(requiredType) + "''", ex);
				}
				throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
			}
		}
		return (T) bean;
	}

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton (java.lang.String, boolean) 这个方法是解决 spring 循环依赖问题

protected Object getSingleton(String beanName, boolean allowEarlyReference) {
        //从一级缓存中获取实例bean,如果有直接返回对象
		Object singletonObject = this.singletonObjects.get(beanName);
		//singletonObject为空并且 beanname是否正在创建中的标识
		if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
		    //防止并发获取bean
			synchronized (this.singletonObjects) {
			    //从earlySingletonObjects早期缓冲池中获取bean
				singletonObject = this.earlySingletonObjects.get(beanName);
				if (singletonObject == null && allowEarlyReference) {
				    //从singletonFactories中获取bean的objectfactory
					ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
					if (singletonFactory != null) {
					    //调用objectfactory的getObject方法获取singletonObject
						singletonObject = singletonFactory.getObject();
						//同时放到earlySingletonObjects提前暴露出来
						this.earlySingletonObjects.put(beanName, singletonObject);
						//并从singletonFactories移除
						this.singletonFactories.remove(beanName);
					}
				}
			}
		}
		return (singletonObject != NULL_OBJECT ? singletonObject : null);
	}

获取实例 bean

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>)

public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
		Assert.notNull(beanName, "''beanName'' must not be null");
		synchronized (this.singletonObjects) {
			Object singletonObject = this.singletonObjects.get(beanName);
			if (singletonObject == null) {
				if (this.singletonsCurrentlyInDestruction) {
					throw new BeanCreationNotAllowedException(beanName,
							"Singleton bean creation not allowed while singletons of this factory are in destruction " +
							"(Do not request a bean from a BeanFactory in a destroy method implementation!)");
				}
				if (logger.isDebugEnabled()) {
					logger.debug("Creating shared instance of singleton bean ''" + beanName + "''");
				}
				//标识当前正在创建的对象,放到singletonsCurrentlyInCreation缓存中
				beforeSingletonCreation(beanName);
				boolean newSingleton = false;
				boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
				if (recordSuppressedExceptions) {
					this.suppressedExceptions = new LinkedHashSet<Exception>();
				}
				try {
				    //调用接口objectfacotry的getObject方法, 这个方法被重写
					singletonObject = singletonFactory.getObject();
					newSingleton = true;
				}
				catch (IllegalStateException ex) {
					// Has the singleton object implicitly appeared in the meantime ->
					// if yes, proceed with it since the exception indicates that state.
					singletonObject = this.singletonObjects.get(beanName);
					if (singletonObject == null) {
						throw ex;
					}
				}
				catch (BeanCreationException ex) {
					if (recordSuppressedExceptions) {
						for (Exception suppressedException : this.suppressedExceptions) {
							ex.addRelatedCause(suppressedException);
						}
					}
					throw ex;
				}
				finally {
					if (recordSuppressedExceptions) {
						this.suppressedExceptions = null;
					}
					//当前bean已经创建好了,到singletonsCurrentlyInCreation中bean移除掉
					afterSingletonCreation(beanName);
				}
				if (newSingleton) {
				    //把创建好的bean加载到缓存池中,并移除二三级缓存
					addSingleton(beanName, singletonObject);
				}
			}
			//对bean判空
			return (singletonObject != NULL_OBJECT ? singletonObject : null);
		}
	}

创建 bean 实例

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])

protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
		if (logger.isDebugEnabled()) {
			logger.debug("Creating instance of bean ''" + beanName + "''");
		}
		RootBeanDefinition mbdToUse = mbd;

		// Make sure bean class is actually resolved at this point, and
		// clone the bean definition in case of a dynamically resolved Class
		// which cannot be stored in the shared merged bean definition.
		Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
		if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
			mbdToUse = new RootBeanDefinition(mbd);
			mbdToUse.setBeanClass(resolvedClass);
		}

		// Prepare method overrides.
		try {
			mbdToUse.prepareMethodOverrides();
		}
		catch (BeanDefinitionValidationException ex) {
			throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
					beanName, "Validation of method overrides failed", ex);
		}

		try {
			// 这里给后置处理器一个机会去创建代理对象,第一次创建bean到这里还没有创建好bean, 仅仅把切面信息解析出来放入缓存中
			Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
			if (bean != null) {
				return bean;
			}
		}
		catch (Throwable ex) {
			throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
					"BeanPostProcessor before instantiation of bean failed", ex);
		}

        //真正执行创建bean实例的方法doCreateBean
		Object beanInstance = doCreateBean(beanName, mbdToUse, args);
		if (logger.isDebugEnabled()) {
			logger.debug("Finished creating instance of bean ''" + beanName + "''");
		}
		return beanInstance;
	}

真正执行创建 Bean

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
			throws BeanCreationException {

		// Instantiate the bean.
		BeanWrapper instanceWrapper = null;
		if (mbd.isSingleton()) {
			instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
		}
		if (instanceWrapper == null) {
		    //根据@bean, @autowire来创建有参构造函数, 或者无参数构造函数
			instanceWrapper = createBeanInstance(beanName, mbd, args);
		}
		final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null);
		Class<?> beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null);
		mbd.resolvedTargetType = beanType;
        
        //允许后置处理器去修改merge后的bean定义
		synchronized (mbd.postProcessingLock) {
			if (!mbd.postProcessed) {
				try {
					applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
				}
				catch (Throwable ex) {
					throw new BeanCreationException(mbd.getResourceDescription(), beanName,
							"Post-processing of merged bean definition failed", ex);
				}
				mbd.postProcessed = true;
			}
		}

		// 判断earlySingletonObjects是否提前暴露bean对象
		boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
				isSingletonCurrentlyInCreation(beanName));
		if (earlySingletonExposure) {
			if (logger.isDebugEnabled()) {
				logger.debug("Eagerly caching bean ''" + beanName +
						"'' to allow for resolving potential circular references");
			}
			//将已经创建好但是属性还没有赋值的bean对象,通过objectfacotry的形式来加载到缓存中用来解决循环依赖的问题
			addSingletonFactory(beanName, new ObjectFactory<Object>() {
				@Override
				public Object getObject() throws BeansException {
					return getEarlyBeanReference(beanName, mbd, bean);
				}
			});
		}

		// Initialize the bean instance.
		Object exposedObject = bean;
		try {
		    //为刚刚创建的bean对象进行赋值
			populateBean(beanName, mbd, instanceWrapper);
			if (exposedObject != null) {
			    //初始化bean,并且通过开放性方法为bean赋值
				exposedObject = initializeBean(beanName, exposedObject, mbd);
			}
		}
		catch (Throwable ex) {
			if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
				throw (BeanCreationException) ex;
			}
			else {
				throw new BeanCreationException(
						mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
			}
		}

		if (earlySingletonExposure) {
			Object earlySingletonReference = getSingleton(beanName, false);
			if (earlySingletonReference != null) {
				if (exposedObject == bean) {
					exposedObject = earlySingletonReference;
				}
				else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
					String[] dependentBeans = getDependentBeans(beanName);
					Set<String> actualDependentBeans = new LinkedHashSet<String>(dependentBeans.length);
					for (String dependentBean : dependentBeans) {
						if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
							actualDependentBeans.add(dependentBean);
						}
					}
					if (!actualDependentBeans.isEmpty()) {
						throw new BeanCurrentlyInCreationException(beanName,
								"Bean with name ''" + beanName + "'' has been injected into other beans [" +
								StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
								"] in its raw version as part of a circular reference, but has eventually been " +
								"wrapped. This means that said other beans do not use the final version of the " +
								"bean. This is often the result of over-eager type matching - consider using " +
								"''getBeanNamesOfType'' with the ''allowEagerInit'' flag turned off, for example.");
					}
				}
			}
		}

		try {
		    //注册自定义销毁bean的方法
			registerDisposableBeanIfNecessary(beanName, bean, mbd);
		}
		catch (BeanDefinitionValidationException ex) {
			throw new BeanCreationException(
					mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
		}

		return exposedObject;
	}

初始化已经创建好的 bean 实例

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)

protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
        //权限校验是否判断是否可以回调底层组件方法
		if (System.getSecurityManager() != null) {
			AccessController.doPrivileged(new PrivilegedAction<Object>() {
				@Override
				public Object run() {
					invokeAwareMethods(beanName, bean);
					return null;
				}
			}, getAccessControlContext());
		}
		else {
			invokeAwareMethods(beanName, bean);
		}

		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
		  //实现自定义的bean的后置处理器的前置方法
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}

		try {
		    //调用自定义的init方法或InitializingBean
			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()) {
		    //实现自定义的bean的后置处理器的后置方法
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}
		return wrappedBean;
	}

以上,就是 spring ioc 模块 bean 生命周期的源代码解析。

还没关注我的公众号?

  • 扫文末二维码关注公众号【小强的进阶之路】可领取如下:
  • 学习资料: 1T 视频教程:涵盖 Javaweb 前后端教学视频、机器学习 / 人工智能教学视频、Linux 系统教程视频、雅思考试视频教程;
  • 100 多本书:包含 C/C++、Java、Python 三门编程语言的经典必看图书、LeetCode 题解大全;
  • 软件工具:几乎包括你在编程道路上的可能会用到的大部分软件;
  • 项目源码:20 个 JavaWeb 项目源码。 小强的进阶之路二维码

Bean在Spring Bean应用上下文中的生命周期 与 Bean工厂中的生命周期

Bean在Spring Bean应用上下文中的生命周期 与 Bean工厂中的生命周期

Bean在Spring Bean应用上下文中的生命周期:

第1步、实例化

2、设置属性值

3、调用BeanNameAware的setBeanName()方法

4、调用BeanFactoryAware的setBeanFactory()方法

5、调用ApplicationContextAware方法setApplicationContext()方法

6、调用BeanPostProcessor的预初始化方法(before>

7、调用InitializingBean的afterPropertiesSet()方法

8、调用调用定制的初始化方法

9、调用BeanPostProcessor的后初始化方法(after)

10、Bean可以使用了

11、容器关闭

12、调用DisposableBean的destory()方法

13、调用定制的销毁方法

Bean在Spring Bean工厂中的生命周期:

第1、实例化

2、设置属性值

3、调用BeanNameAware的setBeanName()方法

4、调用BeanFactoryAware的setBeanFactory()方法

5、调用InitializingBean的afterPropertiesSet()方法

6、调用调用定制的初始化方法

7、Bean可以使用了

8、容器关闭

9、调用DisposableBean的destory()方法

10、调用定制的销毁方法



spring --bean的生命周期

spring --bean的生命周期

bean生命周期 概述

protected <T> T doGetBean(
            String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)

bean的生命周期从调用beanfactory的doGetBean开始,到这个bean被销毁,可以总结为以下七个阶段

  1. 处理名称,检查缓存
  2. 处理父子容器
  3. 处理dependsOn
  4. 选择Scope策略
  5. 创建bean
  6. 类型转换处理
  7. 销毁bean

1.处理名称,检查缓存

  • 这一步会处理别名,将别名解析为实际名称

  • 对 factorybean 也会特殊处理,如果以 & 开头表示要获取 factorybean 本身,否则表示要获取其产品

  • 这里针对单例对象会检查一级、二级、三级缓存

  • singletonFactories 三级缓存,存放单例工厂对象

  • earlySingletonObjects 二级缓存,存放单例工厂的产品对象

  • 如果发生循环依赖,产品是代理;无循环依赖,产品是原始对象

  • singletonObjects 一级缓存,存放单例成品对象

  • 2. 处理父子容器

  • 如果当前容器根据名字找不到这个 bean,此时若父容器存在,则执行父容器的 getBean 流程

  • 父子容器的 bean 名称可以重复

  • 3. 处理 dependsOn

  • 如果当前 bean 有通过 dependsOn 指定了非显式依赖的 bean,这一步会提前创建这些 dependsOn 的 bean

  • 所谓非显式依赖,就是指两个 bean 之间不存在直接依赖关系,但需要控制它们的创建先后顺序

  • 4. 选择 scope 策略

  • 对于 singleton scope,首先到单例池去获取 bean,如果有则直接返回,没有再进入创建流程

  • 对于 prototype scope,每次都会进入创建流程

  • 对于自定义 scope,例如 request,首先到 request 域获取 bean,如果有则直接返回,没有再进入创建流程

  • 5.1 创建 bean - 创建 bean 实例

    要点总结
    有自定义 TargetSource 的情况 由 AnnotationAwareAspectJAutoproxyCreator 创建代理返回
    supplier 方式创建 bean 实例 为 Spring 5.0 新增功能,方便编程方式创建 bean 实例
    FactoryMethod 方式 创建 bean 实例 ① 分成静态工厂与实例工厂;② 工厂方法若有参数,需要对工厂方法参数进行解析,利用 resolveDependency;③ 如果有多个工厂方法候选者,还要进一步按权重筛选
    AutowiredAnnotationBeanPostProcessor ① 优先选择带 @Autowired 注解的构造;② 若有唯一的带参构造,也会入选
    mbd.getPreferredConstructors 选择所有公共构造,这些构造之间按权重筛选
    采用默认构造 如果上面的后处理器和 BeanDefiniation 都没找到构造,采用默认构造,即使是私有的
     

    5.2 创建 bean - 依赖注入

    要点总结
    AutowiredAnnotationBeanPostProcessor 识别 @Autowired 及 @Value 标注的成员,封装为 InjectionMetadata 进行依赖注入
    CommonAnnotationBeanPostProcessor 识别 @Resource 标注的成员,封装为 InjectionMetadata 进行依赖注入
    resolveDependency 用来查找要装配的值,可以识别:① Optional;② ObjectFactory 及 ObjectProvider;③ @Lazy 注解;④ @Value 注解(${ }, #{ }, 类型转换);⑤ 集合类型(Collection,Map,数组等);⑥ 泛型和 @Qualifier(用来区分类型歧义);⑦ primary 及名字匹配(用来区分类型歧义)
    AUTOWIRE_BY_NAME 根据成员名字找 bean 对象,修改 mbd 的 propertyValues,不会考虑简单类型的成员
    AUTOWIRE_BY_TYPE 根据成员类型执行 resolveDependency 找到依赖注入的值,修改 mbd 的 propertyValues
    applyPropertyValues 根据 mbd 的 propertyValues 进行依赖注入(即xml中 <property name ref|value/>

    5.3 创建 bean - 初始化

    要点总结
    内置 Aware 接口的装配 包括 BeanNameAware,beanfactoryAware 等
    扩展 Aware 接口的装配 由 ApplicationContextAwareProcessor 解析,执行时机在 postProcessBeforeInitialization
    @postconstruct 由 CommonAnnotationBeanPostProcessor 解析,执行时机在 postProcessBeforeInitialization
    InitializingBean 通过接口回调执行初始化
    initMethod 根据 BeanDeFinition 得到的初始化方法执行初始化,即 <bean init-method> 或 @Bean(initMethod)
    创建 aop 代理 由 AnnotationAwareAspectJAutoproxyCreator 创建,执行时机在 postProcessAfterInitialization

    5.4 创建 bean - 注册可销毁 bean

    在这一步判断并登记可销毁 bean

  • 判断依据

  • 如果实现了 disposableBean 或 AutoCloseable 接口,则为可销毁 bean

  • 如果自定义了 destroyMethod,则为可销毁 bean

  • 如果采用 @Bean 没有指定 destroyMethod,则采用自动推断方式获取销毁方法名(close,shutdown)

  • 如果有 @PreDestroy 标注的方法

  • 存储位置

  • singleton scope 的可销毁 bean 会存储于 beanfactory 的成员当中

  • 自定义 scope 的可销毁 bean 会存储于对应的域对象当中

  • prototype scope 不会存储,需要自己找到此对象销毁

  • 存储时都会封装为 disposableBeanAdapter 类型对销毁方法的调用进行适配

  • 6. 类型转换处理

  • 如果 getBean 的 requiredType 参数与实际得到的对象类型不同,会尝试进行类型转换

  • 7. 销毁 bean

  • 销毁时机

  • singleton bean 的销毁在 ApplicationContext.close 时,此时会找到所有 disposableBean 的名字,逐一销毁

  • 自定义 scope bean 的销毁在作用域对象生命周期结束时

  • prototype bean 的销毁可以通过自己手动调用 AutowireCapablebeanfactory.destroyBean 方法执行销毁

  • 同一 bean 中不同形式销毁方法的调用次序

  • 优先后处理器销毁,即 @PreDestroy

  • 其次 disposableBean 接口销毁

  • 最后 destroyMethod 销毁(包括自定义名称,推断名称,AutoCloseable 接口 多选一)

  •  

    spring bean的生命周期

    spring bean的生命周期

    一、代码示例

    1.1 Student类实现BeanNameAware,InitializingBean,DisposableBean
    public class Student implements BeanNameAware, InitializingBean, DisposableBean {
        private String age;
    
        public Student(String age) {
            this.age = age;
            System.out.println(this.toString());
        }
    
        public void setAge(String age) {
            System.out.println("start setAge");
            this.age = age;
        }
    
        @Override
        public void setBeanName(String s) {
            System.out.println("start BeanNameAware.setBeanName");
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "age=''" + age + ''\'''' +
                    ''}'';
        }
    
        @PostConstruct
        public void init() {
            System.out.println("PostConstruct init");
        }
    
        @PreDestroy
        public void destroy1() {
            System.out.println("PreDestroy destroy");
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("InitializingBean.afterPropertiesSet");
        }
    
        @Override
        public void destroy() throws Exception {
            System.out.println("DisposableBean.destroy");
        }
    
        public void selfInit() {
            System.out.println("selfInit");
        }
    }
    
    1.2 OneProcessor实现BeanPostProcessor
    public class OneProcessor implements BeanPostProcessor {
    
        @Override
        public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
            System.out.println("start BeanPostProcessor.postProcessBeforeInitialization name=" + s);
            Student student = null;
            if (o instanceof Student) {
                student = (Student) o;
                student.setAge("before");
            }
            return student;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
            System.out.println("start BeanPostProcessor.postProcessAfterInitialization name=" + s);
            Student student = null;
            if (o instanceof Student) {
                student = (Student) o;
                student.setAge("after");
            }
            return student;
        }
    }
    
    1.3 配置类,将Student和OneProcessor注入到Spring容器
    @Configuration
    public class MyConfig {
        @Bean(initMethod = "selfInit")
        public Student student(){
            Student s = new Student("first");
            s.setAge("second");
            return s;
        }
    
        @Bean
        public OneProcessor myProcessor(){
            return new OneProcessor();
        }
    }
    
    1.4测试类
    package com.lara.springbootconfig.springlife;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    /**
     * @author lara
     * @date 2020/9/11 11:29
     */
    public class Test {
        public static void main(String[] args) {
            ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
        }
    }
    
    1.5输出结果

    二、源码解读

    bean创建的主要方法为:AbstractAutowireCapableBeanFactory.doCreateBean()方法。源码如下

    2.1 首先实例化bean

    如下图所示的createBeanInstance,但是此时的对象并未进行属性的填充

    2.2 填充bean的属性

    • 1处是spring解决循环依赖的关键,此处暂不做详解
    • 2处对属性进行注入,如果需要注入的属性不在spring容器中,则会加载次属性
    • 3处及进行初始化bean
    2.3 初始化bean源码解读

    具体看下initializeBean()方法

    protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
    	if (System.getSecurityManager() != null) {
    		AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
            //1.调用aware接口方法
    			invokeAwareMethods(beanName, bean);
    			return null;
    		}, getAccessControlContext());
    	}
    	else {
    		invokeAwareMethods(beanName, bean);
    	}
    	Object wrappedBean = bean;
    	if (mbd == null || !mbd.isSynthetic()) {
        //2.调用BeanPostProcessor的before方法
    		wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
    	}
    	try {
        //3.调用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()) {
        //4.调用BeanPostProcessor的after方法
    		wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    	}
    	return wrappedBean;
    }
    
    • 1.处的invokeAwareMethods如下
    private void invokeAwareMethods(final String beanName, final Object bean) {
    	if (bean instanceof Aware) {
    		if (bean instanceof BeanNameAware) {
            //1.调用BeanNameAware接口的setBeanName
    			((BeanNameAware) bean).setBeanName(beanName);
    		}
    		if (bean instanceof BeanClassLoaderAware) {
    			ClassLoader bcl = getBeanClassLoader();
    			if (bcl != null) {
                //2.调用BeanClassLoaderAware接口的setBeanClassLoader
    				((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
    			}
    		}
    		if (bean instanceof BeanFactoryAware) {
            //3.调用BeanFactoryAware接口的setBeanFactory
    			((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
    		}
    	}
    }
    

    及如果我们实现了BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口的话,依次实现setBeanName、setBeanClassLoader、setBeanFactory方法

    • 2.applyBeanPostProcessorsBeforeInitialization源码如下:
    @Override
    public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
    		throws BeansException {
    	Object result = existingBean;
    	for (BeanPostProcessor processor : getBeanPostProcessors()) {
    		Object current = processor.postProcessBeforeInitialization(result, beanName);
    		if (current == null) {
    			return result;
    		}
    		result = current;
    	}
    	return result;
    }
    

    如果有多个类实现了BeanPostProcessor接口,则for循环依次调用每个BeanPostProcessor的postProcessBeforeInitialization方法

    • 3.invokeInitMethods源码如下  发现如果实现了InitializingBean接口,重写了afterPropertiesSet方法,则会调用afterPropertiesSet方法,最后还会调用是否指定了init-method
      • 4.applyBeanPostProcessorsAfterInitialization和2处的类似,执行 BeanPostProcessor的postProcessAfterInitialization方法。 至此,整个bean的创建就完成了。

    三、总结

    创建bean的流程图如下:

    参考博文: https://www.cnblogs.com/semi-sub/p/13548479.html

    spring bean的生命周期与springmvc的生命周期

    spring bean的生命周期与springmvc的生命周期

    配置在Spring中的Bean在Spring容器中从加载到销毁会经历那些过程呢?如果实现一些特定的Spring接口,这些特定接口的方法会在什么时候被调用呢?本文简单介绍一下这些过程.

    Bean在Spring容器中的生命周期如下图所示:

     

    1,调用Bean的构造函数(或者工厂方法)实例化Bean.
    2,对Bean的成员变量赋值.
    3,如果Bean实现了BeanNameAware,调用Bean的setBeanName方法.
    4,如果Bean实现了BeanFactoryAware,调用Bean的setBeanFactory方法.
    5,如果Bean实现了ApplicationContextAware,调用Bean的setApplicationContext方法.
    6,如果容器中配置了BeanPostProcessor,调用BeanPostProcessor的postProcessBeforeInitialization方法(如果有多个BeanPostProcessor,调用每一个BeanPostProcessor的postProcessBeforeInitialization方法).
    6,如果Bean实现了InitializingBean,调用Bean的afterPropertiesSet方法.
    7,如果Bean配置了init-method方法,调用init-method配置的Bean方法.
    8,如果容器中配置了BeanPostProcessor,调用BeanPostProcessor的postProcessAfterInitialization方法.(如果有多个BeanPostProcessor,调用每一个BeanPostProcessor的postProcessAfterInitialization方法).
    9,Bean处于可以使用的状态.
    10,Spring容器关闭.
    11,4,如果Bean实现了DisposableBean,调用Bean的destroy方法.
    12,如果Bean配置了destroy-method方法,调用destroy-method配置的Bean的方法.

     

      SpringMVC的生命周期,即SpringMVC的执行流程:

        第一步:发起请求到前端控制器(DispatcherServlet)
        第二步:前端控制器请求HandlerMapping(处理器映射器)查找 Handler
            可以根据xml配置、注解进行查找
        第三步:处理器映射器HandlerMapping向前端控制器返回Handler
        第四步:前端控制器调用处理器适配器去执行Handler
        第五步:处理器适配器去执行Handler
        第六步:Handler执行完成给适配器返回ModelAndView
        第七步:处理器适配器向前端控制器返回ModelAndView
            ModelAndView是springmvc框架的一个底层对象,包括 Model和view
        第八步:前端控制器请求视图解析器去进行视图解析
            根据逻辑视图名解析成真正的视图(jsp)
        第九步:视图解析器向前端控制器返回View
        第十步:前端控制器进行视图渲染
            视图渲染将模型数据(在ModelAndView对象中)填充到request域
        第十一步:前端控制器向用户响应结果

    关于Spring bean 的生命周期springbean的生命周期面试回答的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Bean在Spring Bean应用上下文中的生命周期 与 Bean工厂中的生命周期、spring --bean的生命周期、spring bean的生命周期、spring bean的生命周期与springmvc的生命周期等相关知识的信息别忘了在本站进行查找喔。

    本文标签: