Commit b0aab613 by SunWei峰

京东挂我

parent 94e1e9e0
...@@ -188,6 +188,7 @@ public class InitDestroyAnnotationBeanPostProcessor implements DestructionAwareB ...@@ -188,6 +188,7 @@ public class InitDestroyAnnotationBeanPostProcessor implements DestructionAwareB
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
LifecycleMetadata metadata = findLifecycleMetadata(bean.getClass()); LifecycleMetadata metadata = findLifecycleMetadata(bean.getClass());
try { try {
/// @PostConstruct实现方法
metadata.invokeInitMethods(bean, beanName); metadata.invokeInitMethods(bean, beanName);
} }
catch (InvocationTargetException ex) { catch (InvocationTargetException ex) {
......
...@@ -644,14 +644,17 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac ...@@ -644,14 +644,17 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
// 若exposedObject在增强方法中没有被改变。(没有增强) // 若exposedObject在增强方法中没有被改变。(没有增强)
// 如果缓存的对象 exposedObject == bean,直接赋值之前暴露出来的bean // 如果缓存的对象 exposedObject == bean,直接赋值之前暴露出来的bean
if (exposedObject == bean) { if (exposedObject == bean) {
// 后置处理器没有对对象进行修改
exposedObject = earlySingletonReference; exposedObject = earlySingletonReference;
} }
// 如果提前暴露的对象和经过了完整的生命周期后的对象不相等 // 如果提前暴露的对象和经过了完整的生命周期后的对象不相等,有后置处理器修改了bean,
// 例如 @Async,这种循环依赖Spring无法解决,如果是真的依赖的话,报错就好了
else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) { else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
String[] dependentBeans = getDependentBeans(beanName); String[] dependentBeans = getDependentBeans(beanName);
Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length); Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
for (String dependentBean : dependentBeans) { for (String dependentBean : dependentBeans) {
if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) { if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
// 有问题的才add
actualDependentBeans.add(dependentBean); actualDependentBeans.add(dependentBean);
} }
} }
...@@ -1195,10 +1198,10 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac ...@@ -1195,10 +1198,10 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
return obtainFromSupplier(instanceSupplier, beanName); return obtainFromSupplier(instanceSupplier, beanName);
} }
// 2. 如果工厂方法不为空,则使用工厂方法初始化策略 // 2. 如果工厂方法不为空,则使用工厂方法初始化策略,存在 factoryMethod 属性
if (mbd.getFactoryMethodName() != null) { if (mbd.getFactoryMethodName() != null) {
// 通过 @Bean 注解方法注入的bean 或者xml 配置注入 的BeanDefinition 会存在这个值。 // 通过 @Bean 注解方法注入的bean 或者xml 配置注入 的BeanDefinition 会存在这个值。
// 而注入这个bean的方法就是工厂方法。后面会详细解读 // 而注入这个bean的方法就是工厂方法。
return instantiateUsingFactoryMethod(beanName, mbd, args); return instantiateUsingFactoryMethod(beanName, mbd, args);
} }
...@@ -1246,7 +1249,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac ...@@ -1246,7 +1249,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
// Candidate constructors for autowiring? // Candidate constructors for autowiring?
// 6. 根据参数解析构造函数,并将解析出来的构造函数缓存到mdb 的 resolvedConstructorOrFactoryMethod 属性中 // 6. 根据参数解析构造函数,并将解析出来的构造函数缓存到mdb 的 resolvedConstructorOrFactoryMethod 属性中
// 到这一步,说明 bean 是第一次加载,所以没有对构造函数进行相关缓存(resolved 为 false) // 到这一步,说明 bean 是第一次加载,所以没有对构造函数进行相关缓存(resolved 为 false)
// 调用 determineConstructorsFromBeanPostProcessors 方法来获取指定的构造函数列表。后面详解 // 调用 determineConstructorsFromBeanPostProcessors 方法来获取指定的构造函数列表。
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName); Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR || if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) { mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
......
...@@ -1773,7 +1773,9 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp ...@@ -1773,7 +1773,9 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
*/ */
protected boolean removeSingletonIfCreatedForTypeCheckOnly(String beanName) { protected boolean removeSingletonIfCreatedForTypeCheckOnly(String beanName) {
if (!this.alreadyCreated.contains(beanName)) { if (!this.alreadyCreated.contains(beanName)) {
// 是checkOnly类型就删除
removeSingleton(beanName); removeSingleton(beanName);
// 没有问题就返回true
return true; return true;
} }
else { else {
......
...@@ -1036,7 +1036,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto ...@@ -1036,7 +1036,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
// 判断是否已经有其它的 bean 开始初始化了 // 判断是否已经有其它的 bean 开始初始化了
// 注意,注册 bean 这个动作结束之后,bean 依然没有被初始化,真正的初始化操作还在后面 // 注意,注册 bean 这个动作结束之后,bean 依然没有被初始化,真正的初始化操作还在后面
// 在 spring 容器启动的最后,会预初始化所有的单例 bean // 在 spring 容器启动的最后,会预初始化所有的单例 bean
// TODO: 2022/7/18 搞清楚他的思想,到底是不是为了copyOnWrite // beanDefinitionMap 被锁住了,但是 beanDefinitionNames 需要 copyOnWrite
if (hasBeanCreationStarted()) { if (hasBeanCreationStarted()) {
// Cannot modify startup-time collection elements anymore (for stable iteration) // Cannot modify startup-time collection elements anymore (for stable iteration)
synchronized (this.beanDefinitionMap) { synchronized (this.beanDefinitionMap) {
...@@ -1355,13 +1355,13 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto ...@@ -1355,13 +1355,13 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
// 获取依赖的类型 // 获取依赖的类型
Class<?> type = descriptor.getDependencyType(); Class<?> type = descriptor.getDependencyType();
// 取值@Value注解中的value属性中的值,这里取出的值是未经修改的值,即带有 ${} 标签的值。 // 取值@Value注解中的value属性中的值,这里取出的值是未经修改的值,即带有 ${} 标签的值。
// 如果descriptor未被@Value标注,则返回null // 如果 descriptor 未被 @Value 标注,则返回null
Object value = getAutowireCandidateResolver().getSuggestedValue(descriptor); Object value = getAutowireCandidateResolver().getSuggestedValue(descriptor);
if (value != null) { if (value != null) {
// 到这里说明属性被 @Value 注解修饰了,这里是解析 @Value 注解的逻辑 // 到这里说明属性被 @Value 注解修饰了,这里是解析 @Value 注解的逻辑
// 如果value不为null, // 如果value不为null,
if (value instanceof String) { if (value instanceof String) {
// 处理占位符如${},做占位符的替换(不解析SP EL表达式) // 处理占位符如${},做占位符的替换(不解析SPEL表达式)
String strVal = resolveEmbeddedValue((String) value); String strVal = resolveEmbeddedValue((String) value);
BeanDefinition bd = (beanName != null && containsBean(beanName) ? BeanDefinition bd = (beanName != null && containsBean(beanName) ?
getMergedBeanDefinition(beanName) : null); getMergedBeanDefinition(beanName) : null);
......
...@@ -57,7 +57,7 @@ public class SimpleInstantiationStrategy implements InstantiationStrategy { ...@@ -57,7 +57,7 @@ public class SimpleInstantiationStrategy implements InstantiationStrategy {
@Override @Override
public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) { public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) {
// Don't override the class with CGLIB if no overrides. // Don't override the class with CGLIB if no overrides.
// 如果当前bean中的方法没有都没有被重写,则直接反射就好了。不需要使用cglib 来进行代理 // 如果当前bean中的方法没有都没有被重写,则直接反射就好了。不需要使用cglib 来进行代理(主要针对重写方法)
if (!bd.hasMethodOverrides()) { if (!bd.hasMethodOverrides()) {
Constructor<?> constructorToUse; Constructor<?> constructorToUse;
synchronized (bd.constructorArgumentLock) { synchronized (bd.constructorArgumentLock) {
......
...@@ -119,7 +119,7 @@ final class PostProcessorRegistrationDelegate { ...@@ -119,7 +119,7 @@ final class PostProcessorRegistrationDelegate {
beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
// 遍历 postProcessorNames // 遍历 postProcessorNames
for (String ppName : postProcessorNames) { for (String ppName : postProcessorNames) {
// 校验是否实现了PriorityOrdered接口 // 校验是否实现了 PriorityOrdered 接口
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
// 获取ppName对应的bean实例, 添加到currentRegistryProcessors中, // 获取ppName对应的bean实例, 添加到currentRegistryProcessors中,
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment