slf自动绑定实现类过程判断

按照绑定实现类的方式是基于约定原则:判断分以下几个步骤

1.LoggerFactory扫描实现类路径有几个实现类,即在org/slf4j/impl/下有几个StaticLoggerBinder.class

2.如果有多个实现类,向开发人员报告多个实现类的路径

3.如果有多个实现类,向开发人员报告真正绑定的是哪一个实现类

4.如果没有实现类,怎么办?

具体代码实现

//要扫描的文件路径

private static String STATIC_LOGGER_BINDER_PATH = "org/slf4j/impl/StaticLoggerBinder.class";

//扫描所有的StaticLoggerBinder.class路径放入到set集合

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;

}

//报告所有的实现类路径

private static void reportMultipleBindingAmbiguity(Set staticLoggerBinderPathSet) {

if (isAmbiguousStaticLoggerBinderPathSet(staticLoggerBinderPathSet)) {

Util.report("Class path contains multiple SLF4J bindings.");

Iterator iterator = staticLoggerBinderPathSet.iterator();

while (iterator.hasNext()) {

URL path = (URL) iterator.next();

Util.report("Found binding in [" + path + "]");

}

Util.report("See " + MULTIPLE_BINDINGS_URL + " for an explanation.");

}

}

//报告真正用到的实现类名称

private static void reportActualBinding(Set staticLoggerBinderPathSet) {

if (isAmbiguousStaticLoggerBinderPathSet(staticLoggerBinderPathSet)) {

Util.report("Actual binding is of type ["+StaticLoggerBinder.getSingleton().getLoggerFactoryClassStr()+"]");

}

}

//去拿到实现类的实例,因为StaticLoggerBinder类不一定存在,所以要捕获NoClassDefFoundError异常

private final static void bind() {

try {

Set staticLoggerBinderPathSet = findPossibleStaticLoggerBinderPathSet();

reportMultipleBindingAmbiguity(staticLoggerBinderPathSet);

// the next line does the binding

StaticLoggerBinder.getSingleton();

INITIALIZATION_STATE = SUCCESSFUL_INITIALIZATION;

reportActualBinding(staticLoggerBinderPathSet);

emitSubstituteLoggerWarning();

} catch (NoClassDefFoundError ncde) {

String msg = ncde.getMessage();

if (messageContainsOrgSlf4jImplStaticLoggerBinder(msg)) {

INITIALIZATION_STATE = NOP_FALLBACK_INITIALIZATION;

Util.report("Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".");

Util.report("Defaulting to no-operation (NOP) logger implementation");

Util.report("See " + NO_STATICLOGGERBINDER_URL

+ " for further details.");

} else {

failedBinding(ncde);

throw ncde;

}

} catch (java.lang.NoSuchMethodError nsme) {

String msg = nsme.getMessage();

if (msg != null && msg.indexOf("org.slf4j.impl.StaticLoggerBinder.getSingleton()") != -1) {

INITIALIZATION_STATE = FAILED_INITIALIZATION;

Util.report("slf4j-api 1.6.x (or later) is incompatible with this binding.");

Util.report("Your binding is version 1.5.5 or earlier.");

Util.report("Upgrade your binding to version 1.6.x.");

}

throw nsme;

} catch (Exception e) {

failedBinding(e);

throw new IllegalStateException("Unexpected initialization failure", e);

}

}

到此,就真正拿到实现类的实例了

slf自动绑定实现类过程判断

时间: 2024-10-17 04:33:31

slf自动绑定实现类过程判断的相关文章

slf4j自动绑定实现类原理

slf4j自动绑定实现类的方式基于约定:它要求你在实现类的包名和拿到LoggerFactory实例的文件路径必须是:org/slf4j/impl/StaticLoggerBinder.class 有了这个约定就好办了,slf4j在自己的基本类LoggerFactory里,直接调用实现类StaticLoggerBinder拿到LoggerFactory的实例 看代码:下面是我自己实现的一个:StaticLoggerBinder public class StaticLoggerBinder { p

cocos2dx lua 如何自动绑定自定义类

cococs2dx 3.13.1 + vs2013 + win10 1.首先定义C++类Student 在cocos2d-x\cocos文件夹下新建一个user_define的文件夹放置两个文件. 注意:这个类没有从Ref继承,是一个简单的C++类. ①头文件Student.h 1 #pragma once 2 3 #include "base/ccMacros.h" 4 #include <iostream> 5 #include <string> 6 7 /

cocos2dx lua 绑定之二:手动绑定自定义类中的函数

cococs2dx 3.13.1 + vs2013 + win10 1.首先按照<cocos2dx lua 绑定之一:自动绑定自定义类>绑定Student类 2.在Student类中增加一个用于测试手动绑定的函数manual_call ①Student.h中增加函数 //手动绑定调用函数 void manual_call(); ②Student.cpp中增加函数实现 //和自动绑定相比,只增加了这个函数 void Student::manual_call() { std::cout <&

基于jquery的表格动态创建,自动绑定,自动获取值

最近刚加入GUT项目,学习了很多其他同事写的代码,感觉受益匪浅. 在GUT项目中,经常会碰到这样一个问题:动态生成表格,包括从数据库中读取数据,并绑定在表格中,以及从在页面上通过jQuery新增删除表格.如下所示: 在实现过程中,开发人员经常采用如下方式来实现: 1)          在前台,通过js生成表格行的html字符串,然后通过jquery的after方法加到表格底部. 2)          在后台,读取数据库,然后生成表格的html字符串,然后传递给前台渲染 3)         

自己手写的自动完成js类

在web开发中,为了提高用户体验,会经常用到输入框的自动完成功能,不仅帮助用户进行快速输入,最重要的是帮助那些“记不全要输入什么”的用户进行选择.这个功能有很多插件已经实现了,为了适应项目的特殊需求,决定自己编写一个具备通用性.扩展性和灵活性的自动完成类,就当是边写边学习了,一举两得.该功能是比较简单的,核心是数据获取方式和导航的实现,简单写了一个,经测试非常好用,还有很多地方需要修改和改进,例如:在原型中只暴露init方法即可,其他方法都需要放到私有空间内,不让用户访问到,这个以后再完善吧.啥

python24 面向对象的绑定方法 类与类之间的继承

## 类属性与对象属性 类中应该仅存储所有对象共有的内容 ? 如所有人的国籍相同那就放到类中 对象中存储每个对象独有的内容 ? 如每个人的名字都不同 ## __init__方法的作用 init 是初始化的缩写 用于为对象的属性设置初始值 特点: ```# 执行时机:当实例化产生对象时会自动执行该函数# 会自动传入需要初始化的对象# 初始化必须包含至少一个参数 用于表示对象本身# 该函数不允许有返回值 必须为None``` ## 绑定方法 绑定即两个东西绑在一起 方法就是函数 那就是说绑定方法 =

ANTLR和StringTemplate实例:自动生成单元测试类

ANTLR和StringTemplate实例:自动生成单元测试类 1. ANTLR语法 要想自动生成单元测试,首先第一步就是分析被测试类.这里以Java代码为例,用ANTLR对Java代码进行分析.要想靠自己完全手写出一门语言的ANTLR语法文件的复杂程度难以想象,很贴心的是在ANTLR的GitHub网站上列出了很多常见语言的语法文件,例如Java,Sqlite和MySQL的SQL语法等. 有了.g4语法文件,按照Antlr v4入门教程和实例中的步骤,就能自动生成出解析器的代码,这里就不再详述

WPF——传实体类及绑定实体类属性

public class User: private string _User; public string User1 { get { return _User; } set { _User = value; } } private string _Password; public string Password { get { return _Password; } set { _Password = value; } } } } User u; private void Button_Cl

asp.netMVC中的自动绑定模型测试小结

很久没有自己测试测试一些东西了,今天特意测试了一下MVC中自动绑定模型.本人也是小菜,希望能帮助到小小菜....嘿嘿 1.首先,创建一个MVC4的项目 2.创建一个Controller(控制器),有些小小菜肯定也知道Home是路由里默认的. 3.控制器都有了,默认会有个Index动作方法,我们只需要在拷贝一个接受Post请求的action即可 public ActionResult Index() { return View(); } [HttpPost] //视图中加的是实体类中的属性名对应