“JCL 原理”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
 
(未显示同一用户的2个中间版本)
第13行: 第13行:
 
|Log4JLogger
 
|Log4JLogger
 
|}
 
|}
 +
 +
 +
 +
 +
 +
=== 动态加载 Log 实现类的核心代码 ===
 +
 +
==== JCLTest.java ====
 +
<syntaxhighlight lang="java">
 +
Log log = LogFactory.getLog(JCLTest.class);
 +
</syntaxhighlight>
 +
 +
==== LogFactory.java ====
 +
<syntaxhighlight lang="java">
 +
public abstract class LogFactory {
 +
……
 +
    public static Log getLog(Class clazz) throws LogConfigurationException {
 +
        return getFactory().getInstance(clazz);
 +
    }
 +
……
 +
}
 +
</syntaxhighlight>
 +
 +
==== LogFactoryImpl 是抽象类 LogFactory 的唯一子类 ====
 +
<syntaxhighlight lang="java">
 +
public class LogFactoryImpl extends LogFactory {
 +
    ……
 +
    private static final String LOGGING_IMPL_LOG4J_LOGGER = "org.apache.commons.logging.impl.Log4JLogger";
 +
    ……
 +
    private static final String[] classesToDiscover = {
 +
            LOGGING_IMPL_LOG4J_LOGGER,
 +
            "org.apache.commons.logging.impl.Jdk14Logger",
 +
            "org.apache.commons.logging.impl.Jdk13LumberjackLogger",
 +
            "org.apache.commons.logging.impl.SimpleLog"
 +
    };
 +
    ……
 +
    public Log getInstance(Class clazz) throws LogConfigurationException {
 +
        return getInstance(clazz.getName());
 +
    }
 +
    ……
 +
    public Log getInstance(String name) throws LogConfigurationException {
 +
        Log instance = (Log) instances.get(name);
 +
        if (instance == null) {
 +
            instance = newInstance(name);
 +
            instances.put(name, instance);
 +
        }
 +
        return instance;
 +
    }
 +
    ……
 +
    protected Log newInstance(String name) throws LogConfigurationException {
 +
        ……
 +
            if (logConstructor == null) {
 +
                instance = discoverLogImplementation(name);
 +
            }
 +
        ……
 +
    }
 +
    ……
 +
    private Log discoverLogImplementation(String logCategory)
 +
        throws LogConfigurationException {
 +
        ……
 +
        for(int i=0; i<classesToDiscover.length && result == null; ++i) {
 +
            result = createLogFromClass(classesToDiscover[i], logCategory, true);
 +
        }
 +
        ……
 +
 +
    }
 +
    ……
 +
}
 +
</syntaxhighlight>

2023年2月26日 (日) 04:42的最新版本

https://www.bilibili.com/video/BV1iJ411H74S?p=19

通过 LogFactory 动态加载 Log 实现类

interface Log
Jdk13LumberjackLogger LogKitLogger SimpleLog NoOpLog Jdk14Logger AvalonLogger Log4JLogger



动态加载 Log 实现类的核心代码

JCLTest.java

Log log = LogFactory.getLog(JCLTest.class);

LogFactory.java

public abstract class LogFactory {
……
    public static Log getLog(Class clazz) throws LogConfigurationException {
        return getFactory().getInstance(clazz);
    }
……
}

LogFactoryImpl 是抽象类 LogFactory 的唯一子类

public class LogFactoryImpl extends LogFactory {
    ……
    private static final String LOGGING_IMPL_LOG4J_LOGGER = "org.apache.commons.logging.impl.Log4JLogger";
    ……
    private static final String[] classesToDiscover = {
            LOGGING_IMPL_LOG4J_LOGGER,
            "org.apache.commons.logging.impl.Jdk14Logger",
            "org.apache.commons.logging.impl.Jdk13LumberjackLogger",
            "org.apache.commons.logging.impl.SimpleLog"
    };
    ……
    public Log getInstance(Class clazz) throws LogConfigurationException {
        return getInstance(clazz.getName());
    }
    ……
    public Log getInstance(String name) throws LogConfigurationException {
        Log instance = (Log) instances.get(name);
        if (instance == null) {
            instance = newInstance(name);
            instances.put(name, instance);
        }
        return instance;
    }
    ……
    protected Log newInstance(String name) throws LogConfigurationException {
        ……
            if (logConstructor == null) {
                instance = discoverLogImplementation(name);
            }
        ……
    }
    ……
    private Log discoverLogImplementation(String logCategory)
        throws LogConfigurationException {
        ……
        for(int i=0; i<classesToDiscover.length && result == null; ++i) {
            result = createLogFromClass(classesToDiscover[i], logCategory, true);
        }
        ……

    }
    ……
}