Spring的SPI机制
在系统设计时,解耦是我们要时刻关注的一个问题,只有解耦才能实现系统的可扩展,可维护,我们熟悉的面向对象编程也好,设计模式也好,其终极目标都是为了实现高内聚低耦合。
那SPI是什么?SPI(Service Provider Interface)就是一种系统解耦的机制,SPI通过“基于接口编程”+“配置文件”来完成系统组件的动态加载,实现依赖解耦,我们知道SpringBoot所依赖的组件只需要通过maven或者gradle引进来,应用程序就可以使用其提供的功能,那这些组件中的对象实例是如何被加载到SpringBoot中的?更准确的说是,如何被加载到Spring容器中来的呢?
SpringBoot定义了一套接口规范,==这套规范规定:SpringBoot在启动时会扫描外部引用jar包中的META-INF/spring.factories文件,将文件中配置的类型信息加载到Spring容器(此处涉及到JVM类加载机制与Spring的容器知识)并执行类中定义的各种操作==。对于外部jar来说,只需要按照SpringBoot定义的标准,就能将自己的功能装置进SpringBoot。
因此,我们可以发现, SpringBoot 程序只是定义了一套加载标准,并没有具体去配置加载哪些类与接口。要加载哪些内容完全是由外部 jar 包自身决定的,类似 Spring 中 IOC 思想,将装配的控制权转移到了程序之外。这正是 SpringBoot 自动装配的核心原理 。其实,并不存在什么自动装配,而是将装配控制权,要装配哪些内容放到了 Jar 包的 spring.factories 文件中了。
如果还不理解,可以想想内存条与主板的工作机制,主板定义一套接口规范,只有是按接口规范生产的内存条都可以即插即用,至于是什么品牌,什么厂家,容量大小,主板并不需要关心。
原文: