版权声明:本文为博主原创文章,请尊重劳动成果,转载注明一下出处。 https://blog.csdn.net/zq1994520/article/details/78991503
场景再现:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<slf4j-log4j-version>2.9.1</slf4j-log4j-version>
</properties>
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${slf4j-log4j-version}</version>
<scope>test</scope>
</dependency>
</dependencies>
知识点目录:
1、jdk使用方面:
java.util.Properties类, //用于加载.properties文件内容
java.net.URL类 //用户保存文件路径。
java.security包内容 //用于安全控制,现在已经看到使用AccessController
java.util.ServiceLoader //用户在加载一个接口获取一个类的所有实现类,通过扫描META-INF/services 下 全名称文件记录实现的类全名称。比如log4j-api.jar下org.apache.logging.log4j.spi.Provider对应log4j-core.jar下实现org.apache.logging.log4j.core.impl.Log4jProvider。
2、设计模式方面:
多次使用 Singleton 模式: 实现方式多少通过static方式,有些是通过懒加载模式一次检查实现。
另外比较slf4j-api跟log4j-api两种方式比较(重要):
log4j-api**通过java.util.ServiceLoader找到接口实现的类**,详细过程看上面java.util.ServiceLoader介绍。
slf4j-api通过实现LoggerFactoryBinder接口里面方法,通过接口里面getLoggerFactory方法获取日志工厂, 并且实现LoggerFactoryBinder接口的类所在的包必须在org.slf4j.impl包下,并且类名称必须是StaticLoggerBinder,因为slf4j直接通过import org.slf4j.impl.StaticLoggerBinder;这个引入LoggerFactoryBinder接口的实现,没有通过工厂类寻找LoggerFactoryBinder接口的实现,这样代替了通过META-INF/services指定实现类的包路径。
针对两种方式,本人觉得slf4j更加艺术,因为软件设计范式“约定优于配置”。
申明:
本文原创,转载请注明出处,谢谢。