Enterprise Средний

Замените хрупкие JNDI-поиски по строкам на типобезопасную CDI-инъекцию для управляемых контейнером ресурсов.

✕ Java EE
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
        }
    }
}
✓ Jakarta EE 8+
@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.

🧪

Тестируемость

Зависимости — это инъецируемые поля, которые легко заменить заглушками в модульных тестах.

Старый подход
JNDI Lookup
Современный подход
CDI @Inject
Начиная с JDK
11
Сложность
Средний
JNDI Lookup vs. CDI-инъекция
Доступно

Широко доступно начиная с Jakarta EE 8 / Java 11

Традиционный паттерн JNDI вынуждает использовать строковые имена ресурсов, обрабатывать NamingException и управлять InitialContext. CDI-инъекция с @Inject (или @Resource для ресурсов контейнера) позволяет контейнеру автоматически связывать зависимости. Опечатки становятся ошибками компиляции, а классы легче тестировать, поскольку зависимости можно вводить напрямую.