BeanFactory介绍:
BeanFactory是一个类工厂,但和传统的类工厂不同,传统的类工厂仅负责一个或几个类的实例;而BeanFactor是类的通用工厂,可以创建并管理各种类的对象。这些可被创建和管理的对象本身没有什么特别之处,仅是一个对象,Spring称这些被创建和管理的java对象为Bean。
ApplicationContext介绍
ApplicationContext是有BeanFactory派生而来,提供了更多面向实际应用的功能。在BeanFactor中,很多功能需要以编程的方式实现,而在ApplicationContext中则可以通过配置的方式实现。
两者区别
BeanFactory:
BeanFactory是spring中最底层的接口,定义了IOC的基本功能,包含了各种Bean的定义、加载、实例化、依赖注入和生命周期管理。但无法支持spring插件,例如:AOP、Web应用等功能。
ApplicationContext
ApplicationContext是BeanFactory的子类,因为BeanFactory无法满足不断更新的spring的需求,于是ApplicationContext就基本上代替了BeanFactory的工作,以一种更面向框架的工作方式以及对上下文进行分层和实现继承,并在这个基础上对功能进行扩展:
<1>MessageSource, 提供国际化的消息访问
<2>资源访问(如URL和文件)
<3>事件传递
<4>Bean的自动装配
<5>各种不同应用层的Context实现
加载方式
1.利用BeanFactory获取bean
//XmlBeanFactory是典型的BeanFactory。
BeanFactory factory = new XmlBeanFactory("XXX.xml");
//获取一个叫做xxxx的bean。在这个时候进行实例化。
factory.getBean("xxxx");
当我们使用BeanFactory去获取Bean的时候,我们只是实例化了该容器,而该容器中的bean并没有被实例化。当我们getBean的时候,才会实时实例化该bean对象
2.利用ApplicationContext获取bean
//当我们实例化XXX.xml的时候,该文件中配置的bean都会被实例化。
ApplicationContext appContext = new ClassPathXmlApplicationContext("XXX.xml");
当我们使用ApplicationContext去获取bean的时候,在加载XXX.xml的时候,会创建所有的配置bean
区别总结
(1).BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化,这样,我们就不能发现一些存在的Spring的配置问题。而ApplicationContext则相反,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误。
(2).如果使用ApplicationContext,配置的bean是singleton,那么不管你有没有或想不想用它,它都会被实例化。好处是可以预先加载,坏处是浪费内存。
(3).BeanFactory,当使用BeanFactory实例化对象时,配置的bean不会马上被实例化,而是等到你使用该bean的时候(getBean)才会被实例化。好处是节约内存,坏处是速度比较慢。
(4).没有特殊要求的情况下,应该使用ApplicationContext完成。因为BeanFactory能完成的事情,ApplicationContext都能完成,并且提供了更多接近现在开发的功能。
(5).BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册