Java Dev Lib

Spring

1. Spring Projects

  1. Spring IO - платформа для построения приложений, предоставляющая набор зависимостей, при этом давая разработчикам полный контроль над деплоем только тех из них, которые им нужны. [1.1]

    • Проект является 100% с открытым кодом.
    • Одна платформа, множество возможностей: веб, интеграционные, серийные, реактивные, big data приложения.
    • Упрощенная разработка в связке с Spring Boot.
    • Готовые к продакшену решения "из коробки".
    • Зависим только от Java SE, поддерживает Groovy, Grails и немного Java EE.
    • Работает с существующими инструментами управления зависимостями, такими как Maven или Gradle.
    • Работает на Java 1.7+
  2. Spring Boot - генерация средств упрощения процесса конфигурации Spring приложений. Он не является средством автоматической генерации кода, а представляет собой плагин для системы автоматизации сборки проектов. [1.2]

    • Плагин предоставляет возможности для тестирования и разворачивания Spring приложения.
    • Предоставляет встроенный Tomcat, Jetty или Undertow (на выбор), отпадает необходимость в деполе WAR файлов.
    • Работает с существующими инструментами управления зависимостями, такими как Maven или Gradle.
    • Предоставляет готовый pom.xml файл для Maven.
    • Конфигурирование ресурсов исходя из содержания classpath.
    • Отпадает необходимость в настройке конфигураций в коде или через .xml файлы.
  3. Spring Framework - обеспечивает базовую поддержку управления зависимостями, управление транзакциями веб-приложений, доступ к данным, обмен сообщениями и многое другое. [1.3]

    • DI.
    • AOP, включая декларативное управления транзакциями.
    • Создание Spring MVC веб-приложений и RESTful веб-сервисов.
    • Начальная поддержка JDBC, JPA, JMS.
    • Работает на Java 1.5+ (3.х), Java 1.6+ (4.x).
  4. 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.
  5. 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]

2. Spring Framework

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

  2. Beans - объекты, формирующие фундамент приложения и управляемые Spring IoC контейнером.

  3. IoC (Inversion of Control) — паттерн для передачи контроля за создание объектов контейнеру.

  4. Dependency Injection (DI) — процесс предоставления внешней зависимости программному компоненту. Является одним из примеров IoC.

  5. IoC Container отвечает за инстанцирование, конфигурирование и сборку объектов. IoC контейнер получает информацию из XML файла и с ним же работает. Существует два типа IoC конейнеров: BeanFactory и ApplicationContext.

  6. BeanFactory Container - простейший контейнер, предоставляющий базовую поддержку для DI.

    • Пример инициализации:
      Resource resource = new ClassPathResource("applicationContext.xml");  
      BeanFactory factory = new XmlBeanFactory(resource);
      
  7. ApplicationContext Container - этот контейнер добавляет интерпрайз функциональность поверх BeanFactory контейнера..

    • Пример инициализации:
      ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
      
  8. AOP (Aspect Oriented Programmin) - парадигма программирования, основанная на идее разделения функциональности для улучшения разбиения программы на модули.

  9. SpEL (Spring Expression Language) - мощный язык для выполнения запросов и манипуляций с графом объектов во время рантайма.

  10. Spring Framework Runtime [2.1] Spring Framweork Runtime

  11. Core Container [2.2]

    • spring-core - модуль, предоставляющий основные части фреймворка, включая IoC и DI особенности.
    • spring-bean - модуль, предоставляющий BeanFactory контейнер, который представляет собой реализацию паттерна фабрики.
    • spring-context - модуль, предоставляющий ApplicationContext контейнер, построенный на основе Core и Beans модулей, который является посредником при получении доступа к любому объекту.
    • spring-expression - модуль, предоставляющий мощный язык Expression Language для выполнения запросов и манипуляций с графом объектов во время рантайма.
  12. AOP and Instrumentation [2.3]

    • spring-instrument - обеспечивает поддержку инструментария классов и реализации classloader, которые могут использоваться в некоторых серверных приложениях.
    • spring-aop - предоставляет реализацию аспектно-ориентированного программирования, позволяющую вам определять, например, перехватчиков методов и pointcuts, чтобы чистенько разъединить код, который реализует различную функциональность.
    • spring-aspects - модуль, предоставляющий интеграцию с AspectJ, который является мощным AOP фреймворком.
    • spring-instrument-tomcat - модуль, содержащий спринговский инструментарий для Tomcat.
  13. Messaging [2.4]

    • spring-messaging - модуль, предоставляющий абстракции из Spring Integration проекта, такие как Message, MessageChannel, MessageHandler и другие. Они служат основой для messaging-based приложений. Он также включает в себя набор аннотаций для маппинга сообщений в методы.
  14. 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 и классов, которые реализуют специальные интерфейсы.
  15. 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 модуля.
  16. Test [2.7]

    • spring-test - модуль, поддерживающий тестирование Spring компонентов с использованием JUnit или TestNG фреймворков.
  17. Dependency Management - процесс, включающий в себя распределение в проекте всех библиотек завимимостей в виде jar файлов, их хранение и добавление в classpaths. [2.8]

    • Зависимости могут быть прямыми (например приложение зависит напрямую от Spring runtime) или косвенными (например приложение зависит от common-dbcp, который зависит от commons-pool).
    • Косвенные зависимости также известны как "транзитивные", и они являются наиболее сложными для идентификации и управления.
  18. Maven "Bill Of Materials" Dependency - чтобы не произошло путанницы или ошибок с версиями спринговских jar зависимостей при использовании мавена, существует концепция - "bill of materials" (BOM) зависимость. [2.9]

    • Для того, чтобы убедиться, что все спринговские зависимости одинаковой версии, стоит импортировать spring-framework-bom зависимость. После этого отпадает необходимость писать <version> в зависимостях спринга.
  19. JCL (Jakarta Commons Logging) API - обязательная зависимость логгирования в спринге.

    • commons-logging - модуль, зависимый от spring-core модуля, реализует JCL Log объекты. Он заставляет все прочие модули зависить от себя во время компиляции. [2.10]
    • Этот модуль обладает runtime алгоритмом обнаружения в classpath других фрейморков логгирования и используется один из них, который считает наиболее подходящим (хотя можно настроить, чтобы выбирать самому).
    • Т.к. этот модуль уже устарел, но заменить его возможности не представляется, то единственным способом исключить этот API из фреймворка, это исключить его из spring-core модуля. [2.11]
  20. SLF4J (Simple Logging Facade for Java) - лучше, чем commons-logging и эффективнее в рантайме, потому что использует время компиляции для привязок, вместо того, чтобы юзать runtime поиск. [2.12]

    • SLF4J предоставляет привязки для многих стандартных фреймворков логгирования, включая JCL.
    • Обычно к SLF4J присоединяют Spring, а затем предоставляют явное связывание из SLF4J в Log4J.

3. IoC container

  1. IoC (Inversion of Control) — паттерн для передачи контроля за создание объектов контейнеру.

  2. DI (Dependency Injection) - процесс, в котором объекты определяют свои зависимости посредством внедрения.

    • Базовые пакеты Spring IoC контейнера: org.springframework.beans, org.springframework.context
    • Преимущества DI:
      • Разделение обязанностей
      • Вся работа по инициализации зависимостей выполняется инъектором
      • Конфигурированные компоненты делают приложение лекго-расширяемым
      • Возможность создания моков для модульного тестирования
    • DI использует связывание объектов во время работы программы, а не во время компиляции.
    • В спринге DI происходит через рефлексию и аннотации. Так что, все, что нужно сделать - это аннотировать поле, конструктор или сеттер и сконфигурировать их в XML или Java классе.
  3. ApplicationContext - интерфейс, который представляет собой Spring IoC контейнер и отвечает за инстанциирование, конфигурирование и сборку бинов. Он получает инструкции о том, с какими объектами он работает, через конфигурационные метаданные, которые могут быть представлены в виде XML, Java аннотаций или Java кода.

    • Имплементации: ClassPathXmlApplicationContext, FileSystemXmlApplicationContext, GenericApplicationContext, GenericGroovyApplicationContext, GenericWebApplicationContext, GenericXmlApplicationContext, GroovyWebApplicationContext, ResourceAdapterApplicationContext, StaticApplicationContext, StaticPortletApplicationContext, StaticWebApplicationContext, XmlPortletApplicationContext, XmlWebApplicationContext

4. Resources

  1. 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() - возвращает описание для данного ресурса. Используется для вывода ошибок при работе с ресурсом.
  2. UrlResource служит оберткой для java.net.URL, и может быть использован для доступа к любому объекту, который доступен по URL, например файлы, HTTP ссылка, FTP ссылка и т.д. [4.2]

  3. ClassPathResource - реализация Resource, которая поддерживает разрешения java.io.File. Ресурс был создан Java кодом явно используя конструктор, но постоянно будет создаваться неявно, когда вы будете вызывать API метод, который принимает путь аргументом в виде строки. [4.3]

  4. FileSystemResource - реализация Resource для java.io.File хэндлеров. Поддерживает разрешения из File и из URL. [4.4]

  5. ServletContextResource - реализация Resource для java.io.File хэндлеров. Поддерживает разрешения из File и из URL. [4.5]

  6. InputStreamResource - реализация Resource для заданного InputStream. Она должна быть использована только в случае, если нет подходящей реализации для Resource. [4.6]

    • В отличии от других реализаций Resource, эта является дескрипторои для уже открытого ресурса, поэтому всегда метод isOpen() этого класса возвращает true.
  7. ByteArrayResource - реализация Resource для заданного массива байт. Она создает ByteArrayInputStream для этого массива. [4.7]

    • Эффективна для загрузки содержимого из любого массива байтов, не прибегая к использованию одноразового InputStreamResource.
  8. 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 реализации.
  9. ResourceLoaderAware - специальный указательный интерфейс, иденцифицирующий объекты, которые ожидают реализации ResourceLoader. [4.9]

    public interface ResourceLoaderAware {
     void setResourceLoader(ResourceLoader resourceLoader);
    }
    
    • Когда класс реализует этот интерфейс и деплоится в контекст приложения (как спринговский бин), он распознается им, как ResourceLoaderAware. Этот контекст затем вызовет setResourceLoader(ResourceLoader), предоставляя методу себя, как аргумент.
  10. 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).
  11. 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]

5. Validation, Data Binding, and Type Conversion


6. SpEL


7. AOP

  1. AOP (Aspect Oriented Programming) - АОП - парадигма программирования, основанная на идее разделения функциональности для улучшения разбиения программы на модули. В то время, как в ООП главной чертой модульности является класс, в АОП - это аспект.

    • АОП фреймворк является одним из ключевых компонентов спринга, хоть IoC контейнер и не зависит от него.
    • АОП используется для следующих целей:
      • Предоставить декларативные корпоративные сервисы, в частности заменяя EJB декларативные сервисы. Один из этих сервисов является declarative transaction management.
      • Позволяет пользователям реализовывать свои аспекты, дополняя ООП АОП-ом.
  2. Aspect - Аспект - набор задач, разделенных между множеством классов. Управление транзакциями является хорошим примером разделения задачи в корпоративных Java приложениях.

    • В АОП фреймворке аспекты реализуются при помощи регулярных классов или классов, аннотированных @Aspect аннотацией.
  3. Join point - Точка входа - всегда представляет собой выполнение метода.

  4. Advice - Совет - событие, выполненное одним из аспектов в конкретной точке входа.

    • Существует несколько типов советов:
      • Before - совет, который выполняется перед точкой входа, но не может остановить дальнейшее выполнение метода, обозначенного этой точкой.
      • After returning - совет, который выполняется после return (если не было выкинуто исключение).
      • After throwing - совет, который выполняется после выкидывания исключения.
      • After (finally) - совет, который выполняется в любом случае после выполнения метода.
      • Around - совет, который оборачивает точку входа (как например при вызове метода). Он по сути является самым мощным советом, т.к. контролирует вход и выход в точку входа.
    • Многие АОП фреймворки, включая спринг, принимают совет как перехватчика, контролирующего цепочку перехватчиков вокруг точки входа.
  5. Introduction - Представление - объявляет дополнительные методы или поля в зависимости от типа.

    • АОП спринга позволяет предоставлять новые интерфейсы (и соответствующую реализацию) для любого объекта совета.
  6. Target object - Целевой объект - объект, который является советом для одного или более аспектов.

  7. AOP proxy - АОП прокси - объект, созданный АОП фреймворком для реализации контрактов аспектов (выполнение метода совета и типо того).

    • В спринге, АОП прокси является JDK dynamic proxy или CGLIB proxy.
  8. Weaving - Связывание - связывание аспектов с типами или объектами приложения для создания объекта аспекта.

    • Это может быть сделано во время компиляции, загрузки или выполнения. АОП спринга, как и другие Java АОП фреймворки производит связывание во время выполнения.

8. Spring AOP APIs


9. Unit Testing


10. Integration Testing


11. Transaction Management


12. DAO


13. JDBC


14. ORM


15. O/X Mappers


16. Web MVC


17. View technologies


18. Integrating with other web frameworks


19. Portlet MVC


20. WebSocket


21. CORS


22. Web Services


23. EJB


24. JMS


25. JCA CCI


26. Email


27. Task Execution and Scheduling


28. Dynamic language support


29. Cache Abstraction


30. Classic Spring Usage


31. Classic Spring AOP Usage


32. XML Schema-based configuration


33. Extensible XML authoring


34. Spring REST


Sources

  1. http://www.journaldev.com/2394/java-dependency-injection-design-pattern-example-tutorial

© Copyright 2016 Chernogorov Vladislav