- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在学习 Java,我发现有许多标准化的功能:
让我们以 Sl4j 为例:要将其与 log4j 一起正确使用,我们必须导入 sl4j api、sl4j/log4j 桥和 log4j 实现。
问题:在我的类里面,我只与 Slf4j API 进行通信。
我的应用程序如何知道 log4j 实现?有人可以解释幕后发生的事情吗?
问候
最佳答案
OP 提出了一个关于在某些不同情况下如何注入(inject)实现的一般性问题。
如许多答案所述,SLF4J
提供接口(interface),log4j-slf4j
提供实现。
当您使用以下语句时:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
private static final Logger LOG = LoggerFactory.getLogger(FooBarClass.class);
...
LOG.debug("Foobar");
这就是正在发生的事情:
我们尝试从 LoggerFactory
class 中声明的 getLogger
方法获取 Logger
:
public static ILoggerFactory getILoggerFactory() {
if (INITIALIZATION_STATE == UNINITIALIZED) {
synchronized (LoggerFactory.class) {
if (INITIALIZATION_STATE == UNINITIALIZED) {
INITIALIZATION_STATE = ONGOING_INITIALIZATION;
performInitialization();
}
}
}
switch (INITIALIZATION_STATE) {
case SUCCESSFUL_INITIALIZATION:
return StaticLoggerBinder.getSingleton().getLoggerFactory();
}
...
}
所以魔法就发生在那个语句上:
return StaticLoggerBinder.getSingleton().getLoggerFactory();
因为类路径知道你实现的原因,StaticLoggerBinder
实现 is provided by log4j
.我们可以注意到,log4j
提供了自己的实现:
private final ILoggerFactory loggerFactory;
...
private StaticLoggerBinder() {
loggerFactory = new Log4jLoggerFactory();
}
就是这样!
对于 JPA/Hibernate 部分,您必须包含 hibernate-jpa-api
和 hibernate-*
(core、entitymanager 等)。
假设您要创建一个 EntityManagerFactory
:
import javax.persitence.EntityManagerFactory
import javax.persitence.Persistence;
...
private static EntityManagerFactory EMF = Peristence.createEntityManagerFactory("foobar", null);
至于 List
和 ArrayList
,由于您导入的 JAR,您的类路径中包含接口(interface)和实现。
EntityManagerFactory
来自 hibernate-jpa-api
我们有一个 Persistence
class .我们可以注意到 createEntityManagerFactory
方法首先列出了所有的 providers 并且对于其中的每一个,都会触发一个 createEntityManagerFactory
。这就是 hibernate
出现的地方。它提供了一个 HibernatePersistenceProvider
implements the PersistenceProvider
class .
这就是 Hibernate
的注入(inject)方式。
关于java - SLF4J/JPA/JAX-RS 如何找到它们的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42186919/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!