IOC容器
Spring IOC容器基本原理
2.2.1 IOC容器的概念
IOC容器是具有依赖注入功能的容器,负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需直接在代码中new
相关的对象,而是由IOC容器进行组装。在Spring中,BeanFactory
是IOC容器的实际代表者。
Spring IOC容器通过读取配置文件中的配置元数据来管理对象。配置元数据可以通过XML文件、注解、基于Java文件的配置或基于属性文件的配置来定义。
2.2.2 Bean的概念
由IOC容器管理的应用程序对象称为Bean
。Bean是由Spring容器初始化、装配及管理的对象。IOC容器通过配置元数据(由BeanDefinition
代表)来确定如何实例化Bean、管理Bean之间的依赖关系以及管理Bean。
2.2.3 开始Spring Hello World之旅
1. 准备需要的jar包
核心jar包:
org.springframework.asm-3.0.5.RELEASE.jar
org.springframework.core-3.0.5.RELEASE.jar
org.springframework.beans-3.0.5.RELEASE.jar
org.springframework.context-3.0.5.RELEASE.jar
org.springframework.expression-3.0.5.RELEASE.jar
依赖的jar包:
com.springsource.org.apache.log4j-1.2.15.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.apache.commons.collections-3.2.1.jar
2. 创建标准Java工程
3. 开发接口
1 | package com.ljq.test; |
4. 实现接口
1 | package com.ljq.test; |
5. 配置文件helloworld.xml
1 |
|
6. 获取IOC容器并调用Bean
1 | package com.ljq.test; |
2.2.4 详解IOC容器
在Spring中,BeanFactory
接口提供了IOC容器的最基本功能,而ApplicationContext
接口扩展了BeanFactory
,提供了更多企业级功能支持,如AOP集成、国际化处理、事件传播等。
容器实现一览
XmlBeanFactory:提供基本的IOC容器功能,可以从classpath或文件系统获取资源。
1
2Resource resource = new ClassPathResource("classpath.xml");
BeanFactory beanFactory = new XmlBeanFactory(resource);ClassPathXmlApplicationContext:从classpath获取配置文件。
1
BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath.xml");
FileSystemXmlApplicationContext:从文件系统获取配置文件。
1
BeanFactory beanFactory = new FileSystemXmlApplicationContext("fileSystemConfig.xml");
ApplicationContext接口获取Bean的方法
Object getBean(String name)
:根据名称返回一个Bean,客户端需要自己进行类型转换。<T> T getBean(String name, Class<T> requiredType)
:根据名称和指定的类型返回一个Bean,客户端无需自己进行类型转换。<T> T getBean(Class<T> requiredType)
:根据指定的类型返回一个Bean,客户端无需自己进行类型转换。Map<String, T> getBeansOfType(Class<T> type)
:根据指定的类型返回一个键值为名字和值为Bean对象的Map。
IOC容器的工作流程
- 准备配置文件:在配置文件中声明Bean定义,配置元数据。
- 解析元数据:IOC容器的Bean Reader读取并解析配置文件,生成
BeanDefinition
对象。 - 实例化IOC容器:客户端实例化容器,获取需要的Bean。
2.2.5 小结
- 非入侵性:除了测试程序的代码外,所有代码都没有出现Spring任何组件,能够非常容易地替换掉Spring。
- 低耦合:客户端代码完全面向接口编程,无需知道实现类,可以通过修改配置文件来更换接口实现。
- 易测试:在开发初期没有真正的实现时,可以模拟一个实现来测试,不耦合代码。
- 易重用:Bean之间几乎没有依赖关系,易于重用。
链接
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 零の領域!