• DriverManager怎样查找当前Driver


    记得刚学jdbc的时候,总有这么一条语句:

    Class.forName("com.mysql.jdbc.Driver");

    DriverManager.getConnection(url,name,password);


    第一条语句是向DriverManager注册jdbc驱动,在加载Driver类时会执行里面的如下静态代码块:

    static {

    try {

    java.sql.DriverManager.registerDriver(
    new Driver());


    }
    catch (SQLException E) {

    throw new RuntimeException("Can't register driver!");

    }



    }


    但 是现在我们一般不用这条Class.forName语句了,之前我一直理所当然的认为能够这样做也不难,只要我们扫描CLASSPATH并判断哪些类 instanceof java.sql.Driver成立就可以了。可是再一想,如果依次扫描CLASSPATH并进行加载判断这个流程的话,显示是很SB的一种做法,应该会 很快OutOfMemoryError: PermGen space,呵呵。你说vm要load多少class meta信息。然后看了下jdk源码,并找了jar specification(http://download.oracle.com/javase/6/docs/technotes/guides/jar/jar.html#Service%20Provider),真相大白。

    下面我就讲一下是怎么做到的。

    假如现在有一个需求:我们向客户(也是开发)提供一个核心服务jar包,里面包括一个服务接口定义,如下:
    package study.mybatis.jar;

    public interface MyService {

    public void doService();

    }


    客户端调用我们接口的代码如下:

    Iterator itor = sun.misc.Service.providers(study.mybatis.jar.MyService.class);

    while(itor.hasNext()){

    Object obj
    = itor.next();

    if(obj instanceof MyService){

    ((MyService) obj).doService();

    break;

    }

    }


    客户不必关注我们具体的实现类,他只用Service.provider(类口的Class对象)方法就可以取到我们提供的具体实现类。
    这 又是怎么做到的呢,这段代码怎么知道实例化那个MySerive接口的实现类?我们在生成jar包文件时只要在META-INF文件目录下创建一个名为 services的子文件目录,在services子目录里创建一个文本文件,名称为要提供的服务接口的全限定名, 如:study,mybatis.jar.MySerivce,里面写上一行你的实现类的名称,包括包名,如:
    study.mybatis.jar.MyServiceImpl

    现在整个jar包的结构如下

  • 相关阅读:
    Hive之安装
    python3常用内置方法(持续更新中。。。)
    CentOS7下安装Python3及Pip3并保留Python2
    一个爬取52破解的全部帖子地址的简单爬虫
    在windows写入文件中遇到 UnicodeEncodeError: ‘gbk’ codec can’t encode character 错误的解决办法
    我的vim配置
    树莓派命令行模式调整音量
    树莓派更改软件源
    linux连接wifi
    给树莓派挂载移动硬盘或U盘
  • 原文地址:https://www.cnblogs.com/jcli/p/2132211.html
Copyright © 2020-2023  润新知