Resource 定位:我们一般使用外部资源来描述 Bean 对象,所以 IOC 容器第一步就是需要定位 Resource 外部资源 。Resource 的定位其实就是 BeanDefinition 的资源定位,它是由 ResourceLoader 通过统一的 Resource 接口来完成的,这个 Resource 对各种形式的 BeanDefinition 的使用都提供了统一接口 。
载入:第二个过程就是 BeanDefinition 的载入 ,BeanDefinitionReader 读取 , 解析 Resource 定位的资源,也就是将用户定义好的 Bean 表示成 IOC 容器的内部数据结构也就是 BeanDefinition, 在 IOC 容器内部维护着一个 BeanDefinition Map 的数据结构,通过这样的数据结构, IOC 容器能够对 Bean 进行更好的管理 。 在配置文件中每一个都对应着一个 BeanDefinition 对象 。
注册:第三个过程则是注册,即向 IOC 容器注册这些 BeanDefinition ,这个过程是通过 BeanDefinitionRegistery 接口来实现的 。
17 说说 BeanFactory 和 ApplicationContext 的区别? 什么是延迟实例化,它的优缺点是什么?
BeanFactory 是 Spring 里面最低层的接口,提供了最简单的容器的功能,只提供了实例化对象和获取对象的功能 。
两者装载 bean 的区别
BeanFactory :在启动时不会去实例化 Bean ,只有从容器中获取 Bean 时才会去实例化。
ApplicationContext :在启动的时候就把所有的 Bean 全部实例化了 。 它还可以为 Bean 配置 lazy-init=true 来让 Bean 延迟实例化。
延迟实例化
优点: 应用启动时占用资源很少,对资源要求较高的应用,比较有优势。