• 中文
    • English
  • 注册
  • 查看作者
  • Spring Boot「19」WebApplicationInitializer源码分析

    01- 源码分析

    是javax.servlet-api-*.jar中定义的接口,在web容器启动时为提供给第三方组件机会做一些初始化的工作。使用的就是Java SPI机制,详细信息在下面的章节中介绍。例如,Tomcat遵循了Java SPI自己实现了一套服务发现机制 。

    方法中,使用WebappServiceLoader加载SPI 的所有实现。

    由spring-web-5.1.5.RELEASE.jar提供,该包的**/META-INFO/services**目录下提供了对SPI 的实现 ,并且标注其处理的类是 。

    当我们在应用中实现 接口,并实现其中的方法 方法,就会在 被调用时,逐个调用

    02-SPI机制

    SPI(Service Provider Interface)是Java 6引入的一种发现和加载特定接口实现的特性。它由四部分组成:

    1. Service,一组接口或类,提供特定的功能或特性;

    2. SPI,一个接口或抽象类,作为1.中服务的代理或接入点;

    3. Service Provider,2.中SPI的特定实现;一般配置在 /META-INF/services/ 文件夹下以SPI全量名为文件名,文件内容为服务提供者,即具体的特定实现。

    4. ServiceLoader, ,SPI机制的核心,用来发现并加载Service Provider;

    注:1和2组成了Java生态系统中常被提到的API。

    02.1- 示例

    完整代码参考 。

    java.sql.Driver是SPI, 是两个不同的Service Provider,所以在jar包中的**/META-INF/services/java.sql.Driver**中包含对应的具体实现类。

    02.2-源码分析

    java.sql.DriverManager中有一个静态代码块,当该类初始化时会被调用。

    继续追踪 方法的实现可以发现,该方法中包含了与上节示例中类似的代码:

    执行完毕后,发现类路径下的两个实现类都被加载到JVM中。

    Spring Boot「19」WebApplicationInitializer源码分析

    [1] [2] [3] [4]

  • 0
  • 0
  • 0
  • 13
  • 请登录之后再进行评论

    登录
  • 任务
  • 实时动态
  • 发布
  • 单栏布局 侧栏位置: