Данный гист содержит перевод документации спринга и его проектов.
-
-
Save vchernogorov/f0b3d25e07f85021a39b00ad9bab9f94 to your computer and use it in GitHub Desktop.
-
AOP (Aspect Oriented Programming) - АОП - парадигма программирования, основанная на идее разделения функциональности для улучшения разбиения программы на модули. В то время, как в ООП главной чертой модульности является класс, в АОП - это аспект.
- АОП фреймворк является одним из ключевых компонентов спринга, хоть IoC контейнер и не зависит от него.
- АОП используется для следующих целей:
- Предоставить декларативные корпоративные сервисы, в частности заменяя EJB декларативные сервисы. Один из этих сервисов является declarative transaction management.
- Позволяет пользователям реализовывать свои аспекты, дополняя ООП АОП-ом.
-
Aspect - Аспект - набор задач, разделенных между множеством классов. Управление транзакциями является хорошим примером разделения задачи в корпоративных Java приложениях.
- В АОП фреймворке аспекты реализуются при помощи регулярных классов или классов, аннотированных @Aspect аннотацией.
-
Join point - Точка входа - всегда представляет собой выполнение метода.
-
Advice - Совет - событие, выполненное одним из аспектов в конкретной точке входа.
- Существует несколько типов советов:
- Before - совет, который выполняется перед точкой входа, но не может остановить дальнейшее выполнение метода, обозначенного этой точкой.
- After returning - совет, который выполняется после return (если не было выкинуто исключение).
- After throwing - совет, который выполняется после выкидывания исключения.
- After (finally) - совет, который выполняется в любом случае после выполнения метода.
- Around - совет, который оборачивает точку входа (как например при вызове метода). Он по сути является самым мощным советом, т.к. контролирует вход и выход в точку входа.
- Многие АОП фреймворки, включая спринг, принимают совет как перехватчика, контролирующего цепочку перехватчиков вокруг точки входа.
- Существует несколько типов советов:
-
Introduction - Представление - объявляет дополнительные методы или поля в зависимости от типа.
- АОП спринга позволяет предоставлять новые интерфейсы (и соответствующую реализацию) для любого объекта совета.
-
Target object - Целевой объект - объект, который является советом для одного или более аспектов.
-
AOP proxy - АОП прокси - объект, созданный АОП фреймворком для реализации контрактов аспектов (выполнение метода совета и типо того).
- В спринге, АОП прокси является JDK dynamic proxy или CGLIB proxy.
-
Weaving - Связывание - связывание аспектов с типами или объектами приложения для создания объекта аспекта.
- Это может быть сделано во время компиляции, загрузки или выполнения. АОП спринга, как и другие Java АОП фреймворки производит связывание во время выполнения.
-
IoC (Inversion of Control) — паттерн для передачи контроля за создание объектов контейнеру.
-
DI (Dependency Injection) - процесс, в котором объекты определяют свои зависимости посредством внедрения.
- Базовые пакеты Spring IoC контейнера:
org.springframework.beans
,org.springframework.context
- Преимущества DI:
- Разделение обязанностей
- Вся работа по инициализации зависимостей выполняется инъектором
- Конфигурированные компоненты делают приложение лекго-расширяемым
- Возможность создания моков для модульного тестирования
- DI использует связывание объектов во время работы программы, а не во время компиляции.
- В спринге DI происходит через рефлексию и аннотации. Так что, все, что нужно сделать - это аннотировать поле, конструктор или сеттер и сконфигурировать их в XML или Java классе.
- Базовые пакеты Spring IoC контейнера:
-
ApplicationContext
- интерфейс, который представляет собой Spring IoC контейнер и отвечает за инстанциирование, конфигурирование и сборку бинов. Он получает инструкции о том, с какими объектами он работает, через конфигурационные метаданные, которые могут быть представлены в виде XML, Java аннотаций или Java кода.- Имплементации:
ClassPathXmlApplicationContext
,FileSystemXmlApplicationContext
,GenericApplicationContext
,GenericGroovyApplicationContext
,GenericWebApplicationContext
,GenericXmlApplicationContext
,GroovyWebApplicationContext
,ResourceAdapterApplicationContext
,StaticApplicationContext
,StaticPortletApplicationContext
,StaticWebApplicationContext
,XmlPortletApplicationContext
,XmlWebApplicationContext
- Имплементации:
-
Resource
- интерфейс, предназначенный для абстракции доступа к низкоуровневым ресурсам. [4.1]public interface InputStreamSource { InputStream getInputStream() throws IOException; } public interface Resource extends InputStreamSource { boolean exists(); boolean isOpen(); URL getURL() throws IOException; File getFile() throws IOException; Resource createRelative(String relativePath) throws IOException; String getFilename(); String getDescription(); }
getInputStream()
- находит и открывает ресурс, возвращаяInputStream
для чтения из ресурса.exists()
- проверяет, если ресурс существует физически или нет.isOpen()
- проверяет, если ресурс представляет хендл с открытым стримом.getDescription()
- возвращает описание для данного ресурса. Используется для вывода ошибок при работе с ресурсом.
-
UrlResource
служит оберткой дляjava.net.URL
, и может быть использован для доступа к любому объекту, который доступен по URL, например файлы, HTTP ссылка, FTP ссылка и т.д. [4.2] -
ClassPathResource
- реализацияResource
, которая поддерживает разрешенияjava.io.File
. Ресурс был создан Java кодом явно используя конструктор, но постоянно будет создаваться неявно, когда вы будете вызывать API метод, который принимает путь аргументом в виде строки. [4.3] -
FileSystemResource
- реализацияResource
дляjava.io.File
хэндлеров. Поддерживает разрешения изFile
и изURL
. [4.4] -
ServletContextResource
- реализацияResource
дляjava.io.File
хэндлеров. Поддерживает разрешения изFile
и изURL
. [4.5] -
InputStreamResource
- реализацияResource
для заданногоInputStream
. Она должна быть использована только в случае, если нет подходящей реализации дляResource
. [4.6]- В отличии от других реализаций
Resource
, эта является дескрипторои для уже открытого ресурса, поэтому всегда методisOpen()
этого класса возвращает true.
- В отличии от других реализаций
-
ByteArrayResource
- реализацияResource
для заданного массива байт. Она создаетByteArrayInputStream
для этого массива. [4.7]- Эффективна для загрузки содержимого из любого массива байтов, не прибегая к использованию одноразового
InputStreamResource
.
- Эффективна для загрузки содержимого из любого массива байтов, не прибегая к использованию одноразового
-
ResourceLoader
- интерфейс, предназначенный для объектов, которые могут возвращать (т.е. загружать)Resource
инстансы. [4.8]public interface ResourceLoader { Resource getResource(String location); }
- Все контексты приложений реализуют этот интерфейс, следовательно все контексты приложений могут получать
Resource
инстансы. - Примеры загрузки ресурсов:
Resource template = ctx.getResource("some/resource/path/myTemplate.txt"); Resource template = ctx.getResource("classpath:some/resource/path/myTemplate.txt"); Resource template = ctx.getResource("file:///some/resource/path/myTemplate.txt"); Resource template = ctx.getResource("http://myhost.com/resource/path/myTemplate.txt");
- Первый ресурс загружается из classpath, второй через URL из файловой системы, третий через URL, четвертый зависит от
AppliacationContext
реализации.
- Все контексты приложений реализуют этот интерфейс, следовательно все контексты приложений могут получать
-
ResourceLoaderAware
- специальный указательный интерфейс, иденцифицирующий объекты, которые ожидают реализацииResourceLoader
. [4.9]public interface ResourceLoaderAware { void setResourceLoader(ResourceLoader resourceLoader); }
- Когда класс реализует этот интерфейс и деплоится в контекст приложения (как спринговский бин), он распознается им, как
ResourceLoaderAware
. Этот контекст затем вызоветsetResourceLoader(ResourceLoader)
, предоставляя методу себя, как аргумент.
- Когда класс реализует этот интерфейс и деплоится в контекст приложения (как спринговский бин), он распознается им, как
-
Resources as dependencies - если бин обладает свойством типа
Resource
, он может быть сконфигурирован с помощью простой строки для этого ресурса. [4.10] Например:<bean id="myBean" class="..."> <property name="template" value="some/resource/path/myTemplate.txt"/> <property name="template" value="classpath:some/resource/path/myTemplate.txt"> <property name="template" value="file:///some/resource/path/myTemplate.txt"/> </bean>
- Важно заметить, что путь к первому ресурсу не обладает префиксом, поэтому каким способом будет загружен ресурс зависит от типа контекста (
ClassPathResource
,FileSystemResource
илиServletContextResource
).
- Важно заметить, что путь к первому ресурсу не обладает префиксом, поэтому каким способом будет загружен ресурс зависит от типа контекста (
-
Constructing application contexts - конструктор контекста приложения обычно принимает строку или массив строк в качестве пути к ресурсу, как например к XML файлу, который составляет определение конекста. [4.11]
- Ниже представлены примеры создания контекста приложения:
ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/appContext.xml");
- Определения бина будут загружены из classpath, так как будет использован
ClassPathResource
. Но если создатьFileSystemXmlApplicationContext
следующим образом:
ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/appContext.xml");
- Определение бина будет загружено из файловой системы, в данном случае относительно текущей рабочей директории.
ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:conf/appContext.xml");
- В этом случае контекст загрузит определение бина из classpath, однако он останется
FileSystemXmlApplicationContext
, хотя и перезапишет дефолтный типResource
, созданного для загрузки бина.
ApplicationContext ctx = new ClassPathXmlApplicationContext( new String[] {"services.xml", "daos.xml"}, MessengerService.class);
- Здесь
ClassPathXmlApplicationContext
инстанс состоит из нескольких определений бинов, указанный в service.xml и daos.xml. [4.12]
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:conf/appContext.xml");
- В данном примере демонстрируется использование вайлдкардов, для загрузки нескольких classpath ресурсов и слияния их всех в один контекст приложения. [4.13]
ApplicationContext ctx = new FileSystemXmlApplicationContext("file:///conf/context.xml");
- Так как любой путь восприниматься как относительный (
FileSystemApplicationContext
заставляет все привязанные кFileSystemResource
инстансы воспринимать пути как относитенльные, не важно со слешем они или без), то настоящий абсолютный путь будет записываться с помощью префиксаfile
. [4.14]
-
Spring Framework — обесепечивает решения многих задач, с которыми сталкиваются java-разработчики и организации, которые хотят создать информационную систему, основанную на платформе Java. Наиболее известен как источник расширений, нужных для эффективной разработки сложных бизнес-приложений вне тяжеловесных программных моделей, которые исторически были доминирующими в промышленности.
-
Beans - объекты, формирующие фундамент приложения и управляемые Spring IoC контейнером.
-
IoC (Inversion of Control) — паттерн для передачи контроля за создание объектов контейнеру.
-
Dependency Injection (DI) — процесс предоставления внешней зависимости программному компоненту. Является одним из примеров IoC.
-
IoC Container отвечает за инстанцирование, конфигурирование и сборку объектов. IoC контейнер получает информацию из XML файла и с ним же работает. Существует два типа IoC конейнеров:
BeanFactory
иApplicationContext
. -
BeanFactory Container - простейший контейнер, предоставляющий базовую поддержку для DI.
- Пример инициализации:
Resource resource = new ClassPathResource("applicationContext.xml"); BeanFactory factory = new XmlBeanFactory(resource);
-
ApplicationContext Container - этот контейнер добавляет интерпрайз функциональность поверх BeanFactory контейнера..
- Пример инициализации:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
-
AOP (Aspect Oriented Programmin) - парадигма программирования, основанная на идее разделения функциональности для улучшения разбиения программы на модули.
-
SpEL (Spring Expression Language) - мощный язык для выполнения запросов и манипуляций с графом объектов во время рантайма.
-
Spring Framework Runtime [2.1]
-
Core Container [2.2]
spring-core
- модуль, предоставляющий основные части фреймворка, включая IoC и DI особенности.spring-bean
- модуль, предоставляющийBeanFactory
контейнер, который представляет собой реализацию паттерна фабрики.spring-context
- модуль, предоставляющийApplicationContext
контейнер, построенный на основе Core и Beans модулей, который является посредником при получении доступа к любому объекту.spring-expression
- модуль, предоставляющий мощный язык Expression Language для выполнения запросов и манипуляций с графом объектов во время рантайма.
-
AOP and Instrumentation [2.3]
spring-instrument
- обеспечивает поддержку инструментария классов и реализации classloader, которые могут использоваться в некоторых серверных приложениях.spring-aop
- предоставляет реализацию аспектно-ориентированного программирования, позволяющую вам определять, например, перехватчиков методов и pointcuts, чтобы чистенько разъединить код, который реализует различную функциональность.spring-aspects
- модуль, предоставляющий интеграцию с AspectJ, который является мощным AOP фреймворком.spring-instrument-tomcat
- модуль, содержащий спринговский инструментарий для Tomcat.
-
Messaging [2.4]
spring-messaging
- модуль, предоставляющий абстракции из Spring Integration проекта, такие какMessage
,MessageChannel
,MessageHandler
и другие. Они служат основой для messaging-based приложений. Он также включает в себя набор аннотаций для маппинга сообщений в методы.
-
Data Access/Integration [2.5]
spring-jdbc
- модуль, предоставляющий уровень JDBC-абстракции, который освобождает от утомительного кодинга JDBC аспектов.spring-orm
- модуль, предоставляющий интеграционные уровни для популярных объекто-ориентированных mapping API, включая JPA, JDO, Hibernate, iBatis.spring-oxm
- модуль, предоставляющий уровень абстракции, который поддерживает Object/XML mapping реализации для JAXB, Castor, XMLBeans, JiBX и XStream.spring-jms
- модуль, содержащий фичи для создания и использования сообщений. Начиная с 4.1 версии фреймворка, он предоставляет интеграцию сspring-messaging
модулем.spring-tx
- модуль, поддерживающий программное и декларативное транзакционное управления для всех POJO и классов, которые реализуют специальные интерфейсы.
-
Web [2.6]
spring-web
- модуль, предоставляющий базовые web-ориентированые интеграционные фичи, такие как multipart file-upload функциональность и инициализация IoC контейнера используя листнеры и web-ориентированные context модули приложения.spring-webmvc
- модуль (также известный, как Web-Servlet модуль), содержащий Spring MVC и REST Web Services реализацию для веб приложений.spring-websocket
- модуль , предоставляющий поддержку для WebSocket-based приложений, для двусторонних коммуникаций между клиентами и для серверов в веб приложениях.spring-webmvc-portlet
- модуль (также известный, как Web-Portlet модуль), предоставляющий функциональность Web-Servlet модуля, а также MVC реализацию для использования в Portlet среде. Отражает функциональностьspring-webmvc
модуля.
-
Test [2.7]
spring-test
- модуль, поддерживающий тестирование Spring компонентов с использованием JUnit или TestNG фреймворков.
-
Dependency Management - процесс, включающий в себя распределение в проекте всех библиотек завимимостей в виде jar файлов, их хранение и добавление в classpaths. [2.8]
- Зависимости могут быть прямыми (например приложение зависит напрямую от Spring runtime) или косвенными (например приложение зависит от
common-dbcp
, который зависит отcommons-pool
). - Косвенные зависимости также известны как "транзитивные", и они являются наиболее сложными для идентификации и управления.
- Зависимости могут быть прямыми (например приложение зависит напрямую от Spring runtime) или косвенными (например приложение зависит от
-
Maven "Bill Of Materials" Dependency - чтобы не произошло путанницы или ошибок с версиями спринговских jar зависимостей при использовании мавена, существует концепция - "bill of materials" (BOM) зависимость. [2.9]
- Для того, чтобы убедиться, что все спринговские зависимости одинаковой версии, стоит импортировать
spring-framework-bom
зависимость. После этого отпадает необходимость писать<version>
в зависимостях спринга.
- Для того, чтобы убедиться, что все спринговские зависимости одинаковой версии, стоит импортировать
-
JCL (Jakarta Commons Logging) API - обязательная зависимость логгирования в спринге.
commons-logging
- модуль, зависимый отspring-core
модуля, реализует JCLLog
объекты. Он заставляет все прочие модули зависить от себя во время компиляции. [2.10]- Этот модуль обладает runtime алгоритмом обнаружения в classpath других фрейморков логгирования и используется один из них, который считает наиболее подходящим (хотя можно настроить, чтобы выбирать самому).
- Т.к. этот модуль уже устарел, но заменить его возможности не представляется, то единственным способом исключить этот API из фреймворка, это исключить его из
spring-core
модуля. [2.11]
-
SLF4J (Simple Logging Facade for Java) - лучше, чем
commons-logging
и эффективнее в рантайме, потому что использует время компиляции для привязок, вместо того, чтобы юзать runtime поиск. [2.12]- SLF4J предоставляет привязки для многих стандартных фреймворков логгирования, включая JCL.
- Обычно к SLF4J присоединяют Spring, а затем предоставляют явное связывание из SLF4J в Log4J.
-
Spring IO - платформа для построения приложений, предоставляющая набор зависимостей, при этом давая разработчикам полный контроль над деплоем только тех из них, которые им нужны. [1.1]
- Проект является 100% с открытым кодом.
- Одна платформа, множество возможностей: веб, интеграционные, серийные, реактивные, big data приложения.
- Упрощенная разработка в связке с Spring Boot.
- Готовые к продакшену решения "из коробки".
- Зависим только от Java SE, поддерживает Groovy, Grails и немного Java EE.
- Работает с существующими инструментами управления зависимостями, такими как Maven или Gradle.
- Работает на Java 1.7+
-
Spring Boot - генерация средств упрощения процесса конфигурации Spring приложений. Он не является средством автоматической генерации кода, а представляет собой плагин для системы автоматизации сборки проектов. [1.2]
- Плагин предоставляет возможности для тестирования и разворачивания Spring приложения.
- Предоставляет встроенный Tomcat, Jetty или Undertow (на выбор), отпадает необходимость в деполе WAR файлов.
- Работает с существующими инструментами управления зависимостями, такими как Maven или Gradle.
- Предоставляет готовый pom.xml файл для Maven.
- Конфигурирование ресурсов исходя из содержания classpath.
- Отпадает необходимость в настройке конфигураций в коде или через .xml файлы.
-
Spring Framework - обеспечивает базовую поддержку управления зависимостями, управление транзакциями веб-приложений, доступ к данным, обмен сообщениями и многое другое. [1.3]
- DI.
- AOP, включая декларативное управления транзакциями.
- Создание Spring MVC веб-приложений и RESTful веб-сервисов.
- Начальная поддержка JDBC, JPA, JMS.
- Работает на Java 1.5+ (3.х), Java 1.6+ (4.x).
-
Spring Web Services - нацелен на облегчения разработки SOAP-сервиса методом contract-airst, позволяя создавать легкоизменяемые веб-сервисы путем конфигурации XML-настроек. [1.4]
- Основан на Spring Framework, а значит поддерживает DI.
- Включает в себя такие методологии, как WS-I basic profile, contract-airst, имеет слабую связь между контрактом и реализацией.
- Мощный маппинг: распределение XML-запросов по объектам в зависимости от сообщения, SOAP Action заголовка или XPath выражения.
- Поддержка XML API: входящие XML-сообщения могут быть обработаны стандартным JAXP API, например, DOM, SAX, StAX, а также JDOM, dom4j, XOM или другими подобными инструментами.
- Гибкое XML размещение: Object/XML маппинг модуль поддерживает JAXB 1, 2, Castor, XML Beans, JiBX и XStream. И так как это отдельный модуль, то вы можете использовать его и не в веб-сервисах.
- Поддержка WS-Security.
- Сборка с помощью Maven.
-
Spring Data - упрощает использование таких технологий доступа к данным, как реляционные и нереляционные СУБД, map-reduce фреймворки и облачные сервисы. Spring Data состоит из подпроектов для конкретной СУБД. Эти проекты разработаны множеством компаниями и разработчиками, которые стоят за этими технологиями. [1.5]
- Spring Data JPA упрощает разработку JPA-приложений. Этот модуль расширяет поддержку JPA-слоя доступа к данным, а также облегчает разработку Spring-приложений, использующих технологии доступа к данным. [1.6]
- Spring Data MongoDB - предоставление совместимой и похожей на Spring модели программирования для данной СУБД, сохраняя её возможности и функциональность. [1.7]
- Spring Data Redis - предоставляет простое кофигурирование и доступ к Redis из Spring-приложений, а также предлагает низко и высокоуровневые абстракции для взаимодействия с СУБД избавление пользователя от инфраструктурных проблем. [1.8]
- Spring for Apache Hadoop - упрощает использование Apache Hadoop, предоставляя унифицированную модель конфигурирования и простое в использование API для HDFS, MapReduce, Pig и Hive. [1.9]
- Spring Data GemFire - облегчение создания высокомасштабируемых Spring-приложений, используя Pivotal GemFire как платформу распределения данных. [1.10]
- Spring Data REST позволяет обращаться к JPA-репозиториям как к REST-сервисам. [1.11]
- Spring Data JDBC Extensions - это часть проекта Spring Data. Поддержка JDBC в Spring Framework обширна и охватывает наиболее часто используемые функции. Это расширение проекта предоставляет поддержку для работы с некоторыми возможностями СУБД Oracle, а также с новыми случаями использования, такими как типобезопасные запросы с использованием Querydsl. [1.12]