Алекс - java разработчик, который только что начал писать свое первое enterprise приложение. Как и многие другие J2EE приложения, его программа представляет из себя веб-приложение, которое работает с множеством пользователей и имеет доступ к корпоративной базе данных. В нашем случае, это приложение для заказчика, которое будет использоваться другими служащими его компании.
Алекс приступает к работе, открывает свою любимую визуальную среду разработки и начинает набивать код для первого компонента, CustomerManager. В мире EJB для того, чтобы разработать этот компонент, сперва понадобиться написать несколько классов - "домашний" (home) интерфейс, локальный интерфейс (local interface) ну и сам бин (bean). В дополнение ко всему, необходимо будет создать дескриптор развертывания (deployment descriptor) для бина.
Заметив тот факт, что создание каждого из этих файлов отнимает много времени и усилий, Алекс внедряет XDoclet в свой проект. XDoclet - утилита для генерации кода, которая может генерировать все необходимые EJB файлы из одного исходного файла. Хотя это и добавляет дополнительный шаг в цикл разработки, его жизнь как кодера теперь значительно упростилась. XDoclet теперь делает за него большую часть "грязной" работы и Алекс может сосредоточиться на главной своей проблеме - что в действительности должен делать компонент CustomerManager. Он переходит к своему первому методу, getPreferredCustomer(). Существует определенный набор бизнес правил, определяющих работу с заказчиком и Алекс старательно переносит их в свой бин.
Желая подтвердить тот факт, что его логика работает корректно, он теперь хочет написать несколько тестов для валидации его кода. И тут к нему доходит: код, который он собирается тестировать, должен выполняться внутри контейнера. Его тесты также должны выполняться в контейнере. Алекс по-быстрому пишет сервлет, это позволит ему выполнять его тесты в одном и том же контейнере, что и его EJB. Проблема решена!
Алекс запускает свой J2EE контейнер и выполняет тесты. Его тесты падают. Алекс видит проблемы в коде, исправляет их и снова запускает тесты. Его тесты опять падают. Он видит уже другую ошибку и исправляет ее. Запускает контейнер, тесты снова.. По ходу работы, Алекс начинает замечать, что такой цикл разработки существенно снижает скорость разработки. В идеале, разработка должна состоять из кодинга, тестов, кодинга, снова тестов. Но на деле, цикл Алекса - это кодинг, ожидание, тесты, кодинг, ожидание, тесты и т.д. Это угнетает.
Во время ожидания запуска контейнера, Алекс думает: "Почему я использую EJB в первую очередь?". Ответ, конечно, состоит в том, что сервисы предоставляют такой подход. Но Алекс не использует entity beans, следовательно ему не нужно будет использовать persistence. Также он не использует удаленные сервисы или сервисы безопасности. В реальности, единственный EJB сервис, который собирается использовать Алекс - это управление транзакциями. Это наводит его на мысль, а нет ли более легкого пути?