目录
一、beanFactory和applicationContext的说明
二、beanFactory和applicationContext的区别
一、beanFactory和applicationContext的说明
在Spring中,IoC(Inversion of Control:控制反转)容器主要有两种实现方式:
- BeanFactory: 是Spring框架最基本的IoC容器,提供了基本的IoC功能。但是,BeanFactory的功能相对较为简单,实现更偏向底层。实现代码如下:
!--配置UserDaoImpl--> <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
public class BeanFactoryTest { public static void main(String[] args) { //1.创建工厂对象 DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); //2.创建读取器,绑定bean工厂 XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory); //3.读取beans.xml给工厂 reader.loadBeanDefinitions("beans.xml"); //4.根据id获取UserDao对象 UserDao userDao = (UserDao) beanFactory.getBean("userDao"); System.out.println(userDao); } }
通过BeanFactory实现IOC的方式,属于延迟加载:即当调用beanFactory.getBean("userDao")时,容器才会实例化对应的bean对象,放在BeanFactory对象维护下的单例池(singletonObject)中进行管理。如下图:
- ApplicationContext: 是BeanFactory的子接口,在实现BeanFactory功能的同时提供了更多的功能,包括事件传播、AOP等。ApplicationContext是Spring中常用的IoC容器。代码实现如下:
<!--配置UserDaoImpl--> <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
public class ApplicationContextTest { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); UserDao userDao = (UserDao) applicationContext.getBean("userDao"); System.out.println(userDao); } }
与BeanFactory实现方式不同,applicationContext容器创建后就会实例化bean对象,并将实例化对象放到applicationContext引用的BeanFactory对象维护下的单例池(singletonObject)中进行管理(applicationContext方式,底层实际也是通过BeanFactory来实例化并管理对象的)
-
二、beanFactory和applicationContext的区别
beanFactory和applicationContext两种方式都实现了将创建和管理对象交给spring容器来控制,不需要在通过new的方式来创建对象,在需要的时候直接将对象注入到相应的地方即可。下面是2种实现方式的区别:
- beanFactory 是spring早期接口,称之为spring的bean工厂,applicationContext 是后期更高级的接口,称之spring容器
- applicationContext 在 beanFactory 基础上对功能进行了扩展,例如监听功能、国际化功能等,beanFactory 的 API 更偏向底层,applicationContext 的 API 大多数是对这些底层 API 的封装
- Bean创建的主要逻辑和功能都被封装在 beanFactory 中,applicationContext 不仅继承了 beanFactory ,而且 applicationContext 内部还维护着beanFactory的引用,所以 applicationContext 和 beanFactory 既有继承关系,又有融合关系
- Bean的初始化时机不同,原始 beanFactory 是在首次调用 getBean 时才会进行bean的创建,而 applicationContext 则是在加载配置文件,容器创建后就将bean实例化并初始化完成。
如图所示:更加直观的体现了2者的关系