Внедрение контекстов и зависимостей (CDI): Платформа Java, Enterprise Edition (Java EE) 5 принесла внедрение зависимостей (DI) с соглашением по конфигурации в Enterprise JavaBeans (EJB) 3.0. Java EE 6 представляет гибкую и мощную модель внедрения зависимостей @Inject (JSR-330 и JSR-299) в дополнение к уже существующей аннотации @EJB.

Внедрение контекстов и зависимостей (CDI) - это новая спецификация Java EE 6, которая не только определяет мощное и безопасное для типов внедрение зависимостей, но также вводит понятие "контекстных" ссылок или областей.

Буква C в CDI- это основное различие между EJB-компонентами и управляемыми компонентами CDI. Компоненты, управляемые CDI, являются контекстными, а компоненты EJB - нет. Управляемые компоненты в CDI живут в четко определенной области. Они создаются и уничтожаются контейнером по запросу. CDI уже поставляется с предопределенными областями действия и аннотациями:

  • @RequestScoped
  • @SessionScoped
  • @ApplicationScoped
  • @ConversationScoped.

Контейнер CDI автоматически управляет всеми компонентами внутри области видимости. В концеHttpSession или HttpRequest, все экземпляры, связанные с этой областью, автоматически уничтожаются и, таким образом, собираются сборщиком мусора.

Это поведение сильно отличается от поведения сессионных компонентов с отслеживанием состояния. Экземпляр сессионного компонента с отслеживанием состояния должен быть явно удален клиентом при вызове метода, помеченного@Remove. Контейнер не уничтожит его автоматически; он не привязан ни к какому контексту. Если вы связываете сессионный компонент с отслеживанием состояния сHttpSession, вы также должны позаботиться о его надежном уничтожении в конце или по истечении времени ожидания HttpSession.

Контекстуальная природа CDI делает использование компонентов из разных областей более естественным и удобным. Вы даже можете смешивать и сопоставлять области и вводить бобы из разных областей. Контейнер по-прежнему заботится о правильном управлении жизненным циклом.