SPI机制
前言
- 在主键版本中没有
web.xml
文件,springmvc如何通过继承AbstractAnnotationConfigDispatcherServletInitializer来启动SpringMVC?这就需要通过SPI机制来解决。先放一下大致思路:tomcat启动时会运行实现了servlet规范ServletContainerInitializer
接口的实现类,而spring就是用SpringServletContainerInitializer
类实现了该规范,因此执行时会实例化SpringServletContainerInitializer
以达到启动mvc,另外在该类上有@HandlesTypes(WebApplicationInitializer.class)
注解来实现mvc相关配置的加载,加载实现了WebApplicationInitializer
的类
讲解代码
链接: JAVA之SPI机制
- 以下讲解均已以上代码进行分析,请自行下载
过程分析
-
java-spi
它里面定义了Phone
规范,以及默认的默认的实现类。 -
java-spi-ext
引用java-spi
的模块可以实现扩展Phone
接口规范 -
运行实现
Phone
的实现类并该类的路径在META-INF.services中配置public class ApplicationMain {
public static void main(String[] args) {
ServiceLoader serviceLoader=ServiceLoader.load(Phone.class);
serviceLoader.forEach((Phone phone)->{
if (phone instanceof DefaultPhone){
phone.call();
}if (phone instanceof IOSPhone){ phone.call(); } if (phone instanceof AndroidPhone){ phone.call(); } }); }
}
从而达到了通过运行java-spi-ext
模块来启动java-spi
模块