快递100 是专业的快递物流互联网平台,为数以亿计的用户提供快递物流的查、寄件服务。快递100 的各种服务已经稳定高效的运行了多年,为中国的快递物流行业的快速发展做出了很大的贡献,这一切都离不开背后默默贡献的程序猿们。
从第一个独立站点上线至今,快递100 已经走过了10个年头,10年沧海桑田,10年经历了一次又一次的技术、架构升级。近年来,由于spring-boot、spring-cloud技术的兴起,快递100 技术团队也开始对后端服务进行重构,基于spring-boot、spring-cloud技术,对原有的系统进行微服务化改造。在改造的前期,由于许多开发人员对spring系列的技术缺少系统性的认知,所以我们编辑整理了一个spring系列技术使用的手册,帮助开发人员可以快速的上手。
目录
2.4 AnnotationConfigApplicationContext
3.5.2 消除歧义(@Primary注解和@Qualifier注解)
1. Spring IoC简介
IoC是Inversion of Control的简称,中文意思为控制反转,Ioc理念是Spring框架的两个核心理念之一(另外一个是面向切面:Aspect Oriented Programing,AOP),Spring框架本质上是一个IoC容器编程的框架。
IoC的理念本身并不是Spring,甚至不是java语言的首创。对于传统的java编程方式,我们通常通过new关键字来创建对象,比如类A依赖于类B,我们会在类A中通过:B b = new B()这样的代码来创建一个类B的实例,如果类B是个接口或者抽象类,假如其有一个实现类C,则类A中创建B的实例的代码变为:B b = new C(),这导致了类A和类B的实现类C之间的耦合,即使实际上对于类A来说,可能并不关心B的具体实现方式。而基于IoC的编程则不是这样,IoC是通过描述来生成或者获取对象的技术,当类A依赖于类B时,只需要通过配置文件、注解等方式对依赖需求进行描述,就可以基于这个描述获取到一个类B的实例,类A无需关心类B的具体实现方式,也就解除了和类B具体实现类之间的耦合。
IoC技术基于描述来生成或者获取对象,这些对象都有Spring框架进行管理。此外,这些对象之间并不是孤立存在的,它们之间可能存在着各种依赖关系,如上面的例子中,类A的实例依赖于类B的实例,因此在创建类A的实例时,还需要将类B的实例设置到类A的属性中,这就是依赖注入,在Spring应用中,依赖注入的功能也是由框架提供的。
2. IoC容器
2.1 Spring IoC容器
如前面所述,Spring框架基于IoC理念提供了通过描述来创建或者获取对象的功能和依赖注入的功能,这些功能由IoC容器提供,而由容器创建的对象通常称为Bean,IoC容器实际上负责Bean的创建、销毁、管理、注入和它们之间的关系的维护。
Spring IoC容器的定义由一系列的接口组成,其顶级接口为BeanFactory。Spring IoC容器接口的类图如下:
2.2 BeanFactory接口
BeanFactory是Spring IoC容器的顶级接口,定义了IoC容器的主要方法。这些方法如下:
- getBean方法:用于从IoC容器中获取一个Bean,在BeanFactory中定义了多个getBean方法的重载,可以通过Bean的名称、类型等多种方式从容器中获取到指定的Bean
- containsBean方法:判断容器中是否包含指定名称的Bean,如果是则返回true,否则返回false
- isSingleton方法:判断指定名称的Bean的作用域是否为singleton(单例)
- isPrototype方法:判断指定名称的Bean的作用域是否为prototype(原型)
- isTypeMatch方法:判断指定名称的Bean的类型是否匹配指定的类型,此方法包含两个重载方法,分别通过ResolvableType和Class类型的参数指定匹配的类型
- getType方法:获取指定名称的Bean的类型
- getAlias方法:获取指定名称的Bean定义的别名数组
2.3 ApplicationContext接口
BeanFactory接口中定义了IoC容器的主要方法,但基本上都是集中在获取Bean或者Bean的一些基本属性方面,总体来说功能还是比较弱的,于是在BeanFactory接口的基础上,Spring框架提供了更高级、包含更多功能的IoC容器接口:ApplicationContext。
ApplicationContext接口通过继承上级接口,进而继承了BeanFactory中定义的各个方法,并在此基础上,扩展了更多的接口,因此具有更强大的功能。BeanFactory接口和ApplicationContext接口是Spring IoC容器最重要的接口设计,因为ApplicationContext接口具有更多的功能,因此我们实际上使用的IoC容器,大多数都是ApplicationContext接口的实现类。
在BeanFactory接口的基础上,ApplicationContext接口还扩展了如下的接口:
- MessageSource:提供消息国际化功能
- EnvironmentCapable:环境参数可配置化功能
- ApplicationEventPublisher:应用事件发布功能
- ResourcePatternResolver:资源模式解析功能