Spring Roo — что за зверь и с чем его едят?
Warning Внимание, описаное ниже является мнением автора и не претендует на звание догмы.Так что же такое Spring Roo? Spring Roo, как пишут в той же википедии — framework, который позволяет быстро разработать бизнес приложение, точнее его структурную часть. По моему мнению, приложением то, что получается на выходе назвать сложно, но как инструмент прототипирования на начальной стадии разработки — весьма полезная вещь. Вообще, говорить о чем-то техническом можно долго, красиво и напридумать кучу доводов как «за», так и «против». Но чтобы решить для себя надобность технологии, стоит сначала попробовать ее, ну или как минимум подумать о процессе применения ее в «быту», так сказать. Чем мы дальше и займемся.С места в карьер Качаем Spring Roo, распаковываем архив и запускаем консоль roo. Дальше начинается самое интересное. Стоит сразу сказать — у консоли roo есть замечательная команда hint, она подскажет вам, что именно можно и нужно делать на каждом конкретном этапе разработки. Дальше по пунктам рассмотрим создание простейшего CRUD веб-приложения.Создание проекта project --topLevelPackage com.getauft.library --java 7 --projectName library После каждой команды, roo будет выводить ответ из которого будет понятно, что именно произошло и произошло ли…Пример ответа на команду создания проекта указанную выше: Created ROOT/pom.xml Created SRC_MAIN_RESOURCES Created SRC_MAIN_RESOURCES/log4j.properties Created SPRING_CONFIG_ROOT Created SPRING_CONFIG_ROOT/applicationContext.xml Механизм персистентности Странно, если наше приложение будет хранить данные в сессии только. Для того, чтобы работать с БД, нам нужно использовать механизмы персистентности. В данном примере мы будем использовать базу которая разворачивается и хранит все данные в оперативной памяти — HYPERSONIC. Для тех кто захочет использовать mysql или что-то другое — не составит труда изменить конфигурацию. jpa setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY Так просто.Класс Наше приложение должно оперировать какими-то сущностями, иначе зачем оно еще нужно?! Сущности создаются так же просто как и все что здесь описано. entity jpa --class com.getauft.library.Book --testAutomatically entity jpa --class com.getauft.library.Genre --testAutomatically Мы создали два класса, и указали, что они будут тестироваться автоматически (об этом в самом конце).Поля класса field string --fieldName title --notNull --class ~.Book field string --fieldName description field string --fieldName caption --notNull --class ~.Genre Мы создали три поля: title и description для класса Book, и caption для Genre. Когда вам необходимо создать несколько полей для одного класса, то каждый раз указывать класс нет необходимости, можно опускать этот параметр после того, как создали первое поле в этом классе.Связи между объектами field set --fieldName genres --type ~.Genre --class ~.Book --cardinality MANY_TO_MANY Связь простая: Много книг может содержать много жанров. Жанры ничего не знают о существовании книг.Контроллеры controller all --package ~.web Данная команда создаст нам все необходимые контроллеры чтобы осуществлять CRUD операции с нашими объектами.Логирование и тесты logging setup --level INFO --package ALL_SPRING perform tests Логирование понятно, но что за тесты?! Помните в самом начале мы использовали при создании классов ключ --testAutomatically? Так вот Spring Roo сам покроет простыми тестами эти классы, и как раз последней командой они и будут выполнены.Запуск получившегося Для запуска получившегося приложения нам необходимо выполнить следующую команду: mvn tomcat: run Выполнение этой команды подразумевает, что на вашей машине стоит maven. После запуска, maven сам подтянет все необходимые зависимости, не пугайтесь — их много. Далее нам просто нужно будет перейти по ссылке http://localhost:8080/library/ и о чудо, почти полноценное приложение! Почему почти? Все просто — никакого функционала кроме операций CRUD здесь вы не увидите… Пока не увидите. В идеале с помощью Spring Roo можно сделать кучу полезных вещей, таких как поиск и прочее. Но в этой ознакомительной статье мы касаться этого не будем. Если будет интересно уважаемому хабросообществу, то я напишу продолжение, с более серьезным примером и расширенным функционалом.А теперь для ленивых… Те кто читают по диагонали и не хотят разбираться, а желают видеть сразу результат, то им нужно скопировать код в файл с названием log.roo (название на самом деле не важно), запустить консоль roo и выполнить команду script --file log.roo, а затем в обычной консоли mvn tomcat: runСодержимое log.roo project --topLevelPackage com.getauft.library --java 7 --projectName library jpa setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY entity jpa --class com.getauft.library.Book --testAutomatically entity jpa --class com.getauft.library.Genre --testAutomatically field string --fieldName title --notNull --class ~.Book field string --fieldName description --class ~.Book field string --fieldName caption --class ~.Genre field set --fieldName genres --type ~.Genre --class ~.Book --cardinality MANY_TO_MANY controller all --package ~.web logging setup --level INFO --package ALL_SPRING perform tests Так зачем же он нужен? Можно говорить много о том, что код сгенерированный машиной никогда не приблизится к коду написанному человеком (даже не знаю, всегда ли это плохо). Можно говорить о том, что это применимо только в суровом и консервативном enterprise, где есть требования к функционалу продукта, а не удобству и дизайну. Много можно придумать «за» и «против». Но одно точно — скорость создания модели приложения сокращается в разы. Да и кто сказал, что обязательно использовать Spring Roo для создания Web MVC? Если у кого-то есть опыт создания полноценных приложений с помощью Spring Roo, поделитесь своими впечатлениями о сем в комментариях. Будет интересно мнение других разработчиков уже имеющих опыт.