Skip to content

Instantly share code, notes, and snippets.

@vchernogorov
Last active January 8, 2024 07:27
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
  • Save vchernogorov/f0b3d25e07f85021a39b00ad9bab9f94 to your computer and use it in GitHub Desktop.
Save vchernogorov/f0b3d25e07f85021a39b00ad9bab9f94 to your computer and use it in GitHub Desktop.
Spring

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 АОП фреймворки производит связывание во время выполнения.

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

Ресурсы

  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]

Spring фреймворк

  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.

Spring проекты

  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]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment