slf4j作为流行的日志门面,对常用的日志库API进行了抽象,应用层仅需要调用SLF4j的API就可以完成日志打印功能,而底层日志框架,可以灵活更换,可以用log4j也可以用logback或者其他自己喜欢或者工作环境要求的特定日志库。
slf4j的api是如何实现与底层日志库的绑定呢?api绑定解决不好,则会导致大量的类与功能实现进入api层面所在的模块,并且会导致拆分不彻底。
slf4j的绑定方式有两种,从1.0.X->1.7.X版本是采用的static-binding方式,以前我们经常会遇到的应用启动报错,说存在多个绑定类,然后选择了哪个绑定实现,就是这个应用的classpath中,引入了超过一个的slf4j的日志绑定实现。
而从1.8版本开始,slf4j开始走寻常路了。使用java jdk自带的ServiceLoader机制进行SPI实现的加载。
不仅仅slf4j,对于log4j来讲,log4j自己的api层与core层之间,其最新版也是采用ServiceLoader来进行加载的。
通过合理使用ServiceLoader机制来完整的解耦API层面与具体实现包之间的关联,实现API层面的独立。
旧的slf4j静态绑定方式:
新的slf4j绑定方式: