JCL 原理

来自姬鸿昌的知识库
跳到导航 跳到搜索

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

    }
    ……
}