Spring Framework

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 23:43, 15 июня 2019.
Spring Framework
Spring Framework Logo 2019.jpg
Разработчики: Pivotal Software
Выпущена: 1 October 2002 года; 17 years ago (2002-10-01)
Постоянный выпуск: 5.1.2 [Источник 1] / 13 February 2019 года; 12 months ago (2019-02-13)
Написана на: Java
Платформа: Java EE
Тип ПО: Application framework
Лицензия: Apache License 2.0
Веб-сайт spring.io

Spring Framework — один из самых популярных фреймворков для создания веб-приложений на Java. Несмотря на то, что Spring не обеспечивал какую-либо конкретную модель программирования, он стал широко распространённым в Java-сообществе главным образом как альтернатива и замена модели Enterprise JavaBeans. Spring предоставляет бо́льшую свободу Java-разработчикам в проектировании, так как Spring предлагает массу функций, которые недоступны в качестве стандартов Java EE, например, Spring Batch или Spring Integration; кроме того, он предоставляет хорошо документированные и лёгкие в использовании средства решения проблем, возникающих при создании приложений корпоративного масштаба. [Источник 2]

Между тем, особенности ядра Spring применимы в любом Java-приложении, и существует множество расширений и усовершенствований для построения веб-приложений на Java Enterprise платформе. По этим причинам Spring приобрёл большую популярность и признаётся разработчиками как стратегически важный фреймворк.

Структура

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

У Spring модульная структура. Это позволяет подключать только те модули, которые нужны для нашего приложения и не подключать те, которыми заведомо не будем пользоваться. Именно этот подход и помог Spring обойти своего конкурента в то время (EJB) и захватить лидерство. [Источник 3] Данная структура показана на Рисунке 1.

Рисунок 1 — Структура

Spring состоит из нескольких модулей:

  • data access;
  • web;
  • core;
  • и других.

Модуль data access содержит в себе средства для работы с данными (в основном, с базами данных), web — для работы в сети (в том числе и для создания веб-приложений).

Кроме того, есть еще так-называемая целая спринг-инфраструктура: множество других проектов, которые не входят в сам фреймворк официально, но при этом бесшовно интегрируются в ваш проект на спринге (например, тот же spring security для работы с авторизацией пользователей на сайте).

Компоненты Spring Framework

Spring - огромный фреймворк, так как создатели охватили практически все области Java-приложений. Отсюда следует, что существует большое количество составных частей у Spring Framework (Данная схема фреймворка показана на Рисунке 2.):

Рисунок 2 — Схема фреймворка
  • IoC (Inversion of Control) контейнер;
  • AOP-фреймворк (включая интеграцию с AspectJ);
  • Data Access фреймворк;
  • Transaction management;
  • MVC-фреймворк;
  • Remote Access фреймворк;
  • Batch processing;
  • Фреймворк аутентификации и авторизации;
  • Remote Management;
  • Messaging-фреймворк;
  • Testing-фреймворк.



DI/IoC

IoC (Inversion of Control) — инверсия управления. При использовании библиотеки вы сами прописываете в своем коде какой метод какого объекта вызвать, а в случает с фреймворками — чаще всего уже фреймворк будет вызывать в нужный ему момент тот код, который уже написали. То есть, тут уже не вы управляете процессом выполнения кода/программы, а фреймворк это делает за вас. Вы передали ему управление (инверсия управления).

Под DI понимают то Dependency Inversion (инверсию зависимостей, то есть попытки не делать жестких связей между вашими модулями/классами, где один класс напрямую завязан на другой), то Dependency Injection (внедрение зависимостей, это когда объекты создаете не вы в main-е и потом передаете их в свои методы, а за вас их создает Spring).

Spring MVC

Ядро платформы, предоставляет базовые средства для создания приложений — управление компонентами (бинами, beans), внедрение зависимостей, MVC фреймворк, транзакции, базовый доступ к БД. В основном это низкоуровневые компоненты и абстракции. По сути, неявно используется всеми другими компонентами. Данный интерфейс изображен на Рисунке 3:

Рисунок 3 — Интерфейс Controller

Spring Security

Spring Security это Java/JavaEE framework, предоставляющий механизмы построения систем аутентификации и авторизации, а также другие возможности обеспечения безопасности для корпоративных приложений, созданных с помощью Spring Framework. У Spring Security есть несколько характеристик: [Источник 4]

  • Авторизация и аутентификация;
  • доступ к данным, методам и т.п.;
  • OAuth;
  • LDAP;
  • куча разных провайдеров.

Spring Boot

Spring Boot позволяет избежать XML конфигурации, также настраивает ( т.е. приводит в порядок зависимости между компонентами) приложение, упаковывает его в исполняемый связующее звено, которое объединяет вместе набор компонентов в готовое приложение.

Функции Spring Boot:

  • Он не использует кодогенерацию. Из кода, который генерится, присутствует только метод main. Если вы ищете утилиту для генерации приложений — это скорее JHipster
  • Не использует XML для конфигурации. Все конфигурится через аннотации
  • Используются автоконфигурации по максимуму. Если у вас добавлена зависимость на Mongo, и не указано, куда подключаться — Boot попробует localhost:27017
  • Используется convention over configuration. Для большинства конфигураций не нужно ничего настраивать
  • Его легко отодвинуть в сторону и "перекрыть" конфигурацию по умолчанию. Например, если в настройках указать хост для подключения к Монго — он автоматически перекроет localhost

Преимущества Spring Framework

Считается, что Spring Framework реализует модель разработки, основанную на лучших стандартах индустрии, и делает её доступной во многих областях Java. Таким образом к достоинствам Spring можно отнести:

  1. Относительная легкость в изучении и применении фреймворка в разработке и поддержке приложения.
  2. Внедрение зависимостей (DI) и инверсия управления (IoC) позволяют писать независимые друг от друга компоненты, что дает преимущества в командной разработке, переносимости модулей и т.д..
  3. Spring IoC контейнер управляет жизненным циклом Spring Bean и настраивается наподобие JNDI lookup (поиска).
  4. Проект Spring содержит в себе множество подпроектов, которые затрагивают важные части создания софта, такие как веб сервисы, веб программирование, работа с базами данных, загрузка файлов, обработка ошибок и многое другое. Всё это настраивается в едином формате и упрощает поддержку приложения.

Аспектно-ориентированное программирование (Aspect Oriented Programming — AOP)

Аспектно-ориентированное программирование (АОП) — это одна из “моделей программирования текущего момента” в мире Java. АОП предоставляет возможность реализации сквозной логики — т.е. логики, которая применяется к множеству частей приложения — в одном месте и обеспечения автоматического применения этой логики по всему приложению. Подход Spring к АОП заключается в создании “динамических прокси” для целевых объектов и “привязывании” объектов к конфигурированному совету для выполнения сквозной логики.

Aspect, Advice, Pointcut, JointPoint и Advice Arguments в АОП

Существуют пункты, из которых состоит аспектно-ориентированное программирование: [Источник 5]

  • Точка соединения (joinpoint) — это четко определенная точка во время выполнения приложения. Типовые примеры точек соединения включают обращение к методу, собственно Method Invocation, инициализацию класса и создание экземпляра объекта. Точки соединения являются ключевой концепцией АОП и определяют места в приложении, в которые можно вставлять дополнительную логику с использованием АОП.
  • Советы (advice). Фрагмент кода, который должен выполняться в отдельной точке соединения, представляет собой совет (advice). Существует несколько типов советов, среди которых перед, когда совет выполняется до точки соединения, и после, когда совет выполняется после точки соединения. В ООП совет принимает форму метода внутри класса.
  • Срез (pointcut) — это коллекция точек соединения, которая используется для определения ситуации, когда совет должен быть выполнен. Создавая срезы, вы получаете точный контроль над тем, как применять совет к компонентам приложения. Как упоминалось ранее, типичной точкой соединения является Method Invocation. А типичный срез представляет собой коллекцию всех точек соединения Method Invocation в отдельном классе. Часто между срезами можно установить сложные отношения, чтобы обеспечить дополнительные ограничения на то, когда будет выполнен совет.
  • Аспект (aspect) — это комбинация совета и срезов. Такая комбинация дает в результате определение логики, которая должна быть включена в приложение, и указание мест, где она должна выполняться.
  • Связывание (weaving) представляет собой процесс действительной вставки аспектов в определенную точку кода приложения. Для решений АОП времени компиляции это делается на этапе компиляции, обычно в виде дополнительного шага процесса сборки. Аналогично, для решений АОП времени выполнения связывание происходит динамически во время выполнения. В AspectJ поддерживается еще один механизм связывания под названием связывание во время загрузки (load-time weaving — LTW), который перехватывает лежащий в основе загрузчик классов JVM и обеспечивает связывание с байт-кодом, когда он загружается загрузчиком классов.
  • Цель (target) — это объект, поток выполнения которого изменяется каким-то процессом АОП. На целевой объект часто ссылаются как на объект, снабженный советом.
  • Введение (introduction) представляет собой процесс, посредством которого можно изменить структуру объекта за счет введения в него дополнительных методов или полей. Введение можно использовать для обеспечения реализации любым объектом определенного интерфейса без необходимости в том, чтобы класс этого объекта реализовывал такой интерфейс явно.

Spring Bean

Термин бин в Spring используется для ссылки на любой компонент, управляемый контейнером. Обычно бины на определенном уровне придерживаются спецификации JavaBean, но это не обязательно особенно если для связывания бинов друг с другом планируется применять Constructor Injection. Для получения экземпляра бина используется ApplicationContext. IoC контейнер управляет жизненным циклом спринг бина, областью видимости и внедрением.

Scope у Spring Bean

В Spring предусмотрены различные области времени действия бинов:

  • singleton — может быть создан только один экземпляр бина. Этот тип используется спрингом по умолчанию, если не указано другое. Следует осторожно использовать публичные свойства класса, т.к. они не будут потокобезопасными.
  • prototype — создается новый экземпляр при каждом запросе.
  • request — аналогичен prototype, но название служит пояснением к использованию бина в веб приложении. Создается новый экземпляр при каждом HTTP request.
  • session — новый бин создается в контейнере при каждой новой HTTPS (HyperText Transfer Protocol Secure) сессии.
  • global-session: используется для создания глобальных бинов на уровне сессии для Portlet приложений.

Жизненный цикл Spring Bean

Жизненный цикл Spring бина — время существования класса. Spring бины инициализируются при инициализации Spring контейнера и происходит внедрение всех зависимостей. Когда контейнер уничтожается, то уничтожается и всё содержимое. Если нам необходимо задать какое-либо действие при инициализации и уничтожении бина, то нужно воспользоваться методами init() и destroy(). Для этого можно использовать аннотации @PostConstruct и @PreDestroy().

@PostConstruct
    public void init(){
        System.out.println("Bean init method called");
    }
     
 
    @PreDestroy
    public void destroy(){
        System.out.println("Bean destroy method called");
    }

Или через xml конфигурацию:

<bean name="myBean" class="ru.javastudy.spring.MyBean"
        init-method="init" destroy-method="destroy">
    <property name="someProp" ref="someProp"></property>
</bean>

Источники

  1. Spring Framework // Spring by Pivotal [2002 — 2019]. Дата обновления: 13.02.2019. URL: https://spring.io/ (дата обращения: 26.03.2019).
  2. Spring // JavaStudy [2002 — 2019]. Дата обновления: 13.02.2019. URL: http://javastudy.ru/frameworks/spring/ (дата обращения: 26.03.2019).
  3. Spring для ленивых. Основы, базовые концепции и примеры с кодом // JavaRush [2016 — 2019]. Дата обновления: 03.01.2019. URL: https://javarush.ru/groups/posts/spring-framework-java-1 (дата обращения: 26.03.2019).
  4. Краткий обзор Spring Security // Habr [2006 — 2019]. Дата обновления: 23.11.2013. URL: https://habr.com/ru/post/203318/ (дата обращения: 06.05.2019).
  5. Собеседование по Java EE — Spring Framework // JavaStudy [2017 — 2019]. Дата обновления: 15.05.2017. URL: http://javastudy.ru/interview/jee-spring-questions-answers/ (дата обращения: 26.03.2019).