Spring容器结构(快速说明)
结构:
保留类的定义信息(beanDefinitionMap)
1、首先“xml文件中类的配置都存储在beanDefinitionMap中的table类(该类的类型是ConcurrentHashMap$Node)初始大小:512 ,然后我们配置为Monster01id的类是放在217的位置”
2、key:xml文件中配置的id
val:该类的所有配置信息
217位置的配置类
结构:
1、beanClass : 类的全路径(后续是通过这个路径进行反射创建)
2、lazyinit:懒加载(true:当用户用到这个类的时候我创建对象
false:容器启动时就直接 new 好对象,提前准备好,放 singletonObjects 里)
3、根据第二点!所以这里很重要,如果你需要每次getBean()获取的都是一个新的对象,那么在xml文件的<bean>标签属性中使用scope="prototype"
这里就是存储217位置类的属性
通过getBean()方法获取的对象存储位置
1、如果是单例模式:存储在一级的缓存中
对于绝大多数的单例Bean,其完全初始化后的成品对象会被集中存储在容器中的一级缓存中,也就是singletonObjects中,这是一个底层的ConcurrentHashMap集合。当业务代码调用getBean()时,就会Spring就会优先查询这个Map,如果存在则直接返回该实例,如果不存在,则会触发创建流程,完成后 ,将其存入到缓存池中
2、如果不是单例模式(原型作用域):不存储在容器中
如果是原型作用域中的Bean,那么调用getBean()方法时,都会创建一个全新的生命周期和一个完整的实例,这个实例永远不会进入任何缓存池中,返回的就是这个对象
