在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
原文地址:http://langlichong.blog.51cto.com/8846944/1860570