Commit b0aab613 by SunWei峰

京东挂我

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