首页 > 编程语言 >Spring源码-AbstractAutowireCapableBeanFactory的instantiateBean无参构造实例化bean

Spring源码-AbstractAutowireCapableBeanFactory的instantiateBean无参构造实例化bean

时间:2022-09-30 22:24:48浏览次数:58  
标签:无参 bd constructorToUse Spring beanName clazz bean 源码 instantiateBean

instantiateBean

protected BeanWrapper instantiateBean(String beanName, RootBeanDefinition mbd) {
	try {
		Object beanInstance;
		if (System.getSecurityManager() != null) {
			beanInstance = AccessController.doPrivileged(
					(PrivilegedAction<Object>) () -> getInstantiationStrategy().instantiate(mbd, beanName, this),
					getAccessControlContext());
		}
		else {
			beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, this);
		}
		BeanWrapper bw = new BeanWrapperImpl(beanInstance);
		initBeanWrapper(bw);
		return bw;
	}
	catch (Throwable ex) {
		throw new BeanCreationException(
				mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex);
	}
}

调用实例化策略实例化bean并初始化BeanWrapper。

@Override
public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) {
	// Don't override the class with CGLIB if no overrides.
	if (!bd.hasMethodOverrides()) {
		Constructor<?> constructorToUse;
		synchronized (bd.constructorArgumentLock) {
			constructorToUse = (Constructor<?>) bd.resolvedConstructorOrFactoryMethod;
			if (constructorToUse == null) {
				final Class<?> clazz = bd.getBeanClass();
				if (clazz.isInterface()) {
					throw new BeanInstantiationException(clazz, "Specified class is an interface");
				}
				try {
					if (System.getSecurityManager() != null) {
						constructorToUse = AccessController.doPrivileged(
								(PrivilegedExceptionAction<Constructor<?>>) clazz::getDeclaredConstructor);
					}
					else {
						constructorToUse = clazz.getDeclaredConstructor();
					}
					bd.resolvedConstructorOrFactoryMethod = constructorToUse;
				}
				catch (Throwable ex) {
					throw new BeanInstantiationException(clazz, "No default constructor found", ex);
				}
			}
		}
		return BeanUtils.instantiateClass(constructorToUse);
	}
	else {
		// Must generate CGLIB subclass.
		return instantiateWithMethodInjection(bd, beanName, owner);
	}
}

如果没有MethodOverrides,即没有lookup-method和replaced-method标签,则从resolvedConstructorOrFactoryMethod缓存获取构造函数,若没有则获取默认构造函数。调用构造函数反射实例化bean。如果有MethodOverrides,生成cglib代理处理lookup-method和replaced-method标签

标签:无参,bd,constructorToUse,Spring,beanName,clazz,bean,源码,instantiateBean
From: https://www.cnblogs.com/shigongp/p/16746408.html

相关文章

  • Spring源码-AbstractAutowireCapableBeanFactory的autowireConstructor
    autowireConstructor:protectedBeanWrapperautowireConstructor( StringbeanName,RootBeanDefinitionmbd,@NullableConstructor<?>[]ctors,@NullableObject[......
  • 源码学习之MyBatis的底层查询原理
    导读本文通过MyBatis一个低版本的bug(3.4.5之前的版本)入手,分析MyBatis的一次完整的查询流程,从配置文件的解析到一个查询的完整执行过程详细解读MyBatis的一次查询流程,通过本......
  • Spring Security 在 Servlet 的作用区域
    SpringSecurity使用标准的Servlet 过滤器(Filter) 并与Servlet容器集成。这个意味着SpringSecurity可以在任何运行运行在Servlet容器(ServletContainer)中的应用......
  • 0044-Bytes-bytes源码阅读
    环境Time2022-05-29Rust1.61.0Bytes1.1.0前言说明参考:https://github.com/tokio-rs/bytes目标Buf是一个trait,里面有几个方法需要实现,Bytes实现了Buf。re......
  • 0045-Bytes-bytes源码阅读
    环境Time2022-05-29Rust1.61.0Bytes1.1.0前言说明参考:https://docs.rs/bytes/latest/bytes/struct.Bytes.html目标Bytes的源码基本上看完了,简单使用一下其中......
  • 0046-Bytes-bytes源码阅读
    环境Time2022-05-29Rust1.61.0Bytes1.1.0前言说明参考:https://docs.rs/bytes/latest/bytes/trait.Buf.html目标Bytes实现了Buf,使用一下其中的方法。remain......
  • Spring源码-createBeanInstance和SmartInstantiationAwareBeanPostProcessor
    protectedBeanWrappercreateBeanInstance(StringbeanName,RootBeanDefinitionmbd,@NullableObject[]args){//Makesurebeanclassisactuallyresolvedatth......
  • 0043-Bytes-bytes源码阅读
    环境Time2022-05-29Rust1.61.0Bytes1.1.0前言说明参考:https://github.com/tokio-rs/bytes目标Bytes实现迭代器。IntoIter#[derive(Debug)]pubstructInt......
  • 解决https://start.spring.io连接不上的问题
    1、问题描述在使用Eclipse或者Idea创建Springboot项目时,需要使用"https://start.spring.io"创建项目,但时不时总是会报"SocketTimeoutException:Connecttimedout"的错误......
  • 【Java】【Spring】【事务的使用】
    【Java】【Spring】【事务的使用】一、前提纲要本文章涉及到事务入门、springboot多数据源的配置、隔离级别、事务的传播方式、在springboot中事务的使用以及多数据源分......