JNDI Lookup বনাম CDI Injection
কন্টেইনার-ম্যানেজড রিসোর্সগুলোর জন্য ফ্র্যাজাইল (fragile) 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
}
}
}
টাইপ-সেফ ওয়্যারিং (Type-safe Wiring)
ইনজেকশন এররগুলো ডিপ্লয়মেন্টের সময় ধরা পড়ে, স্ট্রিং লুকআপের মাধ্যমে রানটাইমে নয়।
বয়লারপ্লেট (Boilerplate) নেই
InitialContext তৈরি, JNDI নাম স্ট্রিং এবং NamingException হ্যান্ডলিংয়ের প্রয়োজন দূর করে।
টেস্টেবল (Testable)
ডিপেন্ডেন্সিগুলো ইনজেক্টেড ফিল্ড, যা ইউনিট টেস্টে মক (mocks) দিয়ে সহজে প্রতিস্থাপন করা যায়।
জাকার্তা EE 8 / Java 11 থেকে ব্যাপকভাবে উপলব্ধ৷
প্রচলিত JNDI প্যাটার্ন আপনাকে স্ট্রিং-ভিত্তিক রিসোর্স নাম ব্যবহার করতে, NamingException হ্যান্ডেল করতে এবং InitialContext ম্যানেজ করতে বাধ্য করে। @Inject (বা কন্টেইনার রিসোর্সগুলির জন্য @Resource) সহ CDI ইনজেকশন কন্টেইনারকে স্বয়ংক্রিয়ভাবে ডিপেন্ডেন্সি (dependencies) ওয়্যার করতে সাহায্য করে। টাইপো (typos) কম্পাইল-টাইম এররে পরিণত হয় এবং ক্লাসগুলো সহজে টেস্ট করা যায় কারণ ডিপেন্ডেন্সিগুলো সরাসরি ইনজেক্ট করা সম্ভব।