“JCL 原理”的版本间的差异
跳到导航
跳到搜索
Jihongchang(讨论 | 贡献) (建立内容为“https://www.bilibili.com/video/BV1iJ411H74S?p=19”的新页面) |
Jihongchang(讨论 | 贡献) |
||
(未显示同一用户的4个中间版本) | |||
第1行: | 第1行: | ||
https://www.bilibili.com/video/BV1iJ411H74S?p=19 | https://www.bilibili.com/video/BV1iJ411H74S?p=19 | ||
+ | |||
+ | === 通过 LogFactory 动态加载 Log 实现类 === | ||
+ | {| class="wikitable" | ||
+ | ! colspan="7" |interface Log | ||
+ | |- | ||
+ | |Jdk13LumberjackLogger | ||
+ | |LogKitLogger | ||
+ | |SimpleLog | ||
+ | |NoOpLog | ||
+ | |Jdk14Logger | ||
+ | |AvalonLogger | ||
+ | |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);
}
……
}
……
}