SpringBoot 源码解析7:Bean的创建② AbstractAutowireCapableBeanFactory#createBean

源码深度解析Spring Bean的创建,手把手的一步一步带你看源码 此处方法设置得十分巧妙, 巧妙之处是Spring将一部分的方法匹配工作在这里完成, 如果当前类职工的方法只有一个的时候就设置重载方法没有被重载,这样在后续被调用的时候就可以直接使用功能此方法,从而不需要进行方法的参数匹配验证,还可以提前对方法存在性进行验证.然后: 解析构造函数并进行构造函数的实例化.因为一个bean对应的类中可能会有多个构造函数,而每个构造函数的参数不同,Spring 在根据参数及类型去判断最终会使用哪个构造函数进行实例化. 阅读详情

1.概述

Spring通过createBean方法创建Bean,在createBean的整体流程中,回调了很多后置处理器,而这些处理器是在refresh方法中就已经被注册。

2. 单例Bean的创建

AbstractBeanFactory#doGetBean

// Create bean instance.
if (mbd.isSingleton()) {
	sharedInstance = getSingleton(beanName, () -> {
		try {
			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 = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}
  1. Spring创建单例bean,getSingleton方法第二个函数式接口ObjectFactory。
  2. getObjectForBeanInstance方法从以FactoryBean的方式获取bean。

2.1 DefaultSingletonBeanRegistry#getSingleton

public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
	Assert.notNull(beanName, "Bean name 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 + "'");
			}
			beforeSingletonCreation(beanName);
			boolean newSingleton = false;
			boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
			if (recordSuppressedExceptions) {
				this.suppressedExceptions = new LinkedHashSet<>();
			}
			try {
				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);
			}
			if (newSingleton) {
				addSingleton(beanName, singletonObject);
			}
		}
		return singletonObject;
	}
}

getSingleton方法优先从一级缓存中获取,如果缓存中没有bean,那么就回调ObjectFactory,也就是回调createBean方法创建bean,最终通过addSingleton放入到缓存中。

3. createBean源码

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

	if (logger.isTraceEnabled()) {
		logger.trace("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.
	// 解析Bean的类型
	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 {
		// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
		// 允许BeanPostProcessor返回一个代理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);
	}

	try {
		// 真正创建bean的方法
		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);
	}
}
  1. resolveBeanClass:解析bean的类型,放入到beanDefinition中。AbstractBeanDefinition#beanClass属性类型是Object类型,beanClass存放形式有两种,一种是bean的class对象,还有一种的类的全限定名。如果是@Configuration和@Bean定义的对象,是没有beanClass信息的,只会有factoryBeanName和factoryMethod。
  2. resolveBeforeInstantiation:判断bean是否需要被代理,如果被代理,返回的是代理对象。代理的具体实现在AbstractAutoProxyCreator#postProcessBeforeInstantiation。
  3. 真正创建bean的方法是doCreateBean。

4. AbstractAutowireCapableBeanFactory#doCreateBean 源码

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

	// Instantiate the bean.
	BeanWrapper instanceWrapper = null;
	if (mbd.isSingleton()) {
		// 从缓存中获取FactoryBean实例
		instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
	}
	if (instanceWrapper == null) {
		//如果不是FactoryBean,那么就创建实例
		instanceWrapper = createBeanInstance(beanName, mbd, args);
	}
	final Object bean = instanceWrapper.getWrappedInstance();
	Class<?> beanType = instanceWrapper.getWrappedClass();
	if (beanType != NullBean.class) {
		mbd.resolvedTargetType = beanType;
	}

	// Allow post-processors to modify the merged bean definition.
	synchronized (mbd.postProcessingLock) {
		if (!mbd.postProcessed) {
			try {
				//这里回调了CommonAnnotationBeanPostProcessor#postProcessMergedBeanDefinition
				//和AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition
				//对bean的声明周期进行解析,和要被注入的属性和方法进行解析
				applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
			}
			catch (Throwable ex) {
				throw new BeanCreationException(mbd.getResourceDescription(), beanName,
						"Post-processing of merged bean definition failed", ex);
			}
			mbd.postProcessed = 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");
		}
		// 如果允许提前暴露,那么就添加到三级缓存中
		addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
	}

	// Initialize the bean instance.
	Object exposedObject = bean;
	try {
		// 对bean的属性进行注入
		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 " +
							"'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
				}
			}
		}
	}

	// Register bean as disposable.
	try {
		registerDisposableBeanIfNecessary(beanName, bean, mbd);
	}
	catch (BeanDefinitionValidationException ex) {
		throw new BeanCreationException(
				mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
	}

	return exposedObject;
}
  1. 先从factoryBeanInstanceCache判断是否有对应的FactoryBean,如果没有,就创建Bean实例;如果有对应的FactoryBean,那么就回调FactoryBean#getObject。
  2. applyMergedBeanDefinitionPostProcessors方法:回调AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition对@Autowired、@Value和@Inject注解进行了解析,将要注入的字段和方法缓存到injectionMetadataCache中。不同的是CommonAnnotationBeanPostProcessor#postProcessMergedBeanDefinition对@Resource注解解析,而且CommonAnnotationBeanPostProcessor继承了InitDestroyAnnotationBeanPostProcessor,对bean的生命周期进行了解析。
    SpringBoot扩展篇:Spring注入 @Autowired & @Resource
@SuppressWarnings("unchecked")
public AutowiredAnnotationBeanPostProcessor() {
	this.autowiredAnnotationTypes.add(Autowired.class);
	this.autowiredAnnotationTypes.add(Value.class);
	try {
		this.autowiredAnnotationTypes.add((Class<? extends Annotation>)
				ClassUtils.forName("javax.inject.Inject", AutowiredAnnotationBeanPostProcessor.class.getClassLoader()));
		logger.trace("JSR-330 'javax.inject.Inject' annotation found and supported for autowiring");
	}
	catch (ClassNotFoundException ex) {
		// JSR-330 API not available - simply skip.
	}
}
  1. addSingletonFactory:如果允许提前暴露,那么就放入到三级缓存。
protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
	Object exposedObject = bean;
	if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
		for (BeanPostProcessor bp : getBeanPostProcessors()) {
			if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
				SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
				exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
			}
		}
	}
	return exposedObject;
}

从三级缓存中获取bean的时候,会回调getEarlyBeanReference -> AbstractAutoProxyCreator#getEarlyBeanReference从代理缓存中获取实例。

  1. populateBean:初始化bean的属性。具体回调了AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor对属性进行注入。
    SpringBoot扩展篇:Spring注入 @Autowired & @Resource
  2. initializeBean:回调初始化方法。

5 实例化Bean - AbstractAutowireCapableBeanFactory#createBeanInstance

protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
	// Make sure bean class is actually resolved at this point.
	// 解析bean的类型,实际上就是对AbstractBeanDefinition#beanClass进行了解析
	Class<?> beanClass = resolveBeanClass(mbd, beanName);

	if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
		throw new BeanCreationException(mbd.getResourceDescription(), beanName,
				"Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
	}
	// Spring支持自定义的Supplier接口返回对象
	Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
	if (instanceSupplier != null) {
		return obtainFromSupplier(instanceSupplier, beanName);
	}

	// @Configuration和@Bean注解类型的Bean实例化流程
	if (mbd.getFactoryMethodName() != null) {
		return instantiateUsingFactoryMethod(beanName, mbd, args);
	}

	// Shortcut when re-creating the same bean...
	boolean resolved = false;
	boolean autowireNecessary = false;
	if (args == null) {
		synchronized (mbd.constructorArgumentLock) {
			if (mbd.resolvedConstructorOrFactoryMethod != null) {
				resolved = true;
				autowireNecessary = mbd.constructorArgumentsResolved;
			}
		}
	}
	if (resolved) {
		if (autowireNecessary) {
			return autowireConstructor(beanName, mbd, null, null);
		}
		else {
			return instantiateBean(beanName, mbd);
		}
	}

	// Candidate constructors for autowiring?
	// 推断构造器
	Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
	if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
			mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
		return autowireConstructor(beanName, mbd, ctors, args);
	}

	// Preferred constructors for default construction?
	// By构造器注入
	ctors = mbd.getPreferredConstructors();
	if (ctors != null) {
		return autowireConstructor(beanName, mbd, ctors, null);
	}

	// No special handling: simply use no-arg constructor.
	// 只有无参构造器,实例化bean的流程
	return instantiateBean(beanName, mbd);
}
  1. resolveBeanClass:解析bean的类型,实际上就是对AbstractBeanDefinition#beanClass进行了解析。之前也说过,beanClass属性是object类型的,可能是类的全限定名,这里就是通过classLoader获取到真正beanClass。
  2. obtainFromSupplier:Spring允许用户在BeanDefinition中定义Supplier,返回想要的对象。
  3. instantiateUsingFactoryMethod:@Configuration和@Bean的实例化流程。 @Configuration源码解析
  4. determineConstructorsFromBeanPostProcessors:对构造器注入的支持,回调SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors选取合适的构造器,具体逻辑在AutowiredAnnotationBeanPostProcessor中实现。
  5. 如果有合适的构造器,那么就By构造器注入。instantiateBean真正实例化普通的bean。

6 推断构造器

@Override
@Nullable
public Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, final String beanName)
		throws BeanCreationException {

	// Let's check for lookup methods here...
	if (!this.lookupMethodsChecked.contains(beanName)) {
		if (AnnotationUtils.isCandidateClass(beanClass, Lookup.class)) {
			try {
				Class<?> targetClass = beanClass;
				do {
					ReflectionUtils.doWithLocalMethods(targetClass, method -> {
						Lookup lookup = method.getAnnotation(Lookup.class);
						if (lookup != null) {
							Assert.state(this.beanFactory != null, "No BeanFactory available");
							LookupOverride override = new LookupOverride(method, lookup.value());
							try {
								RootBeanDefinition mbd = (RootBeanDefinition)
										this.beanFactory.getMergedBeanDefinition(beanName);
								mbd.getMethodOverrides().addOverride(override);
							}
							catch (NoSuchBeanDefinitionException ex) {
								throw new BeanCreationException(beanName,
										"Cannot apply @Lookup to beans without corresponding bean definition");
							}
						}
					});
					targetClass = targetClass.getSuperclass();
				}
				while (targetClass != null && targetClass != Object.class);

			}
			catch (IllegalStateException ex) {
				throw new BeanCreationException(beanName, "Lookup method resolution failed", ex);
			}
		}
		this.lookupMethodsChecked.add(beanName);
	}

	// Quick check on the concurrent map first, with minimal locking.
	// 这里做了一个缓存
	Constructor<?>[] candidateConstructors = this.candidateConstructorsCache.get(beanClass);
	if (candidateConstructors == null) {
		// Fully synchronized resolution now...
		synchronized (this.candidateConstructorsCache) {
			candidateConstructors = this.candidateConstructorsCache.get(beanClass);
			if (candidateConstructors == null) {
				Constructor<?>[] rawCandidates;
				try {
					rawCandidates = beanClass.getDeclaredConstructors();
				}
				catch (Throwable ex) {
					throw new BeanCreationException(beanName,
							"Resolution of declared constructors on bean Class [" + beanClass.getName() +
							"] from ClassLoader [" + beanClass.getClassLoader() + "] failed", ex);
				}
				List<Constructor<?>> candidates = new ArrayList<>(rawCandidates.length);
				// 存放的是有指定注入的构造器,即有Autowired、Value、Inject注解并且required属性为true的构造器
				Constructor<?> requiredConstructor = null;
				// 存放的是无参构造器
				Constructor<?> defaultConstructor = null;
				//对Kotlin支持,作者没怎么研究Kotlin,默认为null
				Constructor<?> primaryConstructor = BeanUtils.findPrimaryConstructor(beanClass);
				int nonSyntheticConstructors = 0;
				for (Constructor<?> candidate : rawCandidates) {
					if (!candidate.isSynthetic()) {
						nonSyntheticConstructors++;
					}
					else if (primaryConstructor != null) {
						continue;
					}
					// 查询当前构造器是否有'注入注解', 即:Autowired、Value、Inject注解
					MergedAnnotation<?> ann = findAutowiredAnnotation(candidate);
					if (ann == null) {
						// 为了防止当前的class是一个代理的class,如果当前类为代理类,那么就解析非代理类
						Class<?> userClass = ClassUtils.getUserClass(beanClass);
						if (userClass != beanClass) {
							try {
								Constructor<?> superCtor =
										userClass.getDeclaredConstructor(candidate.getParameterTypes());
								// 获取非代理类上面的@Autowired注解
								ann = findAutowiredAnnotation(superCtor);
							}
							catch (NoSuchMethodException ex) {
								// Simply proceed, no equivalent superclass constructor found...
							}
						}
					}
					if (ann != null) {
						// 如果有多个注入注解标注的构造器,就抛出异常
						if (requiredConstructor != null) {
							throw new BeanCreationException(beanName,
									"Invalid autowire-marked constructor: " + candidate +
									". Found constructor with 'required' Autowired annotation already: " +
									requiredConstructor);
						}
						// 用户直接了注入的注解,则判断required属性是否为true,那么当前构造器就是用户所需的
						boolean required = determineRequiredStatus(ann);
						if (required) {
							if (!candidates.isEmpty()) {
								throw new BeanCreationException(beanName,
										"Invalid autowire-marked constructors: " + candidates +
										". Found constructor with 'required' Autowired annotation: " +
										candidate);
							}
							// 存放了required属性为true的构造器
							requiredConstructor = candidate;
						}
						candidates.add(candidate);
					}
					else if (candidate.getParameterCount() == 0) {
						// 无参构造器
						defaultConstructor = candidate;
					}
				}
				if (!candidates.isEmpty()) {
					// Add default constructor to list of optional constructors, as fallback.
					if (requiredConstructor == null) {
						if (defaultConstructor != null) {
							// 如果有候选的构造器,才会返回无参的构造器
							candidates.add(defaultConstructor);
						}
						else if (candidates.size() == 1 && logger.isInfoEnabled()) {
							logger.info("Inconsistent constructor declaration on bean with name '" + beanName +
									"': single autowire-marked constructor flagged as optional - " +
									"this constructor is effectively required since there is no " +
									"default constructor to fall back to: " + candidates.get(0));
						}
					}
					// 1.优先使用候选的构造器
					candidateConstructors = candidates.toArray(new Constructor<?>[0]);
				}
				else if (rawCandidates.length == 1 && rawCandidates[0].getParameterCount() > 0) {
					// 2.只有一个并且是有参构造器
					candidateConstructors = new Constructor<?>[] {rawCandidates[0]};
				}
				// 下面就不理解了
				else if (nonSyntheticConstructors == 2 && primaryConstructor != null &&
						defaultConstructor != null && !primaryConstructor.equals(defaultConstructor)) {
					// 3.如果有primaryConstructor,选择无参构造 
					candidateConstructors = new Constructor<?>[] {primaryConstructor, defaultConstructor};
				}
				else if (nonSyntheticConstructors == 1 && primaryConstructor != null) {
					candidateConstructors = new Constructor<?>[] {primaryConstructor};
				}
				else {
					candidateConstructors = new Constructor<?>[0];
				}
				this.candidateConstructorsCache.put(beanClass, candidateConstructors);
			}
		}
	}
	return (candidateConstructors.length > 0 ? candidateConstructors : null);
}
  1. 构造器注入的注解:Autowired、Value、Inject,但是@Value注解没有required注解。

private final Set<Class<? extends Annotation>> autowiredAnnotationTypes = new LinkedHashSet<>(4);

private String requiredParameterName = "required";

@Deprecated
protected boolean determineRequiredStatus(AnnotationAttributes ann) {
	return (!ann.containsKey(this.requiredParameterName) ||
			this.requiredParameterValue == ann.getBoolean(this.requiredParameterName));
}

@SuppressWarnings("unchecked")
public AutowiredAnnotationBeanPostProcessor() {
	this.autowiredAnnotationTypes.add(Autowired.class);
	this.autowiredAnnotationTypes.add(Value.class);
	try {
		this.autowiredAnnotationTypes.add((Class<? extends Annotation>)
				ClassUtils.forName("javax.inject.Inject", AutowiredAnnotationBeanPostProcessor.class.getClassLoader()));
		logger.trace("JSR-330 'javax.inject.Inject' annotation found and supported for autowiring");
	}
	catch (ClassNotFoundException ex) {
		// JSR-330 API not available - simply skip.
	}
}

@Nullable
private MergedAnnotation<?> findAutowiredAnnotation(AccessibleObject ao) {
	MergedAnnotations annotations = MergedAnnotations.from(ao);
	for (Class<? extends Annotation> type : this.autowiredAnnotationTypes) {
		MergedAnnotation<?> annotation = annotations.get(type);
		if (annotation.isPresent()) {
			return annotation;
		}
	}
	return null;
}
  1. 构造器选择优先级:不允许有多个构造器有注入注解,否则会抛出BeanCreationException;选择有注入注解标注的,并且required属性为true的构造器;如果只有一个构造器,并且是有参的,那么就选择有参的构造器。

7. instantiateBean 实例化Bean

protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {
	try {
		Object beanInstance;
		final BeanFactory parent = this;
		if (System.getSecurityManager() != null) {
			beanInstance = AccessController.doPrivileged((PrivilegedAction<Object>) () ->
					getInstantiationStrategy().instantiate(mbd, beanName, parent),
					getAccessControlContext());
		}
		else {
			beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
		}
		BeanWrapper bw = new BeanWrapperImpl(beanInstance);
		initBeanWrapper(bw);
		return bw;
	}
	catch (Throwable ex) {
		throw new BeanCreationException(
				mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex);
	}
}
  1. 通过策略模式实例化bean,最终封装在BeanWrapper。
  2. 默认的实例化策略是CglibSubclassingInstantiationStrategy,如果是非代理类,则直接获取无参构造器实例化;如果是代理的类,则生成了代理类并且实例化,创建代理拦截器。

8. AbstractAutowireCapableBeanFactory#initializeBean 初始化bean

protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
	if (System.getSecurityManager() != null) {
		AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
			invokeAwareMethods(beanName, bean);
			return null;
		}, getAccessControlContext());
	}
	else {
		invokeAwareMethods(beanName, bean);
	}

	Object wrappedBean = bean;
	if (mbd == null || !mbd.isSynthetic()) {
		wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
	}

	try {
		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()) {
		wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
	}

	return wrappedBean;
}
  1. invokeAwareMethods:回调了一些BeanNameAware、BeanClassLoaderAware、BeanFactoryAware。
  2. applyBeanPostProcessorsBeforeInitialization中回调一些重要的处理器:
    DestructionAwareBeanPostProcessor:对bean的生命周期函数的回调。
    ApplicationContextAwareProcessor:对Aware接口的回调。
// ApplicationContextAwareProcessor
private void invokeAwareInterfaces(Object bean) {
	if (bean instanceof EnvironmentAware) {
		((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
	}
	if (bean instanceof EmbeddedValueResolverAware) {
		((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
	}
	if (bean instanceof ResourceLoaderAware) {
		((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
	}
	if (bean instanceof ApplicationEventPublisherAware) {
		((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
	}
	if (bean instanceof MessageSourceAware) {
		((MessageSourceAware) bean).setMessageSource(this.applicationContext);
	}
	if (bean instanceof ApplicationContextAware) {
		((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
	}
}
  1. invokeInitMethods:回调了InitializingBean#afterPropertiesSet以及AbstractBeanDefinition#initMethodName方法,initMethodName可在@Bean中定义。
  2. applyBeanPostProcessorsAfterInitialization:代理对象的支持、Schedule注解的支持等等都是在这里完成的。
【Spring-5.1】AbstractAutowireCapableBeanFactory#createBeanInstance实例化对象 AbstractBeanFactory.getBean(String name): getBean(String name) public Object getBean(String name) throws BeansException { return doGetBean(name, null, null, false); } doGetBean()方法有两个功能,如果之前创建了对象,就直接取;要是没有创建会先创建。doGetBean大体也是分为三大块,if-else,还有个其他的,先看if逻 阅读详情

相关推荐

给STM32 LWIP做一次‘性能体检’:手把手教你用Wireshark和iperf诊断网络瓶颈

本文详细介绍了如何使用Wireshark和iperf工具对STM32 LWIP网络性能进行全面诊断,帮助开发者精准定位网络瓶颈问题。通过搭建测试环境、集成iperf测试框架、深度报文分析和LWIP配置优化,实现从9KB/s到80MB/s的性能飞跃,特别适用于解决TCP发送速率和卡死问题。

weixin_29631169的博客 288

Spring源码解读(五)Bean创建过程之创建——AbstractAutowireCapableBeanFactory

前言 上文 Spring源码解读(四)Bean...

lishuzhen5678的博客 1164

python数据处理(一)——如何用python实现excel功能

python如何实现excel的数据提取、指标构建,进行透视分析。

一名数据分析师 2702

spring的AbstractAutowireCapableBeanFactory的doCreateBean的大致流程

整体大致流程是: 1.new出对象 2.解析@Autowired@Resource@PostConstuct注解 3.设置属性 4.执行BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口实现方法 5.执行BeanPostProcessor的postProcessBeforeInitialization方法(执行@PostConstruct标注...

qq_40272613的博客 827

逻辑漏洞:水平越权、垂直越权靶场练习

水平越权和垂直越权是组织中常见的管理问题,指的是员工在组织中所拥有的权力和责任超出其职位所应具备的范围。 水平越权是指员工在同一级别的职位上超越了其同事的权力和责任范围,通常表现为某个员工在团队中承担了过多的任务或权力,导致其他同事感到不公平或不满。 垂直越权则是指员工在组织中超越了其职位等级的权力和责任范围,通常表现为员工在没有得到上级批准的情况下做出决策或行动,可能会导致组织内部的混乱和冲突。

qq_68163788的博客 2469

嵌入式系统启动流程解析:ROM Code、Bootloader与启动代码的协同工作

本文深入解析嵌入式系统从通电到运行的完整启动流程,详细阐述了ROM Code、Bootloader与启动代码三者如何像接力赛般协同工作。ROM Code作为芯片固化的初始引导程序,负责硬件自检并加载Bootloader;Bootloader作为系统总指挥,初始化关键硬件并加载操作系统内核;启动代码则为C语言运行环境铺平道路。理解这三者的分工与协作,是进行系统移植和解决启动问题的关键。

dd012的博客 553

【源码】Spring —— BeanFactory 解读 3 AbstractAutowireCapableBeanFactory

【源码】Spring —— BeanFactory 解读 3 AbstractAutowireCapableBeanFactory前言 前言 上一章节,我们对 AbstractBeanFactory 抽象类进行了解读,这一章节对其子类 AbstractAutowireCapableBeanFactory 进行解读

小水牛的博客 752

Ubuntu Server 22.04.5系统安装教程

该教程主要是演示在服务器上安装Ubuntu server 22.04系统的详细步骤,主要包含,安装系统前的准备(镜像的下载,启动盘的制作),安装系统时的语言选择,网络设置,切换镜像源(可根据实际需求来配置,本文使用清华镜像源),手动分区,用户设置,ssh服务安装等。以上就是关于Ubuntu Server 22.04系统安装的详细过程。

逆水行舟,不进则退。 7759

spring Bean生命周期 源代码分析 AbstractAutowireCapableBeanFactory createBean doCreateBean

spring Bean生命周期 源代码分析 AbstractAutowireCapableBeanFactory createBean doCreateBean (1)设置bean的BeanName、BeanClassLoader、BeanFactory; 方法是invokeAwareMethods (2)初始化前置处理, 方法是applyBeanPostProcessorsBeforeInitialization (3)具体初始化, 方法是invokeInitMethods; 判断是否自定义初

预立数据科技 1335

SAP ABAP CO核心扩展-ZCKMLQS 多物料工厂的评估数量结构报表(CKMLQS)

CKMLQS 只能查看单一物料工厂的评估数量结构,SAP 没有提供多物料工厂的评估数量结构报表。这篇文章将实现 CO核心扩展-ZCKMLQS 多物料工厂的评估数量结构报表。

SAP李斌,本人承诺所有原创文章均不使用任何AI生成技术,请大家放心阅读。 1089

在WSL2中配置代理(Windows)

通过按照上述步骤在WSL2中配置代理,我们可以轻松地在Windows子系统Linux中使用代理服务器访问互联网。请确保提供正确的代理服务器地址和端口号,并根据实际情况进行修改。在WSL2中使用代理是一个常见的需求,它允许我们在Windows子系统Linux中通过代理服务器访问互联网。本文将详细介绍如何在WSL2中配置代理,并提供相应的源代码示例。如果返回的IP地址与代理服务器所在地不同,说明代理正常工作。希望本文能对你有所帮助!如有其他问题,请随时向我提问。替换为实际的代理服务器地址和端口号。

FcUnity的博客 4355

【七】Spring源码分析之实例化Bean----AbstractAutowireCapableBeanFactory的createBean方法

一、简介 所有 Bean 实例的创建都会委托给该方法实现。 该方法其实只是做一些检查和验证工作,真正的初始化工作是由doCreateBean()实现 二、源码分析 AbstractAutowireCapableBeanFactory类的createBean方法 源码: protected Object createBean(String beanName, RootBeanDefin...

Sid小杰的博客 2012

芒果YOLO11改进106:检测头篇DynamicHead动态检测头:基于DynamicHead,二次原创提出SATNeXt模块,提出全新的动态DynamicSatDetect

检测头篇DynamicHead动态检测头:基于DynamicHead,二次原创提出SATNeXt模块,提出全新的动态DynamicSatDetect

包括YOLOv5、YOLOv7、YOLOv8等模型改进 772

Spring Bean详解,springboot源码深度解析

我还为大家准备了一套体系化的架构师学习资料包以及BAT面试资料,供大家参考及学习已经将知识体系整理好(源码,笔记,PPT,学习视频)体系整理好(源码,笔记,PPT,学习视频)[外链图片转存中…(img-21QNlKUN-1711720065644)][外链图片转存中…(img-hRO1tDn6-1711720065645)][外链图片转存中…(img-FAASLv6P-1711720065645)]

2301_76190858的博客 726

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

4.1.3.1.1Spring源码解析——doCreateBean方法之autowireConstructor

 签名已经解析了doCreateBean方法,可以点这里传送doCreateBean方法分析  autowireConstructor方法在AbstractAutowireCapableBeanFactory类中调用,这个方法作用是获取被包装后的bean,包装后的对象是BeanWrapper对象,这个对象的实现类是BeanWrapperImpl。其中包含被封装后待处理的bean,和...

szhlcy的博客 360

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spring AbstractAutowireCapableBeanFactory

目录 属性 构造函数 createBean populateBean initializeBean Spring BeanFactory Spring AbstractBeanFactory Spring AbstractAutowireCapableBeanFactory Spring DefaultListableBeanFactory 属性 // bean的生成...

demon7552003的小本本 401

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

每天一点点,Spring执行创建bean(AbstractAutowireCapableBeanFactory#doCreateBean)

Spring 创建bean流程 AbstractAutowireCapableBeanFactory#doCreateBean 1、 判断当前bean是不是单例的,如果是单例的,先从缓存中取,如果存在直接返回(在创建之前已经由依赖注入已生成),如果不存在执行创建 if (mbd.isSingleton()) { instanceWrapper = this.factoryBeanInstanceCache.remove(beanName); } if (instanceWrapper == null)

whiteGu的博客 520

spring源码06——AbstractAutowireCapableBeanFactory.doCreateBean

类名:AbstractAutowireCapableBeanFactory protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, Object[] args) { BeanWrapper instanceWrapper = null; if (mbd.isSingleton()) { instanceWrapper = (BeanWrapp

lovesman的博客 456

Spring源码学习--AbstractAutowireCapableBeanFactory.createBean

2019-09-23阅读1K0 记得跟老婆谈恋爱时,女儿心血来潮给老婆做饭,按照菜谱先一步的做,结果点差把厨房厨房 入口 上一篇,AbstractBeanFactory.getBean 的主流程,今天介绍下其中的createBean方法,程序入口如下: <span style="color:#333333"><span style="color:#333333"><span style="background-color:#50556b"&gt...

u014191624的博客 486

Spring源码-IOC之createBean

版本 Spring Framework 6.0.9​。

orixixi的博客 878

架构のSpring扩展点(四):Bean初始化时对象自动注入-Aware全解析

Aware类的接口提供了可以在Bean初始化的过程中自动获取信息的能力。

weixin_42422586的博客 739

AbstractAutowireCapableBeanFactory(springbean生命周期)

1、加载BeanFactory会初始化org.springframework.beans.factory.support.DefaultListableBeanFactory继承了AbstractAutowireCapableBeanFactory,这个父类就是生命周期的核心,实例化、初始化、前后增强以及销毁Bean,覆盖了整个生命周期。7、注册销毁的Bean,如果是单例,通过DestructionAwareBeanPostProcessors来销毁bean,如果不是单例,则使用回调来销毁bean。

农夫三拳 549

Spring源码深度解析:九、bean的获取③ - createBeanInstance

的流程图如下,让我们根据流程图一步一步的学习一下spring是如何创建bean的吧 文章目录:Spring源码分析:文章目录这篇文章应该是接着 Spring源码深度解析:八、bean的获取② - getSingleton 的继续分析过程。 本文主要是分析的方法是,功能是Spring 具体创建bean的过程。调用如下: 根据方法名就知道,是创建bean的实例,也就注定了这个方法的不平凡。下面就来一步一步的剖析他。具体源码如下: 我们可以看到:下面我们来解析代码。这部分的功能 : 若中设置了则使用 提供的bea

知行 847

AbstractAutowireCapableBeanFactory.createBean()

Bean的五种创建方式以及源码解读 自定义BeanPostProcessor生成代理对象InstantiationAwareBeanPostProcessor 通过反射创建对象 通过factoryMethod创建对象 通过FactoryBean创建对象 通过Supplier创建对象

min_chaoxi的博客 271

Spring IoC的细节--AbstractAutowireCapableBeanFactory.createBeanInstance(...)

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException { //实例化Bean BeanWrapper instanceWrapper = null; ...

aidaowuqiong的博客 358

spring之DefaultListableBeanFactory的bean的创建过程

一、DefaultListableBeanFactory简介 DefaultListableBeanFactory是bean加载的核心部分,是Spring注册及加载的默认实现。继承关系如下图: AbstractAutowireCapableBeanFactory完成Bean的创建,属性的注入,切面代理的产生,bean的生命周期的管理。 二、AbstractAu...

NCS123456的博客 2592
上一篇: SpringBoot扩展篇:Spring注入 @Autowired & @Resource
下一篇: SpringBoot扩展篇:循环依赖源码链路
hao9e
博客等级 码龄7年 189粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值