架构师必知必会:Java内置的控制反转机制-Service Provider

本文介绍了Java内置的控制反转机制——Service Provider,详细阐述了其标准、服务加载机制和服务使用者。通过示例解释了如何扩展JDK服务,如ScriptEngine,展示了ServiceLoader在加载服务提供者实例的过程,并探讨了Servlet3.0、logback和Spring框架如何利用此机制。
摘要由CSDN通过智能技术生成

前言

Java统治服务器编程领域多年还未有退位趋势,以IoC(控制反转)思想为核心的Spring功不可没。大多数时候,我们都可以使用Spring框架来实现我们的依赖注入,但仍有很多场景,我们期望自己的代码有更少的依赖、适应更多的场景,比如跨Android和服务端、跨JVM语言的组件拼装。

其实从Java6开始已经提供了一套依赖注入标准“Service Provider”和相应的工具”ServiceLoader”来实现我们自己的控制反转,且其已经广泛应用在JDK的扩展性设计之中(如:脚本引擎ScriptEngine, 字符集Charset, 文件系统FileSystems, 网络通讯NIO),并越来越多地被其它开源组件所使用(如:Web标准Servlet3.0, 通用日志接口slf4j-api:1.3),Java9进一步对“Service Provider”进行扩展实现了Java的模块化。所以”Service Provider”机制是Java越来越重要的基础知识之一。

容我带领各位,通过JDK文档和源码来一步步了解”Service Provider”,进而掌握通过Java自带能力零依赖实现自己的动态依赖注入的方法,或按Java标准来扩展JDK、日志、Http服务的能力。

“Service Provider“标准

”Service Provider”首先是作为一个标准被Javase所吸纳:

https://docs.oracle.com/javase/6/docs/technotes/guides/jar/jar.html#Service_Provider

标准中对”Service Provider”的定义可以总结为三句话:

  1. 一个”Service”(服务)就是一组知名的接口或(通常是抽象)类的集合,“Service Provider“(服务提供者)就是对服务的特定实现;
  2. 服务提供者,通过jar包中的“META-INF/services/fully-qualified.name.of.service.Interface“文件包含实现类的完全限定名,将实现类发布为提供者;
  3. 服务查找机制,通过遍历ClassPath中所有的上述文件内容,来查找并创建提供者的实例。

以上是”Service Provider”标准中最重要的三点,请大家务必完全理解并牢记于心,标准中还有其它一些限制条件,只需了解以便问题的快速定位,如:

  1. 提供者必须包含无参构造函数,以便服务查找机制可以通过反射创建其实例;
  2. 提供者发布文件中,可以通过”#”开头定义注释行;
  3. 提供者发布文件中,可以通过换行来分隔多个实现类;
  4. 须在安全上下文中调用服务查找者…

服务加载机制

JDK中内置了“Service Provider“加载工具类”ServiceLoader”,通过静态方法”ServiceLoader.load()”方法&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值