在 Spring 中, 可以在 元素的 scope 属性里设置 Bean 的作用域.。默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实例, 整个 IOC 容器范围内都能共享该实例:所有后续的 getBean() 调用和 Bean 引用都将返回这个唯一的 Bean 实例.该作用域被称为 singleton, 它是所有 Bean 的默认作用域。Bean没有设置lazy-init的 默认在构造IOC容器的时候是不创建Bean实例的,只有在getBean的时候才去创建实例的。
ioc构建的时候把xml的bean 封装成BeanDefinition,全部存在beanDefinitionMap里面,getBean的时候再将bean通过反射实例实例化就能拿到了。思路是这样了,直接去看源码!
getSingleton 方法 获取ObjectFactory生产的bean同时放进singletonObjects集合里面,方便下一次取。
DefaultSingletonBeanRegistry 注册由AbstractAutowireCapableBeanFactory生产 出来的bean同时作为缓存,这样下一次取bean的时候就不用再次生产bean了。直到这里,bean的生命周期可以分为:构建beanDefinition(ioc容器初始化) -> 由抽象工厂生产bean(getBean) ->放进缓存 。生产bean的过程是通过反射生产的,可以通过构造器,class反射生产。ioc容器的一个好处就是在生产bean的同时帮我们处理类之间的关系。