Это на самом деле очень разные технологии. CDI - это стек внедрения зависимостей (например, Spring или Guice) с некоторыми функциями AOP (достаточно в типичных случаях использования). AspectJ - это полноценный аспектно-ориентированный язык программирования , который на самом деле не предлагает никаких функций внедрения зависимостей.
0,1. Кривая обучения
Обе технологии имеют много материалов. CDI новый, но вокруг него много шума. Например. см. Учебное пособие CDI AOP: Учебное пособие по перехвату стандартных методов Java .
AspectJ намного старше, и о нем мало фантастических книг. Но я бы сказал, что это немного сложнее.
0,2. Переносимость на разные серверы
CDI - это стандарт Java для DI. Мы увидим все больше и больше серверов, реализующих его. AspectJ - это язык, который работает на уровне байт-кода. Он должен работать практически на любой виртуальной машине Java (мобильной, настольной системе, сервере, апплете ...)
Что касается удобства обслуживания и отладки - это действительно разные технологии, поэтому я не буду вдаваться в их сравнение. Однако CDI - это стандартный код Java, в то время как AspectJ в основном генерирует код на уровне байт-кода. С другой стороны, сгенерированный AspectJ код (трассировка стека, декомпиляция) может быть более читабельным, чем тонны рефлексивных прокси и сгенерированные CGLIB классы с CDI.