首页 > 代码库 > 服务发现 —— ServiceLoader

服务发现 —— ServiceLoader

在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




          

服务发现 —— ServiceLoader