Lookup JNDI kontra wstrzykiwanie CDI
Zastąp kruche lookupki JNDI oparte na ciągach typowo-bezpiecznym wstrzykiwaniem CDI dla zasobów zarządzanych przez kontener.
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
}
}
}
Typowo-bezpieczne łączenie
Błędy wstrzykiwania są wykrywane w czasie wdrożenia, nie w środowisku uruchomieniowym przez string lookupki.
Bez boilerplate
Eliminuje tworzenie InitialContext, ciągi nazw JNDI i obsługę NamingException.
Testowalny
Zależności to wstrzykiwane pola, łatwe do zastąpienia mockami w testach jednostkowych.
Szeroko dostępne od Jakarta EE 8 / Java 11
Tradycyjny wzorzec JNDI wymusza używanie nazw zasobów opartych na ciągach, obsługi NamingException i zarządzania InitialContext. Wstrzykiwanie CDI z @Inject (lub @Resource dla zasobów kontenera) pozwala kontenerowi automatycznie łączyć zależności. Literówki stają się błędami kompilacji, a klasy są łatwiejsze do testowania, bo zależności można wstrzykiwać bezpośrednio.