ОП задает общий вопрос о том, как внедрение вводится в некоторых разных случаях.
Вход
Как насыщены во многих ответах, то SLF4J
дает интерфейс и log4j-slf4j
дает реализацию.
При использовании следующее заявление:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
private static final Logger LOG = LoggerFactory.getLogger(FooBarClass.class);
...
LOG.debug("Foobar");
Это то, что происходит:
Мы стараемся, чтобы получить Logger
от getLogger
метода, объявленного в LoggerFactory
class:
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-*
(ядро, EntityManager и т.д.).
Допустим, вы хотите создать EntityManagerFactory
:
import javax.persitence.EntityManagerFactory
import javax.persitence.Persistence;
...
private static EntityManagerFactory EMF = Peristence.createEntityManagerFactory("foobar", null);
Что касается List
и ArrayList
, ваш пути к классам подаются с интерфейсом и реализацией благодаря баночке вы импортируете.
EntityManagerFactory
происходит от hibernate-jpa-api
, где у нас есть Persistence
class. Мы можем заметить, что метод createEntityManagerFactory
сначала перечисляет всех поставщиков и для каждого из них увольняется createEntityManagerFactory
. Здесь наступает hibernate
. Он предоставляет HibernatePersistenceProvider
, что implements the PersistenceProvider
class.
Вот как вводится Hibernate
.
Вы говорите о модуле log4j-over-slf4j? – Andremoniy
В моем случае, чтобы использовать 'log4j' через' slf4j', у меня есть следующие JAR: 'slf4j-api',' log4j-core' и 'log4j-sl4j-impl' – Kevin
Возможный дубликат [Как slf4j связывается с реализация? Действительно ли это происходит во время компиляции?] (Http://stackoverflow.com/questions/17829995/how-does-slf4j-bind-to-implementation-does-it-really-do-so-during-compile-time) – sm4