师傅们,为什么 jdbc 要用 class.forName 的方式加载驱动,而不用 new 的方式?或者说为什么这些驱动设计成放在 static 中然后通过反射的方式调用,而不是像其他 Java 类那样 new 实例 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mart1nN
V2EX    Java

师傅们,为什么 jdbc 要用 class.forName 的方式加载驱动,而不用 new 的方式?或者说为什么这些驱动设计成放在 static 中然后通过反射的方式调用,而不是像其他 Java 类那样 new 实例

  •  
  •   mart1nN 2019 年 8 月 11 日 6260 次点击
    这是一个创建于 2449 天前的主题,其中的信息可能已经有所发展或是发生改变。
    14 条回复    2019-08-12 09:51:47 +08:00
    William911
        1
    William911  
       2019 年 8 月 11 日 via iPhone   1
    让 JVM 查找并动态加载类,至于为什么不直接实例化是因为 JDBC 要求需要向 DriverManager 注册 Driver,所以这个加载类的过程会完成这个事情
    misaka19000
        2
    misaka19000  
       2019 年 8 月 11 日   2
    pursuer
        3
    pursuer  
       2019 年 8 月 11 日
    如果用 new,编译的时候在 classpath 里没有驱动的类,那代码连编译都过不去。用 class.forName,即使编译的时候没有类,只要在运行的时候驱动的类在 classpath 就可以加载类。
    EscYezi
        4
    EscYezi  
       2019 年 8 月 11 日 via iPhone   4
    正巧最近看到了一篇文章
    https://mp.weixin.qq.com/s/Oduo_H_r9gJupzfivz0Q9g
    fxxwor99LVHTing
        5
    fxxwor99LVHTing  
       2019 年 8 月 11 日
    使用 jdbc4,已经不需要这样显示的加载 driver 了,驱动包(.jar 文件)里 META-INFO/services/java.sql.Driver 已经帮我们完成了。看这个类:java.util.ServiceLoader。(也就是 2 楼所说的 SPI 机制)
    justin2018
        6
    justin2018  
       2019 年 8 月 11 日
    @EscYezi 收藏了
    luozic
        7
    luozic  
       2019 年 8 月 11 日 via iPhone
    dubbo 的 spi 机制?
    luozic
        8
    luozic  
       2019 年 8 月 11 日 via iPhone
    @luozic 应该是说 dubbo 的类加载里面就有 spi 机制。 这一块看到最多的应该是 spring starter spi ?
    hhhsuan
        9
    hhhsuan  
       2019 年 8 月 11 日 via Android
    你一 new 不就跟具体的类耦合了吗? 一定要有解耦的概念。
    baiue
        10
    baiue  
       2019 年 8 月 12 日 via Android   1
    现在可以自动加载驱动,不用写 class.forName 了
    chendy
        11
    chendy  
       2019 年 8 月 12 日
    因为要动态,如果不同环境使用不同数据库,写死就完蛋了
    以及,现在已经不需要手动指定了,自动加载了
    passerbytiny
        12
    passerbytiny  
       2019 年 8 月 12 日   1
    因为出于解耦合的要求,其他 Java 类都是不让 new 的,建议搜索一些“面向接口编程”和“ Spring 的设计理念”。jdbc 可谓是最原始的面向接口编程的设计方式。
    Kontinue
        13
    Kontinue  
       2019 年 8 月 12 日   1
    你学下去就能慢慢理解,现在直接跟你讲一堆很抽象的。和前几楼说的一样,就是为了做到高内聚,松耦合。通过反射或外部配置文件注入,更灵活。JDBC、slf4j、JPA 等等,其实都是类似的。
    RangerWolf
        14
    RangerWolf  
       2019 年 8 月 12 日
    @EscYezi 不错的一个公众号 已关注
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2822 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 51ms UTC 09:07 PVG 17:07 LAX 02:07 JFK 05:07
    Do have faith in what you're doing.
    div class="sep10">
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86