JSF Managed Bean vs. CDI Named Bean
Замените устаревший JSF-@ManagedBean на CDI-@Named для единой модели внедрения зависимостей.
Сравнение кода
✕ Java EE
@ManagedBean
@SessionScoped
public class UserBean implements Serializable {
@ManagedProperty("#{userService}")
private UserService userService;
private String name;
public String getName() { return name; }
public void setName(String name) {
this.name = name;
}
public void setUserService(UserService svc) {
this.userService = svc;
}
}
✓ Jakarta EE 10+
@Named
@SessionScoped
public class UserBean implements Serializable {
@Inject
private UserService userService;
private String name;
public String getName() { return name; }
public void setName(String name) {
this.name = name;
}
}
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Единая модель
Один CDI-контейнер управляет всеми бинами — JSF, REST и сервисные слои используют одно и то же внедрение.
Меньше шаблонного кода
@Inject заменяет @ManagedProperty и обязательный сеттер-метод.
Ориентация на будущее
@ManagedBean был удалён в Jakarta EE 10; @Named — поддерживаемая замена.
Старый подход
@ManagedBean
Современный подход
@Named + CDI
Начиная с JDK
11
Сложность
Средний
Поддержка JDK
JSF Managed Bean vs. CDI Named Bean
Доступно
CDI @Named доступен начиная с Java EE 6; @ManagedBean удалён в Jakarta EE 10
Как это работает
Аннотации @ManagedBean и @ManagedProperty из JSF были объявлены устаревшими в Jakarta Faces 2.3 и удалены в Jakarta EE 10. CDI-замена использует @Named для доступа к бину через EL-выражения и @Inject для связывания зависимостей. Это унифицирует модель бинов — JSF-страницы, JAX-RS-ресурсы и EJB используют один и тот же CDI-контейнер.
Связанная документация
Доказательство