Рубрики
Без рубрики

Почему Вы выбрали Spring в качестве Java-фреймворка?

Краткий и практический обзор основного ценностного предложения Spring framework.

Автор оригинала: Kumar Chandrakant.

1. Обзор

В этой статье мы рассмотрим основное ценностное предложение Spring как одного из самых популярных Java-фреймворков.

Что еще более важно, мы попытаемся понять причины, по которым весна является нашей основой выбора. Детали Spring и его составных частей были широко освещены в наших предыдущих руководствах . Поэтому мы пропустим вводные части “как” и в основном сосредоточимся на “почему”.

2. Зачем Использовать Какие-Либо Рамки?

Прежде чем мы начнем какое-либо обсуждение, в частности, весны, давайте сначала поймем, зачем нам вообще нужно использовать какие-либо рамки.

Язык программирования общего назначения, такой как Java, способен поддерживать широкий спектр приложений . Не говоря уже о том, что Java активно разрабатывается и совершенствуется с каждым днем.

Более того, существует бесчисленное множество библиотек с открытым исходным кодом и проприетарных библиотек для поддержки Java в этом отношении.

Так зачем же нам все – таки нужна структура? Честно говоря, нет абсолютной необходимости использовать фреймворк для выполнения задачи. Но часто рекомендуется использовать один из них по нескольким причинам:

  • Помогает нам сосредоточиться на основной задаче, а не на шаблонной связанной с ней
  • Объединяет годы мудрости в форме шаблонов дизайна
  • Помогает нам придерживаться отраслевых и нормативных стандартов
  • Снижает общую стоимость владения приложением

Мы только что коснулись поверхности здесь, и мы должны сказать, что преимущества трудно игнорировать. Но это не может быть только положительным, так в чем же подвох:

  • Заставляет нас написать заявление определенным образом
  • Привязывается к определенной версии языка и библиотек
  • Увеличивает объем ресурсов приложения

Честно говоря, в разработке программного обеспечения нет серебряных пуль, и фреймворки, безусловно, не являются исключением из этого правила. Таким образом, выбор того, какая структура или нет, должен определяться контекстом.

Надеюсь, к концу этой статьи мы сможем лучше принять это решение в отношении Spring на Java.

3. Краткий обзор экосистемы Spring

Прежде чем мы начнем нашу качественную оценку Spring Framework, давайте подробнее рассмотрим, как выглядит экосистема Spring.

Весна появилась где-то в 2003 году в то время, когда Java Enterprise Edition быстро развивалась, а разработка корпоративного приложения была захватывающей, но, тем не менее, утомительной!

Spring начиналась как инверсия контейнера управления (IoC) для Java . Мы по-прежнему относим Spring в основном к нему, и фактически он составляет основу фреймворка и других проектов, которые были разработаны на его основе.

3.1. Пружинный Каркас

Spring framework разделен на модули , что позволяет очень легко выбирать и выбирать части для использования в любом приложении:

  • Ядро : Предоставляет основные функции, такие как DI (внедрение зависимостей), Интернационализация, проверка и AOP (Аспектно-ориентированное программирование).
  • Доступ к данным : Поддерживает доступ к данным через JTA (API транзакций Java), JPA (API сохранения Java) и JDBC (Подключение к базе данных Java).
  • Web : Поддерживает как API сервлетов ( Spring MVC ), так и недавно появившийся реактивный API ( Spring Web Flux ), а также дополнительно поддерживает WebSockets, STOMP и WebClient
  • Интеграция : Поддерживает интеграцию с корпоративной Java через JMS (Служба сообщений Java), JMX (Расширение управления Java) и RMI (Вызов удаленного метода).
  • Тестирование : Широкая поддержка модульного и интеграционного тестирования с помощью макетных объектов, тестовых приспособлений, управления контекстом и кэширования

3.2. Весенние проекты

Но что делает Весну гораздо более ценной, так это сильная экосистема, которая росла вокруг нее на протяжении многих лет и продолжает активно развиваться . Они структурированы как Весенние проекты , которые разрабатываются поверх структуры Spring.

Хотя список весенних проектов длинный и он постоянно меняется, есть несколько достойных упоминания:

  • Boot : Предоставляет нам набор очень самоуверенных, но расширяемых шаблонов для создания различных проектов на основе Spring практически в кратчайшие сроки. Это действительно упрощает создание автономных приложений Spring со встроенным Tomcat или аналогичным контейнером.
  • Облако : Обеспечивает поддержку для простой разработки некоторых распространенных шаблонов распределенных систем, таких как обнаружение служб, автоматический выключатель и шлюз API. Это помогает нам сократить усилия по развертыванию таких стандартных шаблонов на локальных, удаленных или даже управляемых платформах.
  • Безопасность : Обеспечивает надежный механизм для разработки аутентификации и авторизации для проектов, основанных на Spring, настраиваемым способом. При минимальной декларативной поддержке мы получаем защиту от распространенных атак, таких как фиксация сеанса, взломы кликов и подделка межсайтовых запросов.
  • Мобильный : Предоставляет возможности для обнаружения устройства и соответствующей адаптации поведения приложения. Кроме того, поддерживается управление просмотром с учетом устройств для оптимального взаимодействия с пользователем, управление предпочтениями сайта и переключатель сайтов.
  • Пакет : Обеспечивает легкую платформу для разработки пакетных приложений для корпоративных систем, таких как архивирование данных. Имеет интуитивно понятную поддержку планирования, перезапуска, пропуска, сбора показателей и ведения журнала. Кроме того, поддерживается масштабирование для выполнения заданий большого объема за счет оптимизации и разделения.

Излишне говорить, что это довольно абстрактное введение в то, что может предложить Весна. Но это дает нам достаточно оснований в отношении организации и широты Spring, чтобы продолжить нашу дискуссию.

4. Пружина в действии

Принято добавлять программу hello-world, чтобы понять любую новую технологию.

Давайте посмотрим, как Spring может сделать это легкой прогулкой, чтобы написать программу, которая делает больше, чем просто hello-world . Мы создадим приложение, которое будет предоставлять операции CRUD в качестве API-интерфейсов REST для такой доменной сущности, как Employee, поддерживаемой базой данных в памяти. Более того, мы защитим наши конечные точки мутации, используя базовую аутентификацию. Наконец, ни одно приложение не может быть действительно полным без хороших, старых модульных тестов.

4.1. Настройка проекта

Мы настроим наш проект Spring Boot с помощью Spring Initializr , который является удобным онлайн-инструментом для начальной загрузки проектов с правильными зависимостями. Мы добавим Web, JPA, H2 и Безопасность в качестве зависимостей проекта, чтобы правильно настроить конфигурацию Maven.

Более подробная информация о начальной загрузке доступна в одной из наших предыдущих статей.

4.2. Модель предметной области и сохраняемость

Поскольку сделать предстоит так мало, мы уже готовы определить нашу модель предметной области и ее постоянство.

Давайте сначала определим Сотрудника как простую сущность JPA:

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @NotNull
    private String firstName;
    @NotNull
    private String lastName;
    // Standard constructor, getters and setters
}

Обратите внимание на автоматически сгенерированный идентификатор, который мы включили в наше определение сущности.

Теперь нам нужно определить репозиторий JPA для нашей сущности. Вот где Весна делает это действительно простым:

public interface EmployeeRepository 
  extends CrudRepository {
    List findAll();
}

Все, что нам нужно сделать, это определить подобный интерфейс, и Spring JPA предоставит нам реализацию, дополненную операциями по умолчанию и пользовательскими операциями . Довольно аккуратно! Более подробную информацию о работе с Spring Data JPA вы найдете в других наших статьях.

4.3. Контроллер

Теперь нам нужно определить веб-контроллер для маршрутизации и обработки наших входящих запросов:

@RestController
public class EmployeeController {
    @Autowired
    private EmployeeRepository repository;
    @GetMapping("/employees")
    public List getEmployees() {
        return repository.findAll();
    }
    // Other CRUD endpoints handlers
}

На самом деле, все, что нам нужно было сделать, это аннотировать класс и определить метаданные маршрутизации вместе с каждым методом обработчика.

Работа с контроллерами пружинного УПОРА подробно описана в нашей предыдущей статье.

4.4. Безопасность

Итак, теперь мы все определили, но как насчет защиты таких операций, как создание или удаление сотрудников? Мы не хотим несанкционированного доступа к этим конечным точкам!

Весенняя безопасность действительно сияет в этой области:

@EnableWebSecurity
public class WebSecurityConfig 
  extends WebSecurityConfigurerAdapter {
 
    @Override
    protected void configure(HttpSecurity http) 
      throws Exception {
        http
          .authorizeRequests()
            .antMatchers(HttpMethod.GET, "/employees", "/employees/**")
            .permitAll()
          .anyRequest()
            .authenticated()
          .and()
            .httpBasic();
    }
    // other necessary beans and definitions
}

Здесь есть более подробные сведения, которые требуют внимания для понимания, но наиболее важным моментом, который следует отметить, является декларативный способ, которым мы разрешили неограниченные операции GET .

4.5. Тестирование

Теперь мы все сделали, но подождите, как мы это проверим?

Давайте посмотрим, сможет ли Spring упростить написание модульных тестов для контроллеров REST:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class EmployeeControllerTests {
    @Autowired
    private MockMvc mvc;
    @Test
    @WithMockUser()
    public void givenNoEmployee_whenCreateEmployee_thenEmployeeCreated() throws Exception {
        mvc.perform(post("/employees").content(
            new ObjectMapper().writeValueAsString(new Employee("First", "Last"))
            .with(csrf()))
          .contentType(MediaType.APPLICATION_JSON)
          .accept(MediaType.APPLICATION_JSON))
          .andExpect(MockMvcResultMatchers.status()
            .isCreated())
          .andExpect(jsonPath("$.firstName", is("First")))
          .andExpect(jsonPath("$.lastName", is("Last")));
    }
    // other tests as necessary
}

Как мы видим, Spring предоставляет нам необходимую инфраструктуру для написания простых модульных и интеграционных тестов , которые в противном случае зависят от контекста Spring, который необходимо инициализировать и настроить.

4.6. Запуск приложения

Наконец, как мы запускаем это приложение? Это еще один интересный аспект Spring Boot. Хотя мы можем упаковать это как обычное приложение и развернуть традиционно в контейнере сервлетов.

Но где же веселье это то! Spring Boot поставляется со встроенным сервером Tomcat :

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Это класс, который предварительно создан как часть начальной загрузки и содержит все необходимые сведения для запуска этого приложения с помощью встроенного сервера.

Более того, это очень легко настраивается .

5. Альтернативы пружине

Хотя выбор в пользу фреймворка относительно проще, выбор между фреймворками часто может быть сложным из-за того, что у нас есть выбор. Но для этого мы должны иметь хотя бы приблизительное представление о том, какие альтернативы существуют для функций, которые может предложить Spring.

Как мы обсуждали ранее, фреймворк Spring вместе с его проектами предлагает широкий выбор для корпоративного разработчика на выбор . Если мы проведем быструю оценку современных Java-фреймворков, они даже близко не приблизятся к экосистеме, которую предоставляет нам Spring.

Однако для конкретных областей они являются убедительным аргументом для выбора в качестве альтернативы:

  • Guice : Предлагает надежный контейнер IoC для приложений Java
  • Play : Довольно удачно вписывается в качестве веб-фреймворка с реактивной поддержкой
  • Hibernate : Установленная структура для доступа к данным с поддержкой JPA

Помимо этого, есть некоторые недавние дополнения, которые предлагают более широкую поддержку, чем конкретный домен, но все еще не охватывают все, что может предложить Spring:

  • Micronaut : Платформа на основе JVM, адаптированная для облачных микросервисов
  • Кварки : Стек Java нового поколения, который обещает обеспечить более быстрое время загрузки и меньшую площадь

Очевидно, что нет ни необходимости, ни возможности полностью перебирать список, но здесь мы получаем общую идею.

6. Итак, Почему Вы Выбрали Весну?

Наконец, мы создали весь необходимый контекст для решения нашего центрального вопроса: почему весна? Мы понимаем, как фреймворк может помочь нам в разработке сложных корпоративных приложений.

Более того, мы понимаем, какие у нас есть возможности для решения конкретных задач, таких как веб, доступ к данным, интеграция с точки зрения фреймворка, особенно для Java.

Итак, где же среди всего этого сияет весна? Давайте исследуем.

6.1. Удобство использования

Одним из ключевых аспектов популярности любого фреймворка является то, насколько легко его использовать разработчикам. Использование нескольких параметров конфигурации и соглашений по сравнению с конфигурацией позволяет разработчикам действительно легко начать, а затем настроить именно то, что им нужно .

Такие проекты, как Spring Boot, сделали загрузку сложного проекта Spring почти тривиальной|/. Не говоря уже о том, что в нем есть отличная документация и учебные пособия, которые помогут любому попасть на борт.

6.2. Модульность

Еще одним ключевым аспектом популярности Spring является его высокая модульность. У нас есть варианты использования всего фреймворка Spring или только необходимых модулей. Кроме того, мы можем дополнительно включить один или несколько весенних проектов в зависимости от необходимости.

Более того, у нас есть возможность использовать и другие фреймворки, такие как Hibernate или Struts!

6.3. Соответствие

Хотя Spring не поддерживает все спецификации Jakarta EE, он поддерживает все свои технологии , часто улучшая поддержку по сравнению со стандартной спецификацией, где это необходимо. Например, Spring поддерживает репозитории на основе JPA и, следовательно, упрощает переключение поставщиков.

Кроме того, Spring поддерживает отраслевые спецификации, такие как Реактивный поток под Spring Web Reactive и HATEOAS под Spring HATEOAS .

6.4. Проверяемость

Принятие любого фреймворка во многом также зависит от того, насколько легко протестировать приложение, построенное поверх него. Spring в основе выступает за и поддерживает разработку на основе тестирования (TDD).

Приложение Spring в основном состоит из POJOS, что, естественно, значительно упрощает модульное тестирование. Тем не менее, Spring предоставляет макетные объекты для сценариев, таких как MVC, где модульное тестирование в противном случае усложняется.

6.5 Зрелость

Весна имеет долгую историю инноваций, внедрения и стандартизации. С годами он стал достаточно зрелым, чтобы стать решением по умолчанию для большинства распространенных проблем , с которыми сталкиваются при разработке крупномасштабных корпоративных приложений.

Что еще более интересно, так это то, насколько активно он развивается и поддерживается. Поддержка новых языковых функций и корпоративных интеграционных решений разрабатывается каждый день.

6.6. Поддержка Сообщества

И последнее, но не менее важное: любая структура или даже библиотека выживают в отрасли благодаря инновациям, и нет лучшего места для инноваций, чем сообщество. Spring-это открытый исходный код во главе с Pivotal Software и при поддержке большого консорциума организаций и индивидуальных разработчиков .

Это означает, что он остается контекстуальным и часто футуристическим, о чем свидетельствует количество проектов под его эгидой.

Это означает, что он остается контекстуальным и часто футуристическим, о чем свидетельствует количество проектов под его эгидой.

Это означает, что он остается контекстуальным и часто футуристическим, о чем свидетельствует количество проектов под его эгидой.

Это означает, что он остается контекстуальным и часто футуристическим, о чем свидетельствует количество проектов под его эгидой.

Это достигается за счет дополнительных ресурсов и кривой обучения , какими бы незначительными они ни были. Если действительно существует приложение, которое достаточно просто и, как ожидается, не будет усложняться, возможно, будет больше пользы от того, чтобы вообще не использовать какой-либо фреймворк!

8. Заключение

В этой статье мы обсудили преимущества использования фреймворка при разработке приложений. Далее мы вкратце обсудили, в частности, Весенние рамки.

Говоря об этом, мы также рассмотрели некоторые альтернативные фреймворки, доступные для Java.

Наконец, мы обсудили причины, которые могут заставить нас выбрать Spring в качестве фреймворка для Java.

Однако мы должны закончить эту статью примечанием с советом. Как бы убедительно это ни звучало, в разработке программного обеспечения обычно не существует единого универсального решения .

Следовательно, мы должны применять нашу мудрость при выборе простейших решений для конкретных проблем, которые мы стремимся решить.