今天开一篇章专门研究Spring框架的相关知识,希望能够由浅入深,把Spring最基础最应该掌握的知识梳理一遍。具体术语和概论我会尽量以官方文档和书籍《精通Spring4.x》为准。官网:
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-introduction
章节一 什么是控制反转IoC?
IoC(Inverse of Control)是一种设计思路,字面意思就是控制反转,其中包括两方面内容。
其一控制。这里的控制指的是对象的控制权。
其二反转。反转指的是本应该由自己生成的对象改由让第三方容器托管。
Spring中运用依赖注入DI来实现控制反转。
下面举一个例子:
需求:现在有一个用户,为了实现某个查询,他想用mysql的形式查询。
传统的模式:程序员需要在service中new一个mysqldao出来,每多一个mapper就需要多new一次。
需求:现在用户觉得mysql不好,要改成oracle的形式查询。
传统的模式:程序员需要对每个dao层都做修改,new一个oracle对象。
IoC模式:将dao的创建交个第三方容器,通过setter/构造器/接口方式将mapper注入进对象。相当于将创建对象的职能控制反转给用户,用户需要什么实现方式就用什么方式实现。
章节二 基础知识
二 、1 反射
Java语言语序程序化的方式间接对class进行操作。class文件由类装载器装载后,在JVM中将形成一份描述class结构的元信息,通过元信息可以获取构造信息,属性,方法等。
二 、2 类装载器
类装载器就是寻找类的字节码文件并构造出类在JVM内部表示对象的组建。类装载器把一个类装入JVM中需要以下下步骤:
1.装载:查找和导入class文件
2.链接:执行校验,准备和解析步骤
a) 校验:检查载入class文件正确性
b) 准备:给类的静态变量分配存储空间
c) 解析:将符号引用转换成直接引用
3.初始化:对类的静态变量、静态代码块执行初始化工作
章节三 Spring中的IoC
三、1 IoC的实现和简介
Spring通过一个配置文件描述Bean及Bean之间的依赖关系,利用Java语言的反射功能实例化Bean并建立Bean之间的依赖。
IoC容器在完成这些底层工作的基础上,还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布等...
Spring中有两种容器,BeanFactory(IOC容器) 和ApplicationContext(应用上下文),其中BeanFactory是Spring框架的基础设施,面向Spring本身,ApplicationContext面向Spring开发者。
(源自spring官网)
两种容器区别
1.应用上下文可以使用消息发布ApplicationEvent
2.Ioc容器需要显示设置BeanPostProcessor,在使用AOP的时候会用到
3.Ioc容器需要显示设置BeanFactoryPostProcessor,在初始化bean时会用到
三、2 Bean作用域
(源自spring官网)
章节四 ApplicationContext
四、1 内部工作机制
Spring的AbstractApplicationContext是ApplicationContext的抽象实现,该抽象类的refresh()方法定义了Spring容器在加载配置文件后的处理过程。
在这个方法中可以看到许多上下文容器优于IoC容器的的地方,比如事件,广播器,国际化等等。
四、2 容器事件
Spring的ApplicationContext能够发布事件并允许注册相应的事件监听器,因此他拥有一套完善的事件发布和监听机制。Spring事件运用了观察者模型。
观察者模型:
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
应用实例:如下面代码,当一个user进入代码时,同时被两个listerner观察。
Spring事件中三个重要对象:
事件类:ApplicationEvent
事件监听器接口:ApplicationListener
事件广播器:ApplicationEventPublisher
实例代码:https://github.com/Hjwjames/springevent.git
章节五 小结
好勒~SpringIoC控制反转相关的主要内容就这么多了,其他IoC相关内容这里就不再细细列出了,比如有bean的生命周期;国籍化;bean的几种注入方式xml、注解等等。