天天看点

Spring bean的获取、创建过程,生命周期,循环依赖

目录

      • getSingleton() 获取单例对象
        • 3个map(三级缓存)
        • 其它集合类型的成员字段
        • getSingleton() 从三级缓存获取单例bean实例
        • getSingleton() 从工厂实例获取单例bean实例
      • getBean() 获取bean实例的过程
        • getBean()
        • doGetBean()
        • getBean() 整体流程图
      • DependsOn依赖
      • bean的懒加载
      • createBean() 创建bean实例的过程
        • createBean()
        • createBean() 流程图
        • doCreateBean()
        • populateBean() 填充属性,注入所需依赖
        • initializeBean() 初始化
        • doCreateBean() 整体流程图
      • 循环依赖
        • 循环依赖的概念
        • 循环依赖问题触发的时机
        • spring解决循环依赖的原理图
        • spring解决循环依赖的原理
        • spring可以解决哪些种类的循环依赖问题
        • 三级缓存各自的存入时机
        • 可以不要第二级缓存吗
        • 可以不要第三级缓存吗 | 只使用两级缓存行吗
      • bean的生命周期
        • bean的生命周期
        • bean生命周期中的常见单词
        • bean的初始化、销毁方法
        • @PostConstruct、@PreDestroy
        • bean的后置处理器BeanPostProcessor
        • InstantiationAwareBeanPostProcessor
        • BeanFactoryPostProcessor

使用的spring源码版本 5.3.x

getSingleton() 获取单例对象

提供单例操作的类主要是 DefaultSingletonBeanRegistry ,此处介绍这个类的

  • 几个集合类型的成员变量:三级缓存
  • 2个重载的 getSingleton() 方法:用于获取单例bean的实例
    • getSingleton(String beanName, boolean allowEarlyReferenc) 从三级缓存获取单例bean的实例
    • getSingleton(String beanName, ObjectFactory<?> singletonFactory) 从工厂实例获取单例bean的实例

3个map(三级缓存)

/** Cache of singleton objects: bean name to bean instance. */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

/** Cache of early singleton objects: bean name to bean instance. */
private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16);

/** Cache of singleton factories: bean name to ObjectFactory. */
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
           

spring使用三级缓存解决循环依赖问题

  • singletonObjects:一级缓存,用于保存已经创建好的单例bean
  • earlySingletonObjects:二级缓存,用于保存已经创建实例但尚未进行属性注入(初始化)的单例bean
  • singletonFactories:三级缓存,用于保存bean的工厂实例,二级缓存中存储的就是从工厂实例中获取到的对象。

其它集合类型的成员字段

/** Set of registered singletons, containing the bean names in registration order. */
private final Set<String> registeredSingletons = new LinkedHashSet<>(256);

/** Names of beans that are currently in creation. */
private final Set<String> singletonsCurrentlyInCreation =
		Collections.newSetFromMap(new ConcurrentHashMap<>(16));

/** Names of beans currently excluded from in creation checks. */
private final Set<String> inCreationCheckExclusions =
		Collections.newSetFromMap(new ConcurrentHashMap<>(16));


/** Disposable bean instances: bean name to disposable instance. */
private final Map<String, Object> disposableBeans = new LinkedHashMap<>();

/** Map between containing bean names: bean name to Set of bean names that the bean contains. */
private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<>(16);

/** Map between dependent bean names: bean name to Set of dependent bean names. */
private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<>(64);

/** Map between depending bean names: bean name to Set of bean names for the bean's dependencies. */
private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<>(64);
           

getSingleton() 从三级缓存获取单例bean实例

此实质是到三级缓存中尝试获取bean

@Nullable
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
	//先在一级缓存中查找
	Object singletonObject = this.singletonObjects.get(beanName);
	//如果找不到且当前bean是正在创建的单例bean
	if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
		//则到二级缓存中查找
		singletonObject = this.earlySingletonObjects.get(beanName);
		/**如果二级缓存中也没有,且 allowEarlyReference为true,则尝试到三级缓存中获取对应的工厂实例,通过工厂创建bean实例,放到二级缓存中并返回该实例(尚未填充属性)*/
		if (singletonObject == null && allowEarlyReference) {
			/**在此期间,可能其它线程已经创建好了实例放到一二级缓存中,所以需要再次校验一级缓存、二级缓存中是否有对应实例,为防止多线程同时操作,加上同步锁*/
			synchronized (this.singletonObjects) {
				singletonObject = this.singletonObjects.get(beanName);
				//如果一级缓存中仍然没有
				if (singletonObject == null) {
					singletonObject = this.earlySingletonObjects.get(beanName);
					//二级缓存中也没有
					if (singletonObject == null) {
						//则从三级缓存中获取对应的工厂实例
						ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
						if (singletonFactory != null) {
							//使用工厂创建bean的实例(尚未注入属性|初始化)
							singletonObject = singletonFactory.getObject();
							//并将创建好的bean实例放到二级缓存中
							this.earlySingletonObjects.put(beanName, singletonObject);
							//因为是获取的是单例bean,三级缓存中对应的工厂实例只会使用一次,所以使用完就可以移除
							this.singletonFactories.remove(beanName);
						}
					}
				}
			}
		}
	}
	//返回获取的单例对象
	return singletonObject;
}
           
Spring bean的获取、创建过程,生命周期,循环依赖

getSingleton() 从工厂实例获取单例bean实例

getSingleton(String beanName, ObjectFactory<?> singletonFactory)

public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
	Assert.notNull(beanName, "Bean name must not be null");
	/** 从工厂实例获取单例bean的实例,操作之前需要加同步锁,并校验缓存中有没有需要的单例  */
	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 + "'");
			}
			beforeSingletonCreation(beanName);
			boolean newSingleton = false;
			boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
			if (recordSuppressedExceptions) {
				this.suppressedExceptions = new LinkedHashSet<>();
			}
			try {
				/** 从工厂实例获取单例bean的实例。
					形参singletonFactory是ObjectFactory的实例,ObjectFactory是函数式接口,需要实现getObject()方法。
					ObjectFactory用于从工厂获取对象实例,不仅仅只用于获取单例,可能创建的要求是代理,还要注入所依赖的bean,所以实现往往是调用createBean()方法,而非直接调用上面简单的getSingleton()。
				   在createBean()方法中,bean经过实例化、填充属性、初始化等流程,已经是完全体的bean实例了,如果是单例,会被放到二级缓存中。 */
				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;
				}
				afterSingletonCreation(beanName);
			}
			/** 如果是新创建的单例,则调用addSingleton()方法把,把实例放到一级缓存中,并从二三级缓存移除相关实例 */
			if (newSingleton) {
				addSingleton(beanName, singletonObject);
			}
		}
		return singletonObject;
	}
}


protected void addSingleton(String beanName, Object singletonObject) {
	synchronized (this.singletonObjects) {
		this.singletonObjects.put(beanName, singletonObject);
		this.singletonFactories.remove(beanName);
		this.earlySingletonObjects.remove(beanName);
		this.registeredSingletons.add(beanName);
	}
}
           

这个方法主要做了2件事

  • 调用工厂实例的getObject()方法获取bean实例
  • 如果是新创建的单例,还会把实例一级缓存中、从二三级缓存移除对应的实例

getBean() 获取bean实例的过程

抽象类 AbstractBeanFactory 包含了许多操作bean的方法,比如

  • 抽象方法 getBeanDefinition()、createBean()
  • 提供了实现的方法 getBean()、 doGetBean()

getBean()

@Override
public Object getBean(String name) throws BeansException {
	return doGetBean(name, null, null, false);
}

@Override
public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
	return doGetBean(name, requiredType, null, false);
}

@Override
public Object getBean(String name, Object... args) throws BeansException {
	return doGetBean(name, null, args, false);
}

/**
 * Return an instance, which may be shared or independent, of the specified bean.
 * @param name the name of the bean to retrieve
 * @param requiredType the required type of the bean to retrieve
 * @param args arguments to use when creating a bean instance using explicit arguments
 * (only applied when creating a new instance as opposed to retrieving an existing one)
 * @return an instance of the bean
 * @throws BeansException if the bean could not be created
 */
public <T> T getBean(String name, @Nullable Class<T> requiredType, @Nullable Object... args)
		throws BeansException {

	return doGetBean(name, requiredType, args, false);
}
           

getBean()实质是调用 doGetBean()

doGetBean()

/**
 * Return an instance, which may be shared or independent, of the specified bean.
 * @param name the name of the bean to retrieve
 * @param requiredType the required type of the bean to retrieve
 * @param args arguments to use when creating a bean instance using explicit arguments
 * (only applied when creating a new instance as opposed to retrieving an existing one)
 * @param typeCheckOnly whether the instance is obtained for a type check,
 * not for actual use
 * @return an instance of the bean
 * @throws BeansException if the bean could not be created
 */
@SuppressWarnings("unchecked")
protected <T> T doGetBean(
		String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
		throws BeansException {

	//转换别名。如果传入的是别名,会先转换为对应的beanName
	String beanName = transformedBeanName(name);
	Object beanInstance;

	//先尝试从三级缓存中获取实例
	
	//实际是调用 getSingleton(beanName, true)
	Object sharedInstance = getSingleton(beanName);
	//如果从缓存中获取到实例。方法参数args只用在创建新实例时,==null说明是要从缓存中获取
	if (sharedInstance != null && args == null) {
		if (logger.isTraceEnabled()) {
			if (isSingletonCurrentlyInCreation(beanName)) {
				logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
						"' that is not fully initialized yet - a consequence of a circular reference");
			}
			else {
				logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
			}
		}
		//则对实例进行修饰处理
		beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, null);
	}

	//如果未获取到实例,说明需要新建实例
	else {
		// Fail if we're already creating this bean instance:
		// We're assumably within a circular reference.
		if (isPrototypeCurrentlyInCreation(beanName)) {
			throw new BeanCurrentlyInCreationException(beanName);
		}

		/** 如果当前BeanFactory实例中没有对应的bean definition,且父BeanFactory实例存在,则通过父BeanFactory实例获取bean实例。
		   注意:当前类是AbstractBeanFactory,当前对象是BeanFactory的实例 */
		
		// Check if bean definition exists in this factory.
		BeanFactory parentBeanFactory = getParentBeanFactory();
		if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
			// Not found -> check parent.
			String nameToLookup = originalBeanName(name);
			if (parentBeanFactory instanceof AbstractBeanFactory) {
				return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
						nameToLookup, requiredType, args, typeCheckOnly);
			}
			else if (args != null) {
				// Delegation to parent with explicit args.
				return (T) parentBeanFactory.getBean(nameToLookup, args);
			}
			else if (requiredType != null) {
				// No args -> delegate to standard getBean method.
				return parentBeanFactory.getBean(nameToLookup, requiredType);
			}
			else {
				return (T) parentBeanFactory.getBean(nameToLookup);
			}
		}

		/** 执行到此,说明当前BeanFactory实例中存在对应的bean definition,那就使用当前BeanFactory实例创建bean实例 */
		
		if (!typeCheckOnly) {
			markBeanAsCreated(beanName);
		}

		StartupStep beanCreation = this.applicationStartup.start("spring.beans.instantiate")
				.tag("beanName", name);
		try {
			if (requiredType != null) {
				beanCreation.tag("beanType", requiredType::toString);
			}
			//合并bean definition
			RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
			checkMergedBeanDefinition(mbd, beanName, args);

			/** 处理DependsOn依赖,如果DependsOn依赖尚未实例化,则先实例化 */
			
			// Guarantee initialization of beans that the current bean depends on.
			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 + "'");
					}
					registerDependentBean(dep, beanName);
					try {
						//调用getBean(),保证DependsOn依赖在当前bean实例化化之前都已实例化
						getBean(dep);
					}
					catch (NoSuchBeanDefinitionException ex) {
						throw new BeanCreationException(mbd.getResourceDescription(), beanName,
								"'" + beanName + "' depends on missing bean '" + dep + "'", ex);
					}
				}
			}

			/** 开始创建bean实例。
				单例、原型创建实例的方式有所区别,需要先判断bean的类型,但核心都是调用createBean()方法创建实例。
				此处单例使用的getSingleton()是重载方法,不是操作三级缓存的那个getSingleton() */
				
			// Create bean instance.
			if (mbd.isSingleton()) {
				/** 这个是重载的getSingleton(),从工厂实例获取单例,用lambda表达式实现ObjectFactory接口。
					getSingleton()先调用reateBean()创建bean实例,完全创建好的单例放在二级缓存中,getSingleton()再把二级缓存中的这个单例移到一级缓存中 */
				sharedInstance = getSingleton(beanName, () -> {
					try {
						//调用createBean()创建实例
						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.
						//createBean()过程中出问题时需要销毁实例,原型每次都是新建,即使出问题也不影响下次getBean(),所以不用销毁,gc会自动回收
						destroySingleton(beanName);
						throw ex;
					}
				});
				//对实例进行修饰处理
				beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
			}

			else if (mbd.isPrototype()) {
				// It's a prototype -> create a new instance.
				Object prototypeInstance = null;
				try {
					beforePrototypeCreation(beanName);
					//调用createBean()创建实例
					prototypeInstance = createBean(beanName, mbd, args);
				}
				finally {
					afterPrototypeCreation(beanName);
				}
				//对实例进行修饰处理
				beanInstance = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
			}

			else {
				String scopeName = mbd.getScope();
				if (!StringUtils.hasLength(scopeName)) {
					throw new IllegalStateException("No scope name defined for bean ´" + beanName + "'");
				}
				Scope scope = this.scopes.get(scopeName);
				if (scope == null) {
					throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
				}
				try {
					Object scopedInstance = scope.get(beanName, () -> {
						beforePrototypeCreation(beanName);
						try {
							return createBean(beanName, mbd, args);
						}
						finally {
							afterPrototypeCreation(beanName);
						}
					});
					//对实例进行修饰处理
					beanInstance = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
				}
				catch (IllegalStateException ex) {
					throw new ScopeNotActiveException(beanName, scopeName, ex);
				}
			}
		}
		catch (BeansException ex) {
			beanCreation.tag("exception", ex.getClass().toString());
			beanCreation.tag("message", String.valueOf(ex.getMessage()));
			cleanupAfterBeanCreationFailure(beanName);
			throw ex;
		}
		finally {
			beanCreation.end();
		}
	}

	return adaptBeanInstance(name, beanInstance, requiredType);
}
           

getBean() 整体流程图

Spring bean的获取、创建过程,生命周期,循环依赖

DependsOn依赖

在实例化bean之前,会先实例化该bean所有的 DependsOn依赖。

如果bean没有直接使用 | 依赖某些bean,但需要在实例化之前保证这些bean已经实例化,可以用@DependsOn 或 depends-on 属性将这些bean标识为DependsOn依赖。

@Component
@DependsOn("c")  //value指定依赖的bean,String[]形式
class A {

    @Autowired
    private B b;
    
    //...

}
           

bean的懒加载

bean默认都是懒加载的,使用该bean时才进行加载,所以默认流程依次是

  • getBean():BeanFactory的方法,实质是调用doGetBean()
  • doGetBean():依次从单例池(一级缓存)、父容器(父BeanFactory的实例)尝试获取bean的实例,如果未获取到,则调用createBean()创建bean的实例
  • createBean():实质是调用doCreateBean()
  • doCreateBean():创建bean的实例

不是直接 createBean() 创建bean的实例,而是调用getBean(),用到了该bean的实例时才通过createBean()创建实例。

可以使用 lazy-init 属性或 @Lazy 注解设置是否使用懒加载

<!--lazy-init默认true-->
<bean name="" class="" lazy-init="false" />
           
@Component
@Lazy(false)  //value属性指定是否使用懒加载,默认true
class A {

}
           

createBean() 创建bean实例的过程

AbstractAutowireCapableBeanFactory 继承了 AbstractBeanFactory ,提供多个方法的实现,其中包括 createBean() 方法的实现,主要是调用 doCreateBean() 方法。

这2个类都是抽象类,以下3个方法均是 AbstractAutowireCapableBeanFactory 类中的。

createBean()

@Override
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
		throws BeanCreationException {

	if (logger.isTraceEnabled()) {
		logger.trace("Creating instance of bean '" + beanName + "'");
	}

	//解析BeanClass
	
	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);
	}

	//准备方法覆盖(校验BeanDefinition中定义的override方法是否合法)
	// Prepare method overrides.
	try {
		mbdToUse.prepareMethodOverrides();
	}
	catch (BeanDefinitionValidationException ex) {
		throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
				beanName, "Validation of method overrides failed", ex);
	}

	try {
		//给BeanPostProcessor一个返回代理的机会。spring aop即使用此原理实现
			
		// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
		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);
	}

	//调用doCreateBean()创建bean实例
	try {
		Object beanInstance = doCreateBean(beanName, mbdToUse, args);
		if (logger.isTraceEnabled()) {
			logger.trace("Finished creating instance of bean '" + beanName + "'");
		}
		return beanInstance;
	}
	catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
		// A previously detected exception with proper bean creation context already,
		// or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry.
		throw ex;
	}
	catch (Throwable ex) {
		throw new BeanCreationException(
				mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
	}
}


/**
 * 执行所有InstantiationAwareBeanPostProcessor接口的postProcessBeforeInstantiation()方法,
 * 如果某个InstantiationAwareBeanPostProcessor接口返回了代理,则不再执行后续的postProcessBeforeInstantiation()方法,直接执行所有BeanPostProcessor接口的postProcessAfterInitialization()方法。
 * 
 * InstantiationAwareBeanPostProcessor是BeanPostProcessor的一个特殊子接口,用于spring框架内部实现spring aop,
 * 更多信息可以查看后面的BeanPostProcessor介绍
 */
@Nullable
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
	Object bean = null;
	if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
		// Make sure bean class is actually resolved at this point.
		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			Class<?> targetType = determineTargetType(beanName, mbd);
			if (targetType != null) {
				//执行所有InstantiationAwareBeanPostProcessor接口的postProcessBeforeInstantiation()方法
				bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
				//如果某个InstantiationAwareBeanPostProcessor接口返回了不为null的对象(代理)
				if (bean != null) {
					//执行所有BeanPostProcessor接口的postProcessAfterInitialization()方法
					bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
				}
			}
		}
		mbd.beforeInstantiationResolved = (bean != null);
	}
	return bean;
}


@Nullable
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
	for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
		Object result = bp.postProcessBeforeInstantiation(beanClass, beanName);
		if (result != null) {
			return result;
		}
	}
	return null;
}

@Override
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
		throws BeansException {

	Object result = existingBean;
	for (BeanPostProcessor processor : getBeanPostProcessors()) {
		Object current = processor.postProcessAfterInitialization(result, beanName);
		if (current == null) {
			return result;
		}
		result = current;
	}
	return result;
}
           

createBean() 流程图

Spring bean的获取、创建过程,生命周期,循环依赖

doCreateBean()

/**
 * @param beanName the name of the bean
 * @param mbd the merged bean definition for the bean
 * @param args explicit arguments to use for constructor or factory method invocation
 * @return a new instance of the bean
 */
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
		throws BeanCreationException {

	//实例化bean
	// Instantiate the bean.  
	BeanWrapper instanceWrapper = null;
	if (mbd.isSingleton()) {
		instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
	}
	if (instanceWrapper == null) {
		instanceWrapper = createBeanInstance(beanName, mbd, args);
	}
	Object bean = instanceWrapper.getWrappedInstance();
	Class<?> beanType = instanceWrapper.getWrappedClass();
	if (beanType != NullBean.class) {
		mbd.resolvedTargetType = beanType;
	}

	//合并对bean definition的修改
	// Allow post-processors to modify the merged bean definition. 
	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;
		}
	}

	/** 如果允许提前暴露(正在创建的单例 && 允许解决循环依赖),则预加载对应的BeanFactory实例到三级缓存中,以便后续解决循环依赖时使用。
		allowCircularReferences是当前类的一个boolean型的成员字段,是否允许自动解决循环依赖,默认true,可以手动设置 */
		
	// Eagerly cache singletons to be able to resolve circular references
	// even when triggered by lifecycle interfaces like BeanFactoryAware.
	boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
			isSingletonCurrentlyInCreation(beanName));
	if (earlySingletonExposure) {
		if (logger.isTraceEnabled()) {
			logger.trace("Eagerly caching bean '" + beanName +
					"' to allow for resolving potential circular references");
		}
		//把对应的BeanFactory实例添加到三级缓存中
		addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
	}

	// Initialize the bean instance.
	Object exposedObject = bean;
	try {
		//填充属性,注入所需依赖
		populateBean(beanName, mbd, instanceWrapper);
		//初始化
		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<>(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 " +
							"'getBeanNamesForType' with the 'allowEagerInit' flag turned off, for example.");
				}
			}
		}
	}

	/** 注册bean的销毁方法。
		包括DisposableBean接口的destroy()方法、destroy-method属性设置的方法 */
	
	// Register bean as disposable.
	try {
		registerDisposableBeanIfNecessary(beanName, bean, mbd);
	}
	catch (BeanDefinitionValidationException ex) {
		throw new BeanCreationException(
				mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
	}

	return exposedObject;
}
           

populateBean() 填充属性,注入所需依赖

@SuppressWarnings("deprecation")  // for postProcessPropertyValues
protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
	if (bw == null) {
		if (mbd.hasPropertyValues()) {
			throw new BeanCreationException(
					mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
		}
		else {
			// Skip property population phase for null instance.
			return;
		}
	}

	// Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
	// state of the bean before properties are set. This can be used, for example,
	// to support styles of field injection.
	if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
		for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
			if (!bp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
				return;
			}
		}
	}

	PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);

	//根据注入模式选择autowireByName()、autowireByType()进行注入
	int resolvedAutowireMode = mbd.getResolvedAutowireMode();
	if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
		MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
		// Add property values based on autowire by name if applicable.
		if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
			autowireByName(beanName, mbd, bw, newPvs);
		}
		// Add property values based on autowire by type if applicable.
		if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
			autowireByType(beanName, mbd, bw, newPvs);
		}
		pvs = newPvs;
	}

	boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
	boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);

	PropertyDescriptor[] filteredPds = null;
	if (hasInstAwareBpps) {
		if (pvs == null) {
			pvs = mbd.getPropertyValues();
		}
		for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
			PropertyValues pvsToUse = bp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
			if (pvsToUse == null) {
				if (filteredPds == null) {
					filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
				}
				pvsToUse = bp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
				if (pvsToUse == null) {
					return;
				}
			}
			pvs = pvsToUse;
		}
	}
	if (needsDepCheck) {
		if (filteredPds == null) {
			filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
		}
		checkDependencies(beanName, mbd, filteredPds, pvs);
	}

	if (pvs != null) {
		applyPropertyValues(beanName, mbd, bw, pvs);
	}
}


protected void autowireByName(
		String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {

	String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
	for (String propertyName : propertyNames) {
		if (containsBean(propertyName)) {
			//getBean()获取依赖,调用pvs.add()进行注入
			Object bean = getBean(propertyName);
			pvs.add(propertyName, bean);
			registerDependentBean(propertyName, beanName);
			if (logger.isTraceEnabled()) {
				logger.trace("Added autowiring by name from bean name '" + beanName +
						"' via property '" + propertyName + "' to bean named '" + propertyName + "'");
			}
		}
		else {
			if (logger.isTraceEnabled()) {
				logger.trace("Not autowiring property '" + propertyName + "' of bean '" + beanName +
						"' by name: no matching bean found");
			}
		}
	}
}


protected void autowireByType(
		String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {

	TypeConverter converter = getCustomTypeConverter();
	if (converter == null) {
		converter = bw;
	}

	Set<String> autowiredBeanNames = new LinkedHashSet<>(4);
	String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
	for (String propertyName : propertyNames) {
		try {
			PropertyDescriptor pd = bw.getPropertyDescriptor(propertyName);
			// Don't try autowiring by type for type Object: never makes sense,
			// even if it technically is a unsatisfied, non-simple property.
			if (Object.class != pd.getPropertyType()) {
				MethodParameter methodParam = BeanUtils.getWriteMethodParameter(pd);
				// Do not allow eager init for type matching in case of a prioritized post-processor.
				boolean eager = !(bw.getWrappedInstance() instanceof PriorityOrdered);
				DependencyDescriptor desc = new AutowireByTypeDependencyDescriptor(methodParam, eager);
				/** 获取依赖的实例,调用pvs.add()进行注入。		
					当前抽象类implements了AutowireCapableBeanFactory接口,但并未实现获取实例的resolveDependency()方法,当然,此方法的实现中也用到了getBean() */
				Object autowiredArgument = resolveDependency(desc, beanName, autowiredBeanNames, converter);
				if (autowiredArgument != null) {
					pvs.add(propertyName, autowiredArgument);
				}
				for (String autowiredBeanName : autowiredBeanNames) {
					registerDependentBean(autowiredBeanName, beanName);
					if (logger.isTraceEnabled()) {
						logger.trace("Autowiring by type from bean name '" + beanName + "' via property '" +
								propertyName + "' to bean named '" + autowiredBeanName + "'");
					}
				}
				autowiredBeanNames.clear();
			}
		}
		catch (BeansException ex) {
			throw new UnsatisfiedDependencyException(mbd.getResourceDescription(), beanName, propertyName, ex);
		}
	}
}
           

此方法主要是根据注入模式,调用autowireByName()或autowireByType()进行注入,这2个方法注入时也会先通过getBean()方法获取依赖实例。

initializeBean() 初始化

/**
 * Initialize the given bean instance, applying factory callbacks
 * as well as init methods and bean post processors.
 * @see BeanNameAware
 * @see BeanClassLoaderAware
 * @see BeanFactoryAware
 * @see #applyBeanPostProcessorsBeforeInitialization
 * @see #invokeInitMethods
 * @see #applyBeanPostProcessorsAfterInitialization
 */
protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
	//invokeAwareMethods() 处理实现的Aware接口,执行Aware方法
	if (System.getSecurityManager() != null) {
		AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
			invokeAwareMethods(beanName, bean);
			return null;
		}, getAccessControlContext());
	}
	else {
		invokeAwareMethods(beanName, bean);
	}

	//applyBeanPostProcessorsBeforeInitialization() 调用所有BeanPostProcessor接口的postProcessBeforeInitialization()方法
	Object wrappedBean = bean;
	if (mbd == null || !mbd.isSynthetic()) {
		wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
	}

	//invokeInitMethods() 调用初始化方法	
	try {
		invokeInitMethods(beanName, wrappedBean, mbd);
	}
	catch (Throwable ex) {
		throw new BeanCreationException(
				(mbd != null ? mbd.getResourceDescription() : null),
				beanName, "Invocation of init method failed", ex);
	}
	//applyBeanPostProcessorsAfterInitialization() 调用所有BeanPostProcessor接口的postProcessAfterInitialization()方法
	if (mbd == null || !mbd.isSynthetic()) {
		wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
	}

	return wrappedBean;
}


/**
 * 3个Aware接口,依次为:
 * BeanNameAware  setBeanName()  设置beanName
 * BeanClassLoaderAware  setBeanClassLoader()  设置bean的类加载器
 * BeanFactoryAware  setBeanFactory()  设置要使用的工厂实例
 */
private void invokeAwareMethods(String beanName, Object bean) {
	if (bean instanceof Aware) {
		if (bean instanceof BeanNameAware) {
			((BeanNameAware) bean).setBeanName(beanName);
		}
		if (bean instanceof BeanClassLoaderAware) {
			ClassLoader bcl = getBeanClassLoader();
			if (bcl != null) {
				((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
			}
		}
		if (bean instanceof BeanFactoryAware) {
			((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
		}
	}
}


/**
 * 2个初始化方法,依次为:
 * InitializingBean接口的afterPropertiesSet()方法
 * init-method指定的自定义初始化方法
 */
protected void invokeInitMethods(String beanName, Object bean, @Nullable RootBeanDefinition mbd)
		throws Throwable {

	//执行InitializingBean接口的afterPropertiesSet()方法
	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) bean).afterPropertiesSet();
		}
	}

	//执行init-method指定的自定义初始化方法
	if (mbd != null && bean.getClass() != NullBean.class) {
		String initMethodName = mbd.getInitMethodName();
		if (StringUtils.hasLength(initMethodName) &&
				!(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
				!mbd.isExternallyManagedInitMethod(initMethodName)) {
			invokeCustomInitMethod(beanName, bean, mbd);
		}
	}
}
           

doCreateBean() 整体流程图

Spring bean的获取、创建过程,生命周期,循环依赖

核心流程有3步

  • 创建实例
  • 填充属性、注入依赖
  • 初始化

实例化可以看做在堆上创建对象、分配内存空间,成员字段的值还是默认初始值;填充属性是给成员字段设置值。

getBean() 获取bean实例过程中,会用到 createBean() 创建实例;

createBean() 创建实例,populateBean()填充属性、注入依赖时,也会调用getBean()获取所需依赖。

DI:其实就是在createBean创建bean实例,填充属性、注入依赖时,使用getBean获取所需依赖,注入到bean实例中。

循环依赖

循环依赖的概念

circular reference,循环引用 | 依赖

bean之间彼此依赖,依赖关系环形闭环
@Component
class A {

    @Autowired
    private B b;

}


@Component
class B {

    @Autowired
    private A a;

}
           
//bean依赖自身也属于循环依赖

@Component
class A {

    @Autowired
    private A a;

}
           

循环依赖问题触发的时机

bean实例化之后,populateBean()填充属性时。

spring解决循环依赖的原理图

A、B构成循环依赖,getBean(beanA)获取beanA实例的过程如下(图中只列关键步骤)

Spring bean的获取、创建过程,生命周期,循环依赖

完成后beanA、beanB的实例均已在一级缓存中,后续可以从一级缓存中直接获取。

spring解决循环依赖的原理

核心思想:提前曝光已实例化、但尚未完成属性填充(创建)的实例,填充属性期间可被其它实例引用(作为依赖注入)。

实例化bean后,会把当前bean对应的工厂实例预先加载到三级缓存中;注入依赖、创建所需依赖的实例时,可以从三级缓存获取到当前bean对应的工厂实例,通过工厂实例可以获取到之前创建的当前bean的实例(已实例化但尚未填充属性),从而完成依赖本身的属性注入、初始化。

spring可以解决哪些种类的循环依赖问题

  • 单例模式会缓存创建的bean实例,原型模式每次都是创建新的实例,不会缓存创建的bean实例。三级缓存是在getSingleton()获取单例中使用的,只能解决单例的循环依赖问题。
  • 均采用setter方法注入,或者一方使用构造方法注入、另一方使用setter方法注入的循环依赖都可以被spring解决。(不能解决全采用构造方法注入的循环依赖)

三级缓存各自的存入时机

  • 放入三级缓存的时机:bean实例化之后、填充属性之前,会把对应的BeanFactory实例放到三级缓存中
  • 放入二级缓存的时机:从三级缓存中获取实例时,如果一二级缓存没有对应的bean实例,但三级缓存有对应的工厂实例,则通过工厂实例的getObject()方法获取bean实例,放到二级缓存中,并移除三级缓存中对应的工厂实例
  • 放入一级缓存的时机:实例创建完成(完全体)后会被放到一级缓存中,并会移除二三级缓存中对应的实例

当spring容器被销毁时,会销毁一级缓存中的单例实例。

可以不要第二级缓存吗

二级缓存 earlySingletonObjects,early有2个含义

  • adj. 早期的:早期的单例,已实例化但尚未填充属性、初始化,还不是完全体的单例,不能正常使用,但可以被引用。
  • adv. 提前:本来要成为完全体的单例才暴露出来,二级缓存把已实例化的bean提前暴露出来,让其它bean可以引用。

解决循环依赖主要靠第二级缓存提前暴露早期实例,让其它实例可以引用,第二级缓存才是关键,不能没有。

可以不要第三级缓存吗 | 只使用两级缓存行吗

只使用一二级缓存时

getBean(beanA) -> 实例化beanA ,放到二级缓存中 ->

填充beanA的属性,getBean(beanB) -> 实例化beanB,放到二级缓存中 ->

填充beanB的属性,getBean(beanA) -> 在二级缓存中获取到beanA,完成注入 -> beanB创建完成,放到一级缓存中 ->

beanA创建完成,放到一级缓存中

显然,只用一二级缓存也可以解决循环依赖问题。

看上面的spring解决循环依赖的原理图,本来在beanA实例化后就可以获取到引用,把beanA放到二级缓存中;硬是拖了半个流程,在beanB实例化后注入依赖,getBean(beanA)时,才从三级缓存中获取beanA的工厂实例,通过工厂获取beanA实例,把beanA实例放到二级缓存中。

为什么要拖那么久,等beanB填充属性、注入beanA时才获取beanA的实例放到二级缓存中?因为之前不确定需要的是beanA本身,还是beanA的代理,在beanB实际使用beanA(填充属性)时才能确定

@Component
class A {

    @Autowired
    private B b;

}
           

使用aop对部分bean中的beanB进行增强,自然要等到创建bean、填充属性要注入beanB时,才能校验当前bean是不是当前要注入的依赖(beanB)的目标类(切入点),是就注入beanB的代理,否则注入beanB本身。

工厂实例获取bean实例的getObject()方法其实就是:判断当前bean需要的是依赖本身的实例,还是依赖的代理(依赖的代理也属于依赖的实例),需要依赖本身就直接返回已创建好的依赖实例,需要代理就在已创建的依赖实例的基础上进行包装,返回代理。

总结

第三级缓存的作用是延缓早期实例的暴露时机,把早期实例的暴露时机从实例化后,推迟到依赖本身的填充属性、依赖注入时,以便应用spring aop、确定依赖本身是否要注入代理。

如果依赖注入时都没有使用代理(aop),只使用一二级缓存也可以解决循环依赖问题。

bean的生命周期

bean的生命周期

一般认为bean的生命周期即实例的生命周期,主要逻辑在doCreateBean()方法中,createBean()中解析BeanClass、准备方法覆盖之类的操作不算在bean的生命周期中。

Spring bean的获取、创建过程,生命周期,循环依赖
  1. 实例化
  2. 填充属性,注入依赖
  3. 如果bean实现了BeanNameAware接口,则调用setBeanName()方法设置beanName
  4. 如果bean实现了BeanClassLoaderAware接口,则调用setBeanClassLoader()方法设置bean的类加载器
  5. 如果bean实现了BeanFactoryAware接口,则调用setBeanFactory()方法 设置要使用的BeanFactory实例
  6. 如果bean实现了ApplicationContextAware接口,则调用setApplicationContext()方法设置应用上下文
  7. 如果bean实现了BeanPostProcessor接口,则调用applyBeanPostProcessorsBeforeInitialization() 做初始化的前处理
  8. 如果bean实现了InitializingBean接口,则调用afterPropertiesSet()方法进行初始化
  9. 如果使用了init-method指定的自定义初始化方法,则调用init-method指定的自定义初始化方法
  10. 如果bean实现了BeanPostProcessor接口,则调用postProcessAfterInitialization() 做初始化的后处理

至此,实例创建完成,单例模式放到一级缓存中,由spring容器管理,原型模式交给调用者

  • 单例bean的生命周期和spring容器的生命周期保持一致,在spring容器初始化时就创建实例,放到spring容器中,由spring容器负责管理,spring容器运行期间一直存活,在spring容器卸载时销毁实例。
  • 原型模式的bean在需要时才创建实例,每次都是创建新的实例,由spring容器创建实例,创建后交给使用方(getBean()的调用者),在没有任何对象引用时成为垃圾等待gc回收。
  1. 如果bean实现了DisposableBean接口,销毁时会调用destroy()方法
  2. 如果使用了destroy-method属性指定销毁方法,还会调用destroy-method指定的方法

bean生命周期中的常见单词

  • post:在…之后
  • process:处理、加工
  • processor:处理器、处理程序、加工者
  • BeanPostProcessor:bean后置处理器,对bean进行加工处理
  • aware:意识到的、感知到的、知道的

bean的初始化、销毁方法

  • 初始化方法:可以实现InitializingBean接口,在afterPropertiesSet()方法中写实现,也可以用 init-method 属性指定。
  • 销毁方法:常用于释放 bean 所持有的资源,可以实现DisposableBean接口,在destroy()方法中写实现,也可以用 destroy-method 属性指定。

@PostConstruct、@PreDestroy

  • @PostConstruct:在构造方法之后执行,常用于初始化操作
  • @PreDestroy :在对象销毁之前执行,常用于释放对象持有的资源
@Component
public class Xxx {

    @PostConstruct
    public void postConstruct() {
        //...
    }

    @PreDestroy
    public void PreDestroy() {
        //...
    }

}
           

jdk自带的类可分为2类

  • 核心类库:以java开头,比如 io、date
  • 扩展类库:以javax开头,比如 servlet、swing

这2个注解作用看起来和 init-method、 destroy-method 差不多,但都是 javax 中的注解,不是 spring 的注解,一般不算在 bean 的生命周期中。

bean的后置处理器BeanPostProcessor

bean的后置处理器BeanPostProcessor用于在初始化阶段对bean进行加工。

经过创建实例、填充属性2个阶段,bean已经创建得差不多了,初始化阶段用于对bean进行进一步的加工修饰,xml配置bean的方式(init-method)很少用了,开发主要通过实现BeanPostProcessor接口来对bean做加工处理。

BeanPostProcessor接口有2个默认方法

  • postProcessBeforeInitialization():在bean的初始化方法之前执行
  • postProcessAfterInitialization():在bean的初始化方法之后执行

形参都为实例本身、beanName,可根据beanName进行筛选;返回值是加工后的实例;默认实现是不做处理、直接返回实例。

bean可以实现多个BeanPostProcessor接口,实现多个BeanPostProcessor接口时往往还需要实现Ordered接口,通过Ordered接口指定多个BeanPostProcessor的执行顺序。

@Component
public class Xxx implements BeanPostProcessor, Ordered {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        //...
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        //...
        return bean;
    }

    @Override
    public int getOrder() {
        return 0;
    }

}
           

InstantiationAwareBeanPostProcessor

InstantiationAwareBeanPostProcessor是BeanPostProcessor的子接口,没有重写BeanPostProcessor的2个默认方法,只是增加了4个默认方法,其中需要postProcessBeforeInstantiation()方法

@Nullable
default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
	return null;
}
           

在createBean()中,会先给BeanPostProcessor一个返回代理的机会:执行所有InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation()方法

  • 如果某个postProcessBeforeInstantiation()方法返回不为null,则不再执行后续的postProcessBeforeInstantiation()方法,直接执行所有BeanPostProcessor接口的postProcessAfterInitialization()方法,将返回的对象作为代理直接返回,不再调用doCreateBean()创建新的实例
  • 否则调用doCreateBean()创建新的实例

InstantiationAwareBeanPostProcessor是一个特殊的BeanPostProcessor接口,主要在spring框架内部使用,用于spring框架本身实现代理(spring aop)。

spring官方说 InstantiationAwareBeanPostProcessor 是面向spring框架本身|内部的,不推荐开发者使用,尽量用BeanPostProcessor代替。

BeanFactoryPostProcessor

BeanFactoryPostProcessor、BeanPostProcessor都是后置处理器(PostProcessor),用于加工处理,容易混淆,区别如下

  • 加工对象不同:BeanFactoryPostProcessor用于对BeanFactory进行加工处理,BeanPostProcessor用于对Bean进行加工处理
  • 作用时机不同:BeanFactoryPostProcessor作用于spring容器加载bean定义之后、bean实例化之前,BeanPostProcessor作用于bean初始化阶段。