在java开发中,有一些这样的场景:
项目中加入了某些jar包,编译时也没有错,但运行时就报错了,
找不到类——这其实就涉及到java中面向接口编程。
大家都知道面向接口开发有很多好处,特别是在java中要实现回调这样的功能,
你还必须使用接口。面向接口开发中涉及两个要部分:接口(定义)和接口的实现,
在有些情况下,接口的定义与实现并不在同一个项目中,或者接口定义方跟实现方式分属不同组织,
这时候我们要使用这一类接口所拥有的功能时,就需要加入两部分依赖:接口定义部分jar包及
该接口的实现jar包,这就是开始提出问题的答案。
其实java开发中这样的场景比较多:JDBC、JPA、JMS、WebSocket等都是接口定义方与实现方分离,
不属于同一个组织,java方一般都是规范的定义者。
开发中经常遇到这样的事,但是你有没有问过自己:定义接口的jar包与实现jar包加入项目后,
java在运行时是如何将二者关联起来的,他怎么知道谁是谁的实现呢?
有人可能说这还不简单,直接将所有项目jar包扫描一遍不就知道了!?
没错,这办法行得通,但是想想都觉得麻烦,效率不高,其实java研发者在1.6的时候就加入了
一个实现这种需求的类——ServiceLoader,这就是服务发现功能。
服务发现功能约定:
1、服务实现方必须在自己提供的jar包中的META-INF目录下放置一个目录,
名字就叫services
2、在services目录下放置服务接口类与实现类的关系文件,该文件要求:
a、文件的名字是被实现的接口的全路径名(如:a.b.c.IHeHe),文件没有后缀,
每个文件代表一个接口。
b、文件内容是该文件名字所代表的接口的实现类的全路径名
(如:x.y.x.HaHa ,HaHa实现了IHeHe接口),
如果该接口有多个实现类,则每个实现类占一行。
这里给一个小的demo,借用一下网友的例子:
http://blog.csdn.net/is_zhoufeng/article/details/50722440
转载于:https://blog.51cto.com/langlichong/1860570