IOC 容器
IOC 容器
引入问题:
- 谁负责创建组件?
- 谁负责根据依赖关系组装组件?
- 销毁时,如何按顺序正确销毁?
1. 原理
IoC又称为依赖注入(DI:Dependency Injection),它解决了一个最主要的问题:将组件的创建+配置与组件的使用相分离,并且,由IoC容器负责管理组件的生命周期。
- 无侵入容器
在设计上,Spring的IoC容器是一个高度可扩展的无侵入容器。所谓无侵入,是指应用程序的组件无需实现Spring的特定接口,或者说,组件根本不知道自己在Spring的容器中运行。这种无侵入的设计有以下好处:
-
应用程序组件既可以在Spring的IoC容器中运行,也可以自己编写代码自行组装配置;
-
测试的时候并不依赖Spring容器,可单独进行测试,大大提高了开发效率。
2. Spring 容器
- ApplicationContext
// 创建容器
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
// 获取 bean
UserService userService = context.getBean(UserService.class);
- BeanFactory
// 创建容器
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("application.xml"));
// 获取 bean
MailService mailService = factory.getBean(MailService.class);
BeanFactory
和ApplicationContext
的区别在于,BeanFactory
的实现是按需创建,即第一次获取Bean时才创建这个Bean,而ApplicationContext
会一次性创建所有的Bean。实际上,ApplicationContext
接口是从BeanFactory
接口继承而来的,并且,ApplicationContext
提供了一些额外的功能,包括国际化支持、事件和通知机制等