В 2014 году я написал ужасную статью о том, как сильно я ненавижу весну. Вы можете прочитать это здесь, но tl; dr таков: я ненавижу программирование на XML, я не люблю магию и не люблю фреймворки. Всякий раз, когда я использовал Spring или аналогичные фреймворки, меня сжигали и в конечном итоге становились все хуже.
Но это было еще в начале 2014 года. С тех пор я занимался собственной инъекцией зависимостей, используя TDD и класс высшего уровня, который обрабатывает построение инъекций. Затем, на выходных в День благодарения, интернет обнаружил мою запись, и она стала вирусной. У меня было более 10 тысяч просмотров за первые 2 дня. Твиттер и Reddit оба поддержали и разозлились, и начались огненные войны. Это было очень весело и очень интересно для меня. Оказывается, многое изменилось за последние 2 года.
Самым интересным для меня стало обсуждение с Филом Уэббом из команды Spring, где он утверждал, что Spring больше не относится к DI; Речь идет о наличии всего, что вам нужно для создания полноценного веб-приложения, а DI — всего лишь примечание. Оказывается, весна не единственная структура в этом пространстве; основные из них я выбрал из обсуждения:
— Калитка
Если у вас есть что-то еще, чтобы добавить в микс, пожалуйста, дайте мне знать в комментариях ниже, и я добавлю это в список.
На данный момент я действительно смущен, почему эти решения были построены. Они кажутся ответом на вопрос, который не был задан. Исходя из своего опыта, я могу собрать работающее масштабируемое корпоративное приложение с гораздо меньшими затратами и гораздо более легкой кривой обучения за очень короткое время. Но я чувствую, что должно быть что-то, чего мне не хватает. В результате я начинаю эксперимент, чтобы перейти от нуля знаний к полноценному приложению, используя эти платформы. Я надеюсь узнать что-то новое и надеюсь найти то, что мне не хватает.
Как это будет работать?
Я собираюсь создать приложение чата. Это действительно хорошо понятная область, и в чистом виде ее должно быть достаточно легко собрать в течение нескольких статей. Я собираюсь начать с Dropwizard, так как у меня нулевой опыт работы с ним, и поэтому не должно быть предвзятости, прежде чем перейти к Spring, тогда кто знает что. Это не будет полнофункциональное корпоративное приложение, но, будем надеяться, оно будет достаточно практичным и удобным для использования в качестве законного примера.
«Ты делаешь это неправильно»
Это неизбежно произойдет. Я буду работать с документацией Hello World и буду работать над этим. Я не обязательно буду использовать лучшие практики, так как буду пытаться изучить фреймворки за короткое время. Используйте раздел комментариев и будьте нежны. Не стесняйтесь рассказать мне, что я пропустил или что я должен добавить. Я могу добавить приложение к статье.
Как я могу следовать?
Я публикую все свои статьи на DZone в своем твиттере @SambaHK . Следуйте за мной, чтобы убедиться, что вы видите все обновления, или просто постоянно проверяйте DZone (что вы уже сделали правильно?)
Dropwizard, часть 1: Hello World
Что такое DropWizard? Из документов:
«Dropwizard — это фреймворк Java для разработки высокопроизводительных веб-сервисов RESTful, удобных для использования».
Он объединяет установленные библиотеки в единую среду, которая прекрасно работает вместе и избавляет вас от необходимости беспокоиться об этом. Это охватывает все: от HTTP и REST до измерения производительности и шаблонов пользовательского интерфейса. Ясно, что это заранее продуманная основа. Я вижу, что это было бы полезно для тех, кто хочет быстро начать работу, но мне интересно узнать, как легко поменять местами эти детали, если я хочу попробовать что-то другое.
Существует следовать вдоль привет мир документации , доступной здесь . При первом взгляде я не буду лгать; Я обеспокоен. Чтобы получить базовый привет, для работы требуется около 4 разных классов и целая куча шаблонов. Важно не судить о фреймворке с нулевой скоростью, чтобы приветствовать мировую скорость, но она все еще кажется немного мрачной.
Пример, используемый на сайте, на самом деле немного сложнее, чем нужно, поскольку он вводит несколько концепций одновременно. Получив (в конце концов) работу, я сначала покажу вам простую версию. Чтобы добраться до этого момента, мне пришлось пройти через загадочные ошибки в фреймворке; До сих пор кажется, что документация для Dropwizard не очень хорошая, но я подозреваю, что если я буду гуглить на составные части (например, «Jetty XXXException» вместо «Dropwizard XXXException»), мне может повезти больше.
Ресурс
Dropwizard использует Jersey, фреймворк для разработки веб-сервисов RESTful на Java. Мы создаем Ресурс, который регистрируем на Джерси, который представляет конечную точку Отдыха.
@Path("/hello-world")
@Produces(MediaType.TEXT_PLAIN)
public class HelloWorldResource {
@GET
public String sayHello(@QueryParam("name") Optional<String> name) {
return "Hello World";
}
}
public class HelloWorldApplication extends Application<HelloWorldConfiguration> {
public static void main(String[] args) throws Exception {
new HelloWorldApplication().run(args);
}
@Override
public String getName() {
return "hello-world";
}
@Override
public void initialize(Bootstrap<HelloWorldConfiguration> bootstrap) {
// nothing to do yet
}
@Override
public void run(HelloWorldConfiguration configuration, Environment environment) {
final HelloWorldResource resource = new HelloWorldResource();
environment.jersey().register(resource);
}
}
Запуск этого даст вам рабочую конечную точку RESTful. Он также добавляет консоль администратора с Threads, Metrics и Healthcheck (подробнее об этом в следующем посте) бесплатно, что довольно приятно.
Одна из вещей, которыми я здесь уже не являюсь, — то, что класс Main должен расширять класс Application, являющийся частью ядра dropwizard. Кажется, это наследование часто встречается в Dropwizard, который для меня является запахом кода. Это не прочная основа, и если вы когда-нибудь захотите отступить, я думаю, что от этого трудно отказаться. Это также требует наличия класса конфигурации. Это может быть использовано для включения конфигурации из файла YAML, но я решил проигнорировать это и пока у меня есть пустой класс конфигурации, чтобы сделать его простым. Я надеюсь, что смогу перенастроить приложение так, чтобы оно использовало композицию вместо наследования, но сейчас я хотел упростить его, следуя документации.
Джексон, JSON-анализатор, входит в состав семейства Dropwizard. Мы можем изменить ответ, вместо того, чтобы возвращать текст, возвращая объект JSON. Если наш метод возвращает POJO, который мы соответствующим образом аннотируем, преобразование произойдет автоматически.
public class Saying {
private long id;
@Length(max = 3)
private String content;
public Saying() {
// Jackson deserialization
}
public Saying(long id, String content) {
this.id = id;
this.content = content;
}
@JsonProperty
public long getId() {
return id;
}
@JsonProperty
public String getContent() {
return content;
}
}
@GET
public Saying sayHello(@QueryParam("name") Optional<String> name) {
return new Saying(counter.incrementAndGet(), “Hello World!”);
}
Итак, теперь у нас Hello World, возвращаемый в правильном формате JSON.
Это всего лишь Hello World, и нам предстоит долгий путь. Понятно, что Dropwizard обладает потенциалом быть мощным, и в него заложено множество вещей, так что разработчику не нужно беспокоиться об этом. Следите за DZone или подписывайтесь на меня через @SambaHK в твиттере для следующего выпуска, пока я пытаюсь познакомить вас с приложением hello world и узнать, что еще предлагает Dropwizard.