JNDI Lookup vs. CDI-инъекция
Замените хрупкие JNDI-поиски по строкам на типобезопасную CDI-инъекцию для управляемых контейнером ресурсов.
public class OrderService {
private DataSource ds;
public void init() throws NamingException {
InitialContext ctx = new InitialContext();
ds = (DataSource) ctx.lookup(
"java:comp/env/jdbc/OrderDB");
}
public List<Order> findAll()
throws SQLException {
try (Connection con = ds.getConnection()) {
// query orders
}
}
}
@ApplicationScoped
public class OrderService {
@Inject
@Resource(name = "jdbc/OrderDB")
DataSource ds;
public List<Order> findAll()
throws SQLException {
try (Connection con = ds.getConnection()) {
// query orders
}
}
}
Типобезопасная связка
Ошибки инъекции обнаруживаются во время развёртывания, а не во время выполнения через строковые поиски.
Никакого шаблонного кода
Устраняет создание InitialContext, JNDI-строки с именами и обработку NamingException.
Тестируемость
Зависимости — это инъецируемые поля, которые легко заменить заглушками в модульных тестах.
Широко доступно начиная с Jakarta EE 8 / Java 11
Традиционный паттерн JNDI вынуждает использовать строковые имена ресурсов, обрабатывать NamingException и управлять InitialContext. CDI-инъекция с @Inject (или @Resource для ресурсов контейнера) позволяет контейнеру автоматически связывать зависимости. Опечатки становятся ошибками компиляции, а классы легче тестировать, поскольку зависимости можно вводить напрямую.