gpt4 book ai didi

java - SLF4J/JPA/JAX-RS 如何找到它们的实现?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:01:04 25 4
gpt4 key购买 nike

我正在学习 Java,我发现有许多标准化的功能:

  • 日志记录(使用 SLF4J)
  • 持久性(使用 JPA)
  • REST(使用 JAX-RS)
  • SOAP(使用 JAX-WS)
  • 等等

让我们以 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-apihibernate-*(core、entitymanager 等)。

假设您要创建一个 EntityManagerFactory:

    import javax.persitence.EntityManagerFactory
import javax.persitence.Persistence;
...
private static EntityManagerFactory EMF = Peristence.createEntityManagerFactory("foobar", null);

至于 ListArrayList,由于您导入的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com