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

来自姬鸿昌的知识库
跳到导航 跳到搜索
第35行: 第35行:
 
<syntaxhighlight lang="java">
 
<syntaxhighlight lang="java">
 
public class LogFactoryImpl extends LogFactory {
 
public class LogFactoryImpl extends LogFactory {
……
+
    ……
 
     private static final String LOGGING_IMPL_LOG4J_LOGGER = "org.apache.commons.logging.impl.Log4JLogger";
 
     private static final String LOGGING_IMPL_LOG4J_LOGGER = "org.apache.commons.logging.impl.Log4JLogger";
……
+
    ……
 
     private static final String[] classesToDiscover = {
 
     private static final String[] classesToDiscover = {
 
             LOGGING_IMPL_LOG4J_LOGGER,
 
             LOGGING_IMPL_LOG4J_LOGGER,
第44行: 第44行:
 
             "org.apache.commons.logging.impl.SimpleLog"
 
             "org.apache.commons.logging.impl.SimpleLog"
 
     };
 
     };
……
+
    ……
 
     public Log getInstance(Class clazz) throws LogConfigurationException {
 
     public Log getInstance(Class clazz) throws LogConfigurationException {
 
         return getInstance(clazz.getName());
 
         return getInstance(clazz.getName());

2023年2月26日 (日) 04:35的版本

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);
        }
        ……

    }
    ……
}