EJB против CDI
Замените громоздкие EJB облегчёнными CDI-бинами для внедрения зависимостей и управления транзакциями.
@Stateless
public class OrderEJB {
@EJB
private InventoryEJB inventory;
public void placeOrder(Order order) {
// container-managed transaction
inventory.reserve(order.getItem());
}
}
@ApplicationScoped
public class OrderService {
@Inject
private InventoryService inventory;
@Transactional
public void placeOrder(Order order) {
inventory.reserve(order.getItem());
}
}
Облегчённость
CDI-бины — это простые Java-классы без EJB-специфичных интерфейсов или дескрипторов.
Единое внедрение
@Inject работает единообразно для любого управляемого бина, JAX-RS-ресурса и компонента Jakarta EE.
Простое модульное тестирование
Простые классы без EJB-прокси-overhead легко инстанциировать и заменять заглушками.
Широко доступно начиная с Jakarta EE 8 / Java 11
CDI (Contexts and Dependency Injection) предоставляет те же возможности внедрения зависимостей и управления транзакциями, что и EJB, но в виде простых Java-классов без специфичных для контейнера интерфейсов или суперклассов. Области видимости, такие как @ApplicationScoped и @RequestScoped, управляют жизненным циклом, а @Transactional заменяет обязательную транзакционную семантику EJB.