读书笔记-《Spring技术内幕》-计文柯(一):IoC容器的实现
来源:互联网 发布:js点击radio触发事件 编辑:程序博客网 时间:2024/05/08 02:34
一、IoC容器是什么——对IoC、DI的理解。
IoC:Inverse of control,控制反转。在没有使用任何工具时,我们常常通过new这个关键字来获得对象。这样的方式在当系统中类层次关系复杂,依赖众多时就非常不妥了。
DI:Dependency Inversion,依赖注入。即在我们的系统中所有出现的依赖关系,都放在xml里,并且在用户第一次索要bean(调用getBean方法)时来 生成/注入这个依赖关系。
例如在教学信息管理系统中,我们修改了Teacher类的属性,那么就得修改其构造方法,之后在依赖它的Student类中就也必须对new Teacher中构造参数部分进行修改。单人开发还好,可以自己随时改动,如果是多人开发,那么影响则更大。对此,我们采取的一个简单方法为使用工厂模式。让TeacherFactory向我们提供Teacher,而不是new一个Teacher,这个理念就是控制反转IoC了——即依赖对象的获得被反转了。同时,当我们使用工厂模式时,实际上只是一定程度的缓解了问题,我们依然是需要修改代码的,只是要修改的部分从Student变成了TeacherFactory。IoC容器则彻底把这些依赖部分放在了xml里,作出改动时再也不去改java代码,而是修改xml配置文件,可以把IoC容器堪称一个更强大的工厂。(理解图如下)
图1.1 理解IoC图
二、IoC容器BeanFactory、ApplicationContext的异同
BeanFactory:定义了IoC容器最基本的形态,提供了IoC容器应该遵守的服务契约。
ApplicationContext:IoC容器的高级形态,除了应该有的基本IoC功能外还支持应用事件,不同信息源等高级特性。
简单的理解:BeanFactory就像人,ApplicationContext像大学生。大学生实现了人的接口,拥有人应该有的吃喝玩乐生老病死等基本方法,同时大学生又从大学那边实现了做毕业设计等高级方法。
图2.1 IoC容器接口设计图
三、IoC容器的初始化
BeanDefinition:就是POJO类在IoC容器的抽象,我们定义的POJO是一个个普通的java类,当IoC容器通过特定的步骤将其载入到容器中后,这些java类就成了容器内部的数据结构,让容器可以轻松的使用和管理它们(底层是通过维护一个HashMap)。
首先看看如何函数式的使用IoC容器
ClassPathResource res = new ClassPathResource("beans.xml");DefaultListableBeanFactory factory = new DefaultListableBeanFactory();XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);reader.loadBeanDefinitions(res);
可以看到,IoC容器的初始化过程:Resource定位、BeanDefinition的载入、IoC容器注册BeanDefinition
用打水的理解的话为:找到水源、把水打上来、把水装到各容器并贴好标签。
这里就只给出初始化过程中的方法调用栈,具体的代码大家可以通过看书、搜索、IDE里查看源代码等方式了解。
图3.1 资源定位时序图
图3.1 BeanDefinition载入时序图
图3.3BeanDefinition注册时序图
四、依赖注入
依赖注入的含义在第一部分已经给出,这里给出时序图即可。
五、总结
在阅读这本书之前,对于Spring IoC部分仅仅有一点朦胧的了解,确切一点说是会用,但是往下了问一问三不知。读了书之后大概对IoC的初始化,BeanFactory ApplicationContext BeanDifinition有了了解,虽然谈不上有多深,源代码解析部分也只是过了一遍,但现在在使用Spring以及见到一些注解、Exception等时常会有一种恍然大悟的反应——原来这个就是书中说的XXX。我认为这样的理解程度刚刚好,最多也就是再熟悉一点,没有必要去把Spring下面所有类接口设计图和每个类的方法属性都背下来,因为框架始终是工具,总有更换的一天,但了解了它的设计思想,实现原理,那么面对新的框架就游刃有余了。
(转载请申明原地址)
- 读书笔记-《Spring技术内幕》-计文柯(一):IoC容器的实现
- Spring技术核心内幕 读书笔记--IOC容器的实现小结
- Spring技术内幕(一):IOC容器
- Spring技术内幕——Spring Framework的IOC容器实现(一)
- Spring技术内幕笔记 -- IoC容器的实现
- 《Spring技术内幕》笔记-第二章 IoC容器的实现
- spring技术内幕之IoC容器的实现
- Spring技术内幕——IoC容器的实现
- 《spring技术内幕》学习(二)ioc容器实现
- Spring技术内幕——Spring Framework的IOC容器实现(二)
- Spring技术内幕——Spring Framework的IOC容器实现(三)
- Spring技术内幕——Spring Framework的IOC容器实现(四)
- Spring技术内幕——Spring Framework的IOC容器实现(五)(大结局)
- Spring技术内幕之IOC容器的实现(01)-IOC容器初始化过程
- spring技术内幕读书笔记--IOC
- 读书笔记-《Spring技术内幕》-计文柯(二):AOP的实现
- Spring技术内幕2Spring Framework的核心:IoC容器的实现
- Spring技术内幕之IOC容器的实现(02)-BeanDefinition的Resource定位
- 一个测试任务并发执行时间的方法
- Java8中的forEach方法详解
- 使用feign调用restful服务
- 什么是java的反射
- Unity Input
- 读书笔记-《Spring技术内幕》-计文柯(一):IoC容器的实现
- epoll 水平触发 边沿触发
- 单列设计模式
- 2.wireshark 入门
- zabbix 监控 windows下Mysql
- Linux 安装Gradle
- Nginx+Tomcat搭建高性能负载均衡集群
- 五种应该避免的代码注释
- 三子棋小游戏