SpringIOC容器是一个IOC Service Provider。提供了两种容器类型:BeanFactory和ApplicationContext。
Spring的IOC容器是一个提供IOC支持的轻量级容器。除了基本的ioc支持,它作为轻量级容器还提供了IOC之外的支持。
BeanFactory:BeanFactory是spring中提供的最简单最基本的容器;这个容器只提供了IOC/DI的功能;这个容器中最主要个方法就是getBean()方法;
通常我们会使用xmlBeanFactory对象创建容器:XmlBeanFactory就是针对最基本的ioc容器的实现,这个IOC容器可以读取XML文件定义的BeanDefinition(XML文件中对bean的描述);
我们一般使用的是Spring提供的功能更加全面的ApplicationContext;
ApplicationContext:是一个功能更加全面的容器,
一般我们直接使用这个容器;
ApplicationContext接口继承了BeanFactory接口,所以,ApplicationContext实现了getBean方法;
2,提供了额外的功能:
1,环境感知;
2,容器的继承体系;
3,国际化相关;
4,事件发布/响应机制;
5,统一的资源管理;
6,AOP的功能;
关于二者实例化时机的区别:
beanfactory容器:容器在启动的时候,并不会实例化bean,只有当用户调用getBean()方法的时候才会对配置好的bean进行实例化;
ApplicationContext容器:当容器启动之后,容器就已经实例化好了所有配置的bean;
如何延迟实例化:
对于ApplicationContext容器启动便进行实例化bean,我们可以通过以下的两种方式来延迟实例化:
1,可以在bean元素配置lazy-init=true来让bean延迟实例化;
2,可以在beans元素配置default-lazy-init=true来让这个beans里面所有的bean延迟实例化;
对比延迟实例化和非延迟实例化:
1,延迟实例化:在系统启动的时候快,系统启动的时候占用的资源少;并且,如果在使用的时候再去加载对象,第一次使用的时候性能较低;因为不会在加载的时候去实例化对象,所以延迟实例化不能对实例化出来的对象做更多的功能;
2,非延迟实例化:在系统启动的时候,所有对象被实例化,启动速度慢,使用速度快,启动的时候占用较多系统资源;
如何选择:
1,对于系统资源较少的应用可以使用延迟实例化(移动应用);
2,对于web应用来说,一般选择迫切实例化;
3,在web应用里面,我们一般把比较耗时的事情放在系统启动的时候完成;