<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>SPI - 标签 - Victor's Code Journey</title><link>http://www.victorchu.info/tags/spi/</link><description>SPI - 标签 - Victor's Code Journey</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><managingEditor>victorchu0610@outlook.com (victorchutian)</managingEditor><webMaster>victorchu0610@outlook.com (victorchutian)</webMaster><lastBuildDate>Wed, 15 Mar 2017 22:29:25 +0800</lastBuildDate><atom:link href="http://www.victorchu.info/tags/spi/" rel="self" type="application/rss+xml"/><item><title>Java SPI 机制</title><link>http://www.victorchu.info/posts/2017/03/45c4719c/</link><pubDate>Wed, 15 Mar 2017 22:29:25 +0800</pubDate><author><name>victorchutian</name></author><guid>http://www.victorchu.info/posts/2017/03/45c4719c/</guid><description><![CDATA[<div class="featured-image">
                <img src="/feature-images/java.webp" referrerpolicy="no-referrer">
            </div><p>先描述下API（Application Programming Interface ）。在java中，我们使用java提供的很多类、类的方法、数据结构来编写我们的应用程序，最终完成我们需求的程序功能，这里的类、方法、数据结构即是jdk提供的api。api的意义，其实就是这些提供给你完成某项功能的类、接口或者方法。</p>
<p>而SPI（Service Provider Interface）是指一些提供给你<strong>继承、扩展，完成自定义功能</strong>的类、接口或者方法。我们系统里抽象的各个模块，往往有很多不同的实现方案，比如日志模块的方案，xml解析模块、jdbc模块的方案等。面向的对象的设计里，我们一般推荐模块之间基于接口编程，模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类，就违反了可拔插的原则，如果需要替换一种实现，就需要修改代码。为了实现在模块装配的时候能不在程序里动态指明，这就需要一种服务发现机制。</p>
<p>java spi就是提供这样的一个机制：为某个接口寻找服务实现的机制。有点类似IOC的思想，就是将装配的控制权移到程序之外，在模块化设计中这个机制尤其重要。</p>]]></description></item></channel></rss>