Java SLF4J-API类加载如何优先于绑定而不是伪绑定?

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

如果您查看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 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。虚拟活页夹被删除