什么叫做容器
先上定义:
容器就是自动完成逻辑操作的计划执行者
(╯°Д°)╯︵ /(.□ . \) 这说的是个屁啊
我们先来看看经常从哪里听到这个词
Web容器
Tomcat是一个容器
这是写Web的人经常听到的一句话,这句话全文应该是
Tomcat是一个WebServlet容器
这里整理一下思路
- 「通常情况下」你放入Tomcat的.war包,是一个基于Servlet的程序包
- 其中有一个web.xml进行了一些配置
- Tomcat会自动读取这些配置
- 并且让你的Servlet可以被访问
- Tomcat完成了把Session放入Cookie,把你的Request/Response生成Http报文等工作
现在聚焦在3-5步骤,这些操作是不是一些逻辑操作,你不需要自己手动去完成,只需要完成1-2步骤,3-5就会有Tomcat自己完成。
那么Tomcat就是3-5步骤的计划执行者
IOC容器
Spring是一个容器
这个也是写Web的人经常听到的一句话,其实如同上文一样,准确的说应该是
Spring是一个IOC容器
观察Spring的使用
- 首先你在web.xml里配置使用了Spring的contextConfigLocation
- 然后根据你的配置加载Spring配置文件,通常为applicationContext.xml
- 在applicationContext里使用Bean配置就可以让程序自动实例化某些类
- 然后使用@Service和@Autowired就可以使用这些类
- 这些类都是单例模式且实现了IOC
用过Spring的都知道其最重要的特性就是IOC(控制反转),那么在你执行了1-4之后,控制反转的第五步你好像什么都没做,但是IOC的过程是比较复杂的,参考Web框架基本流程
那么Spring就是第5步骤IOC过程的计划执行者
数据容器
「List」「Set」「Map」都是数据容器
这句话怎么解释呢?如果有C语言经验的,应该知道最关键的一个问题「如何定义可变数组」,在计算机中数组是需要长度的,因为长度决定了需要分配多少内存。但是你怎么使用数据容器呢
- 声明一个List,并new出一个ArrayList的实例
- 添加一个元素
- 删除一个元素
看上去没什么不妥?但是思考一下
元素的个数改变了,那么是不是相当于数组的长度改变了?长度改变应该也会引起内存的改变,内存改变的过程谁在做?
这就是问题所在了,在操作数据容器时,你不用关心内存怎么操作,只需要直接调用List的add函数即可。
那么List就是底层内存改变过程的计划执行者
而且根据文章List/Set/Map的区别,一个List有「LinkedList」「ArrayList」多种实现,它们都可以完成不同的底层内存变更操作,而不需要调用者关心。
总结一下
根据上文蓝色字体的总结,不同的容器都会完成一定的逻辑功能,不需要开发者关心,只需要「放入容器」就可以了,所以说容器是个宽泛的概念,只要是能按照计划的前后顺序完成一些功能都可以叫做容器。