JNDI Arama ile CDI Enjeksiyonu Karşılaştırması
Kırılgan JNDI dize aramalarını, kapsayıcı tarafından yönetilen kaynaklar için tür-güvenli CDI enjeksiyonuyla değiştirin.
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
}
}
}
Tür-güvenli bağlama
Enjeksiyon hataları, dize aramaları yerine dağıtım zamanında yakalanır.
Şablon kod yok
InitialContext oluşturma, JNDI ad dizeleri ve NamingException işlemeyi ortadan kaldırır.
Test edilebilir
Bağımlılıklar enjekte edilmiş alanlardır; birim testlerinde mock'larla kolayca değiştirilebilir.
Jakarta EE 8 / Java 11'den itibaren geniş çapta kullanılabilir
Geleneksel JNDI deseni, dize tabanlı kaynak adları kullanmayı, NamingException'ı işlemeyi ve bir InitialContext yönetmeyi zorlar. @Inject (veya kapsayıcı kaynakları için @Resource) ile CDI enjeksiyonu, kapsayıcının bağımlılıkları otomatik olarak bağlamasını sağlar. Yazım hataları derleme zamanı hatalarına dönüşür ve sınıflar, bağımlılıklar doğrudan enjekte edilebildiğinden test edilmesi daha kolaydır.