代码拉取完成,页面将自动刷新
同步操作将从 huifer/Code-Analysis 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
org.springframework.beans.factory.support.SimpleInstantiationStrategy
在 SimpleInstantiationStrategy
中仅有一个变量 用来存储 工厂方法(FactoryMethod
)
private static final ThreadLocal<Method> currentlyInvokedFactoryMethod = new ThreadLocal<>();
org.springframework.beans.factory.support.SimpleInstantiationStrategy#instantiate(org.springframework.beans.factory.support.RootBeanDefinition, java.lang.String, org.springframework.beans.factory.BeanFactory)
第一部分代码分析
if (!bd.hasMethodOverrides()) {
// 构造方法
Constructor<?> constructorToUse;
// 锁
synchronized (bd.constructorArgumentLock) {
// 提取构造函数
constructorToUse = (Constructor<?>) bd.resolvedConstructorOrFactoryMethod;
if (constructorToUse == null) {
// 获取 bean Class
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);
}
Constructor
构造函数类. 寻找方式有
BeanDefinition
**中的resolvedConstructorOrFactoryMethod
属性获取BeanDefinition
中获取 BeanClass
后在通过 Class
获取在获取到Constructor
后交给BeanUtils.instantiateClass
进行Bean构造
BeanUtils.instantiateClass
的分析可以查看这篇文章
接下来看第二段代码
else {
// Must generate CGLIB subclass.
// cglib 构造 . 本质还是 构造函数创建
return instantiateWithMethodInjection(bd, beanName, owner);
}
第二段代码就涉及到 CGLIB 的对象构造了 , 即InstantiationStrategy
的另一个实现类CglibSubclassingInstantiationStrategy
关于 CglibSubclassingInstantiationStrategy
的分析查看这篇文章
@Override
public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) {
// Don't override the class with CGLIB if no overrides.
// 不是 cglib
// 重写方法列表是否存在
if (!bd.hasMethodOverrides()) {
// 构造方法
Constructor<?> constructorToUse;
// 锁
synchronized (bd.constructorArgumentLock) {
// 提取构造函数
constructorToUse = (Constructor<?>) bd.resolvedConstructorOrFactoryMethod;
if (constructorToUse == null) {
// 获取 bean Class
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.
// cglib 构造 . 本质还是 构造函数创建
return instantiateWithMethodInjection(bd, beanName, owner);
}
}
在上面的分析中我们已经认识到了两种初始化方式.
在这个方法中也是这样两种
org.springframework.beans.factory.support.SimpleInstantiationStrategy#instantiate(org.springframework.beans.factory.support.RootBeanDefinition, java.lang.String, org.springframework.beans.factory.BeanFactory, java.lang.reflect.Constructor<?>, java.lang.Object...)
if (!bd.hasMethodOverrides()) {
if (System.getSecurityManager() != null) {
// use own privileged to change accessibility (when security is on)
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
ReflectionUtils.makeAccessible(ctor);
return null;
});
}
return BeanUtils.instantiateClass(ctor, args);
}
第一部分有一次指向了方法BeanUtils.instantiateClass
有关BeanUtils.instantiateClass
的分析可以查看这篇文章
第二部分代码
// cglib 的初始化
else {
return instantiateWithMethodInjection(bd, beanName, owner, ctor, args);
}
org.springframework.beans.factory.support.SimpleInstantiationStrategy#instantiate(org.springframework.beans.factory.support.RootBeanDefinition, java.lang.String, org.springframework.beans.factory.BeanFactory, java.lang.Object, java.lang.reflect.Method, java.lang.Object...)
执行事项
Method
将结果返回currentlyInvokedFactoryMethod
if (System.getSecurityManager() != null) {
// 设置 accessible
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
ReflectionUtils.makeAccessible(factoryMethod);
return null;
});
}
else {
// 设置 accessible
ReflectionUtils.makeAccessible(factoryMethod);
}
// 获取 工厂函数
Method priorInvokedFactoryMethod = currentlyInvokedFactoryMethod.get();
try {
// 找到 factory method 调用执行
currentlyInvokedFactoryMethod.set(factoryMethod);
// 反射执行工厂函数
Object result = factoryMethod.invoke(factoryBean, args);
if (result == null) {
result = new NullBean();
}
return result;
}
finally {
if (priorInvokedFactoryMethod != null) {
currentlyInvokedFactoryMethod.set(priorInvokedFactoryMethod);
}
else {
currentlyInvokedFactoryMethod.remove();
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。