IoC(Inversion Control)控制反转:所谓控制反转,就是把我们代码中需要 new 的对象,交给容器进行管理。
DI(Dependency Injection):依赖注入,就是指,被动接收依赖类,而不是自己创建依赖。也就是说从容器中查找依赖的类,并赋值/注入。
接下来我们如果自己设计一个IoC容器完成DI功能,那么我们应该怎么考虑呢?
如果A对象依赖B对象,因为现在不允许手动创建对象,那么我们如何完成A、B两个类的功能呢?
我们可以使用 XML、Properties等配置文件进行表示。
classPath、network、filesystem、ServletContext。。。。
在内部需要一个统一的对象定义,将所有外部的配置转化为内部的定义
针对与不同的配置文件,采用不同的解析器,使用策略模式进行加载。
使用反射+工厂模式创建对象
Resource体系:对一切资源的抽象,如不同的资源采用不同的加载策略
BeanDefition体系:用来描述Spring中的Bean对象
BeandefinitionReader:它能够读取Spring配置文件的内容,并转换为BeanDefition
BeanFactory体系:内部维护着一个BeanDefition Map,它能根据 BeanDefition,对Bean进行创建和管理
ApplicationContext体系:这个就是Spring 容器,它继承自 BeanFactory 并扩展了 BeanFactory的功能。
我们下面对着五大体系进行简要说明
Resource
接口位于 org.springframework.core.io
包下。它是对资源的抽象,它的每一个类都代表了一种资源的访问策略。
主要常用的有如下:
ClassPathResource:类文件资源
FileSystemResource:文件系统资源
UrlResource:url资源
ByteArrayResource:字节数组资源
ServletContextResource:访问相对于ServletContext路径下的资源的实现类,如JSP
InputStreamResource:输入流资源
有了统一的资源抽象,那就就应该有资源加载,Spring 利用org.springframework.core.io
包下的 ResourceLoader
类文件加载器
系统文件加载器
Ant风格的路径匹配加载器(类似于 **/*.xml)。
BeanDefinition
位于 org.springframework.beans.factory.config
包下,用来描述 Spring 中的 bean的元信息。
BeanDefinitionReader
位于 org.springframework.beans.factory.support
包下,它是用来读取配置文件、注解,并将其转化为IoC内部的数据结构: BeanDefinition
BeanFactory
位于 org.springframework.beans.factory
包下,是一个纯粹的bean容器
,它是Ioc必备的数据结构。其中 beanFactroy
内部维护着一个 BeanDefinition
类型的Map,并根据 BeanDefinition
进行 bean
的创建和管理.
BeanFactory 有三个直接子类
ListableBeanFactory、
HierarchicalBeanFactory
AutowireCapableBeanFactory
DefaultListableBeanFactory 为最终默认实现,它实现了所有接口。
ApplicationContext 位于 org.springframework.context
包中,它就是 Spring
容器,它叫做应用上下文。它继承了以下接口来提供服务。
继承 BeanFactory
接口,提供Bean创建以及管理等功能。
继承 MessageSource
接口,提供了国际化标准访问策略
继承 ApplicationEventPublisher
接口,提供事件机制。
扩展 ResourLoader
可以用来加载各种资源。
对Web的支持
上面五个体系是 Spring 最核心的部分。
我们可以这样理解:
ResourceLoader
与 BeanDefinitionReader
将资源加载为 Resource
BeanFactory
解析 beanDefinition
并实例化并存储到一个Map中,然后将实例注入到需要这些实例的地方。
而 ApplicationContext
就是实现以上功能的那个类。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。