Является ли CDI хорошей заменой Spring?

Мы планируем написать веб-приложение с нуля, было решено перейти с последним выпуском Glassfish, который соответствует стандарту Java EE 6, поэтому мы анализируем, может ли CDI использоваться вместо Spring.

Можно ли сказать, что CDI может быть заменой для Spring?

Ответ 1

CDI означает "инъекция контекста и зависимостей", а Spring - полная экосистема вокруг контейнера инъекций зависимостей. Чтобы сравнить их, вы должны отличить сравнение.

Включение зависимостей обрабатывается обоими контейнерами. Основное различие заключается в том, что CDI обрабатывает DI динамическим способом (aka: stateful) - это означает, что зависимости решаются во время выполнения. Подход Spring статический - это означает, что компоненты связаны друг с другом во время создания. Хотя CDI-путь может показаться немного необычным при первом взгляде, он намного превосходит и предлагает дополнительные и расширенные возможности (я пишу это на фоне двух продуктивных CDI-приложений).

Если вы посмотрите на экосистему, ситуация другая: Spring поставляется в комплекте с большим количеством банок ( > 150), в то время как CDI довольно маленький сам по себе. Типичное использование CDI будет внутри сервера приложений Java EE 6, но вы можете легко заставить его работать в сервлет-движке или даже в Java SE. Это означает, что использование CDI не делает предположений об использовании Hibernate, JPA, EJB и т.д. - что вам нужно.

Если вам нужна дополнительная функциональность, CDI поставляется с концепцией переносных расширений (что само по себе делает API достойным). Существуют независимые модули расширения, такие как Apache CODI и Seam 3, и охватывают такие темы, как безопасность, рассылка, отчетность и многое другое.

Подводя итог: CDI не похож на "замену" экосистемы Spring, это скорее улучшение над механизмом впрыска зависимостей Spring. Это часть Java EE 6, поэтому, если вы находитесь на GlasFish с Java EE 6, вам обязательно нужно перейти на CDI. На мой взгляд, ваш вопрос скорее: могу ли я заменить Spring на Java EE 6? Думаю, мой ответ довольно очевиден: -)

Посмотрите Weld, чтобы получить хороший старт...

Ответ 2

Spring больше, чем просто контейнер для инъекций зависимостей. Он также имеет инструменты для AOP, шаблоны для использования с JPA, SQL и т.д. И даже больше.

Однако CDI может использоваться в качестве замены для Spring DI API.

Ответ 3

Я использую Apache OpenWebBeans в качестве реализации CDI и MyFaces CODI в качестве переносного расширения для нескольких проектов. Я очень доволен этим, и у меня не было проблем с этим. В OpenWebBeans в настоящее время не хватает информации из-за документации, но если вы не можете заставить что-то работать, довольно легко использовать Archetypes Maven, предоставленные MyFaces, для создания простых проектов со всеми необходимыми зависимостями или вы запрашиваете список рассылки. Это так здорово, если вы просто работаете над своим Приложением, и вы не заблокированы неприятными ошибками. Я также сделал много проектов с Spring. Это нормально, но если вы спросите, что я буду использовать для следующего проекта, явным ответом будет OpenWebBeans и CODI! Я предпочитаю OpenWebBeans над Weld, потому что OpenWebBeans очень увлекателен, потому что вы можете настроить более или менее все, что не покрывается официальным CDI API/SPI, и лучше работать с runtimeperformance. И после первого проекта я никогда не стану сомневаться в CODI, потому что он очень стабилен, у них есть регулярные выпуски, и большинство из них принесли большие новые функции, которые значительно повышают производительность. CODI - это ИМХО, место, которое является самым стабильным и было большинством нововведений исходит от всей земли CDI.

Чтобы ответить на ваш вопрос: Для меня CDI полностью заменил Spring, но вам нужны переносные расширения, которые заполняют пробелы. CDI как стандарт никогда не предназначался для решения всего, и некоторые части, такие как разговоры, разбиты по дизайну. Хорошей новостью является то, что у вас есть отличные проекты, такие как MyFaces CODI. CODI исправляет почти все эти проблемы.