- 首先得明白流程,我们是在xxx.xml中配置对象的信息,然后在java程序中创建与之绑定的Spring容器,再通过getBean() 获取对应的实例,对象是在Spring容器中已经创建好了,getBean()只是起到了获取的作用
- 在xxx.xml中配置了对应类的全路径以便后续通过反射调用生成对象,然后还有配置了一个对应的id,这个id是每个bean对象的唯一标识,后续也是在容器中通过该id找到对应的对象实例。
ApplicationContext ioc = new ClassPathXmlApplicationContext(“beans.xml”); - 通过上面这个方法创建了一个与beans.xml文件绑定的Spring容器,而,他绑定不是src下的beans.xml,而是out目录下的beans.xml,这个很好证明
我们可以输出工程的真正运行路径就可以知道了
-
由于 该Spring是重量级的(数据量很大),一般我们都是只会创建一个
-
使用debug的方式可以看到,ioc容器中有个组件叫beanFactory,xml文件还有对象实例的信息都是放在这个组件里面
-
beanFactory中有个组件叫beanDefinitionMap,他本质上是一个ConcurrentHashMap,用于存放xml文件中的bean信息,我们在xml文件中配置的对象信息都可以在这里看到,然后,每个bean对象在这个ConcurrentHashMap中都是以Node节点的形式封装保存,
格式都是按照node节点的格式来封装
-
在beanFactory中的同级目录下还有一个组件,叫做singletonObjects,他存放着通过xxx.xml生成的单例对象,我们通过getbean()获取到的对象就是在这里查找到的,他也是一个concurrentHashMap,数据也是通过node节点的形式存储,我们创建了2个student01对象,因为它是存放单例对象,所有我们创建的2个student01d对象都是通过同一个node节点映射生成的
-
getbean()的调用流程:首先,他会通过我们填入的xxx值去beanDefinitionMap中寻找与id匹配的数据对象,如果找到了,他就会判断该对象是否是单例对象,如果是,那就会跑到singletonObjects中用那个id值找到与之对应的单例对象,通过它生成对象实例,如果他不是一个单例对象,就会直接生成一个临时的对象返回
-
Spring还提供了一个组件beanDefinitionNames,通过它我们可以更加方便的获取到对应的bean的id,java中也提供了对应的api方便我们获取