代码对比
✕ 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
}
}
}
发现此代码有问题? 告诉我们。
为什么现代方式更好
类型安全连接
注入错误在部署时捕获,而非通过字符串查找在运行时捕获。
可测试
CDI bean 可以在单元测试中注入模拟——JNDI 查找则不行。
显式依赖
@Inject 字段使依赖关系清晰可见。
旧方式
JNDI 查找
现代方式
CDI @Inject
自 JDK
11
难度
中级
JDK 支持
JNDI 查找与 CDI 注入
可用
自 Jakarta EE 8 / Java 11 起广泛可用
工作原理
传统 JNDI 模式强制使用基于字符串的资源名称,在部署时绑定,导致脆弱的运行时错误。CDI @Inject 在部署时进行类型安全的连接。
相关文档