Java SLF4J-API类加载如何优先于绑定而不是伪绑定?
如果您查看slf4j api(任何现代版本,例如1.7.5)的源代码,就会发现一个使用以下方法的Java SLF4J-API类加载如何优先于绑定而不是伪绑定?,java,classloader,slf4j,Java,Classloader,Slf4j,如果您查看slf4j api(任何现代版本,例如1.7.5)的源代码,就会发现一个使用以下方法的LoggerFactory类: private static Set findPossibleStaticLoggerBinderPathSet() { // use Set instead of list in order to deal with bug #138 // LinkedHashSet appropriate here because it preserves ins
LoggerFactory
类:
private static Set findPossibleStaticLoggerBinderPathSet() {
// use Set instead of list in order to deal with bug #138
// LinkedHashSet appropriate here because it preserves insertion order during iteration
Set staticLoggerBinderPathSet = new LinkedHashSet();
try {
ClassLoader loggerFactoryClassLoader = LoggerFactory.class
.getClassLoader();
Enumeration paths;
if (loggerFactoryClassLoader == null) {
paths = ClassLoader.getSystemResources(STATIC_LOGGER_BINDER_PATH);
} else {
paths = loggerFactoryClassLoader
.getResources(STATIC_LOGGER_BINDER_PATH);
}
while (paths.hasMoreElements()) {
URL path = (URL) paths.nextElement();
staticLoggerBinderPathSet.add(path);
}
} catch (IOException ioe) {
Util.report("Error getting resources from path", ioe);
}
return staticLoggerBinderPathSet;
}
当您调用任何Logger
方法(debug、info、warn、error等)且SLF4J绑定尚未初始化时,将调用此函数。这就是SLF4J如何确定在运行时使用哪个绑定
基本上,为SLF4J编写适当绑定的一种方法是实现自己的org.SLF4J.impl.StaticLoggerBinder
类。然而,slf4j api
JAR还附带了自己的虚拟org.slf4j.impl.StaticLoggerBinder
实现,可能是为了防止在slf4j开发过程中出现编译器错误(或者在绑定未提供此类StaticLoggerBinder
时充当无操作回退)
因此,如果在运行时类路径上有slf4j-api-1.7.5
和slf4j-simple-1.7.5
,那么第一次使用时,比如说,Logger 35; info(String)
,将在slf4j api
JAR中定义的StaticLoggerBinder
上选择slf4j simple
JAR中定义的StaticLoggerBinder
我试图理解(绑定impl而非api impl)的这种“偏好/优先级”是如何工作的。上述方法如何首先选择绑定的StaticLoggerBinder
而不是slf4j api
中提供的虚拟StaticLoggerBinder
提前谢谢 虚拟StaticLoggerBinder根本不包括在slf4j api jar文件中 请参阅slf4j api源代码中的pom.xml。虚拟活页夹被删除