你看图吧老师,我也不知道怎么说

来源:6-9 BeanDefinition的注册

绝世的陈逗逗

2020-09-03

图片描述图片描述图片描述

写回答

1回答

翔仔

2020-09-04

同学好,好问题,这个地方我的确也有困惑,这里需要同学协助一下,就是造类似如下的case,

public static void main(String[] args) {
  ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
  Object d1 = context.getBean("d2");
  /** 利用获取的d1进行业务操作*/
  DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
  factory.registerBeanDefinition("我要再注册一个bean",new GenericBeanDefinition());

首先在application.xml里面定义一个叫做test的bean,然后再往factory.registerBeanDefinition("我要再注册一个bean",new GenericBeanDefinition());注册一个bean,名字同样为test,然后执行到这里的时候,肯定会进入到同学截图的if (hasBeanCreationStarted
)里面,提前设置断点看看执行到这里的时候,即 this.beanDefinitionNames = updatedDefinitions;,updatedDefinitions有没有重名的beanName。

此外,针对同学的第二个问题,removeManualSingletonName这个方法用来更新的是手工添加的bean的信息,如果发现自动注册进来的beanname和手工添加的重合了,就移除,你这里没有手工添加,所以就不需要移除了

https://www.cnblogs.com/hfultrastrong/p/9983409.html


0
2
Moniiiicaaaaaa
没懂第一个问题的答案,"factory.registerBeanDefinition("我要再注册一个bean",new GenericBeanDefinition())"执行后就已经设置了Bean的名称了啊,如果设置为相同的"test",那么DefaultListableBeanFactory在执行"BeanDefinition existingDefinition= this.beanDefinitionMap.get(beanName)"的结果不为null,那么根本就不会执行到"if(hasBeanCreationStarted)"啊?所以该if语句下的两种名字注册方法不会重复注册啊。
2021-06-22
共2条回复

剑指Java自研框架,决胜Spring源码

快速入门Spring核心源码+从零开发自研框架

1498 学习 · 495 问题

查看课程