Объектноориентированное программирование. Лекция 1

Содержание

Слайд 2

План Spring JDK Среда разработки и создание проекта Inversion of Control Dependency Injection

План

Spring
JDK
Среда разработки и создание проекта
Inversion of Control
Dependency Injection

Слайд 3

Spring Spring – это фреймворк, предназначенный для более быстрого и простого построения Java приложений.

Spring

Spring – это фреймворк, предназначенный для более быстрого и простого построения

Java приложений.
Слайд 4

Spring Spring предоставляет каркас вашего будущего приложения. При этом фреймворк диктует

Spring

Spring предоставляет каркас вашего будущего приложения. При этом фреймворк диктует вам

правила построения приложения – есть определенная архитектура приложения, в которую вам нужно встроить свою функциональность.
Эта функциональность собственно и будет бизнес логикой вашего приложения. В состав Spring входит много подпроектов, «заточенных» под определенную функциональность (SpringMVC, Spring Security, SpringData и др. полный список можно увидеть по адресу https://spring.io/projects), из которых разработчик может выбрать наиболее подходящий ему, а остальные не использовать – это модульный принцип построения приложения;
Слайд 5

Spring Как видно, у спринга модульная структура. Это позволяет подключать только

Spring

Как видно, у спринга модульная структура. Это позволяет подключать только те

модули, что нам нужны для нашего приложения и не подключать те, которыми мы заведомо не будем пользоваться.
На изображении видно, что спринг фреймворк состоит как-бы из нескольких модулей:
data access;
web;
core;
и других.
Как можно было догадаться, модуль data access содержит в себе средства для работы с данными (в основном, с базами данных), web — для работы в сети.
Кроме того, есть еще так-называемая целая спринг-инфраструктура: множество других проектов, которые не входят в сам фреймворк официально, но при этом бесшовно интегрируются в ваш проект на спринге (например, spring security для работы с авторизацией пользователей на сайте).
Слайд 6

Spring В приложении на основе Spring объекты слабосвязаны за счет использования

Spring

В приложении на основе Spring объекты слабосвязаны за счет использования внедрения

зависимостей. Одной из целью создания Spring было разорвать зависимость одних объектов от других.
Что такое зависимость? Это когда объект Object1 использует методы другого объекта Object2, т.е объект Object1 зависит от объекта Object2, чьи методы он использует. А почему он зависит? А потому, что пока объект Object2 не создан, Object1 не сможет реализовать свою функциональность.
Как разорвать зависимость? В объект Object1 «внедрить» ссылку на объект Object2 через конструктор или сеттер. Этот процесс собственно и есть внедрение зависимости. При этом важно помнить, что в Spring объекты необходимо строить на основе интерфейсов, что бы зависимости внедряются в виде интерфейса для возможной последующей замены реализации.
Слайд 7

Spring Spring освобождает не только от необходимости создавать объекты, но и

Spring

Spring освобождает не только от необходимости создавать объекты, но и связывать

их.
Например аннотация @Autowired позволяет автоматически связывать компоненты. Аннотацию спринга @Autowired можно было бы описать по-простому так - дорогой друг, контейнер спринг, посмотри пожалуйста в своей мапе с бинами, нет ли у тебя там класса instanceof or implements того, перед чем я стою. Если есть - дай мне ссылку в поле, перед которым я объявлена.
Автоматическое связывание позволяет уменьшить количество кода при определении зависимостей компонентов;
Слайд 8

Spring в Spring настройки компонентов отделены от программного кода. Вынесение конфигурации

Spring

в Spring настройки компонентов отделены от программного кода. Вынесение конфигурации (управление

зависимостями) в отдельный файл облегчает последующие изменения в проекте (замена реализаций):
улучшенная возможность тестирования. Когда классы проектируются на основе DI (Dependency Injection) и интерфейсов, становится возможной простая замена зависимостей (фейковыми реализациями) при тестировании;
возможность программирования в декларативном стиле с помощью аннотаций уменьшает количество кода в приложении;
поддержка и хорошая интеграция с технологиями доступа к данным, транзакциями, AOP (Аспектно-ориентированное программирование) упрощает разработку;
хорошее документирование очень помогает при отладке приложения;
Слайд 9

JDK Для разработки на языке программирования Java нам потребуется специальный комплект

JDK

Для разработки на языке программирования Java нам потребуется специальный комплект инструментов,

который называется JDK или Java Development Kit.
JVM (Java Virtual Machine) - виртуальная машина Java - основная часть исполняющей системы Java, так называемой Java Runtime Environment (JRE). Виртуальная машина Java исполняет байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java (javac). JVM обеспечивает платформо-независимый способ выполнения кода. Программисты могут писать код не задумываясь как и где он будет выполняться.
JRE (Java Runtime Environment) - минимальная реализация виртуальной машины, необходимая для исполнения Java -приложений, без компилятора и других средств разработки. Состоит из виртуальной машины и библиотек Java классов.
JDK (Java Development Kit) - комплект разработчика приложений на языке Java, включающий в себя компилятор, стандартные библиотеки классов Java, примеры, документацию, различные утилиты и исполнительную систему JRE
Слайд 10

JDK Однако стоит отметить, что существуют разные реализации JDK, хотя все

JDK

Однако стоит отметить, что существуют разные реализации JDK, хотя все они

используют один и тот же язык - Java. Две наиболее популярных реализации - Oracle JDK и OpenJDK. В чем их разница?
Oracle JDK всецело развивается компанией Oracle. OpenJDK же развивается как компанией Oracle, так и еще рядом компаний совместно.
Наибольшие различия с точки зрения лицензирования. Согласно лицензии Oracle JDK можно использовать бесплатно для персональных нужд, а также для разработки, тестирования и демонстрации приложений. В остальных случаях (например, для получения поддержки) необходима коммерческая лицензия в виде подписки. А OpenJDK полностью бесплатна.
Слайд 11

Среда разработки IntelliJ IDEA — интегрированная среда разработки программного обеспечения для

Среда разработки

IntelliJ IDEA — интегрированная среда разработки программного обеспечения для многих

языков программирования, в частности Java, JavaScript, Python, разработанная компанией JetBrains.
Начиная с версии 9.0, среда доступна в двух редакциях: Community Edition и Ultimate Edition.
Community Edition является полностью свободной версией, доступной под лицензией Apache 2.0, в ней реализована полная поддержка Java SE, Kotlin, Groovy, Scala, а также интеграция с наиболее популярными системами управления версиями. В редакции Ultimate Edition, доступной под коммерческой лицензией, реализована поддержка Java EE, UML-диаграмм, подсчёт покрытия кода, а также поддержка других систем управления версиями, языков и фреймворков.
Слайд 12

Среда разработки NetBeans IDE — свободная интегрированная среда разработки приложений (IDE)

Среда разработки

NetBeans IDE — свободная интегрированная среда разработки приложений (IDE) на

языках программирования Java, Python, PHP, JavaScript, C, C++, Ада и ряда других.
Проект NetBeans IDE поддерживается и спонсируется компанией Oracle, однако разработка NetBeans ведётся независимым сообществом разработчиков-энтузиастов (NetBeans Community) и компанией NetBeans Org.
Последние версии NetBeans IDE поддерживают рефакторинг, профилирование, выделение синтаксических конструкций цветом, автодополнение набираемых конструкций на лету и множество предопределённых шаблонов кода.
Для разработки программ в среде NetBeans и для успешной инсталляции и работы самой среды NetBeans должен быть предварительно установлен Sun JDK или J2EE SDK подходящей версии. Среда разработки NetBeans по-умолчанию поддерживала разработку для платформ J2SE и J2EE. Начиная с версии 6.0 NetBeans поддерживает разработку для мобильных платформ J2ME, C++ (только g++) и PHP без установки дополнительных компонентов.
Слайд 13

Создание проекта в IntelliJ IDEA

Создание проекта в IntelliJ IDEA

Слайд 14

Создание проекта в IntelliJ IDEA

Создание проекта в IntelliJ IDEA

Слайд 15

Создание проекта в IntelliJ IDEA

Создание проекта в IntelliJ IDEA

Слайд 16

Создание проекта в IntelliJ IDEA Метод sayHello() принимает параметр имени и

Создание проекта в IntelliJ IDEA

Метод sayHello() принимает параметр имени и

возвращает слово Hello в сочетании со значением параметра. Все остальное обрабатывается добавлением аннотаций Spring:
Аннотация @RestController отмечает класс DemoApplication как обработчик запроса (контроллер REST).
Аннотация @GetMapping ("/ hello") отображает метод sayHello () на запросы GET для / hello.
Аннотация @RequestParam сопоставляет параметр метода имени с параметром веб-запроса myName. Если вы не укажете параметр myName в своем веб-запросе, по умолчанию он будет иметь значение World.
Слайд 17

Создание проекта в IntelliJ IDEA Запускаем приложение Вывод в терминал ?

Создание проекта в IntelliJ IDEA

Запускаем приложение
Вывод в терминал ?

Слайд 18

Создание проекта в IntelliJ IDEA Получаем ответ от сервера

Создание проекта в IntelliJ IDEA

Получаем ответ от сервера

Слайд 19

Создание проекта start.spring.io Заходим на сайт https://start.spring.io/ Прописываем аналогичные характеристики проекта и скачиваем архив

Создание проекта start.spring.io

Заходим на сайт
https://start.spring.io/
Прописываем аналогичные характеристики проекта и скачиваем архив

Слайд 20

Создание проекта start.spring.io Заходим на сайт https://start.spring.io/ Прописываем аналогичные характеристики проекта и скачиваем архив

Создание проекта start.spring.io

Заходим на сайт
https://start.spring.io/
Прописываем аналогичные характеристики проекта и скачиваем архив

Слайд 21

Создание проекта start.spring.io Заходим на сайт https://start.spring.io/ Прописываем аналогичные характеристики проекта и скачиваем архив

Создание проекта start.spring.io

Заходим на сайт
https://start.spring.io/
Прописываем аналогичные характеристики проекта и скачиваем архив

Слайд 22

Inversion of Control Рассмотрим простейший пример. Создадим примитивный класс с единственным методом.

Inversion of Control

Рассмотрим простейший пример. Создадим примитивный класс с единственным методом.

Слайд 23

Inversion of Control Создаем класс с функцией main и проверяем работоспособность ранее созданного класса.

Inversion of Control

Создаем класс с функцией main и проверяем работоспособность ранее

созданного класса.
Слайд 24

Inversion of Control Предположим, что мы хотим, чтобы не только собаки,

Inversion of Control

Предположим, что мы хотим, чтобы не только собаки, но

и другие животные издавали звуки. Чтобы реализовать это грамотно используем интерфейс Pet.
Далее возвращаемся в класс Dog и имплементируем интерфейс Pet.
Слайд 25

Inversion of Control Заменяем тип в классе Test и получаем ожидаемый результат. Все по-прежнему работает.

Inversion of Control

Заменяем тип в классе Test и получаем ожидаемый результат.

Все по-прежнему работает.
Слайд 26

Inversion of Control Создадим аналогичный класс Cat. И выведем его в

Inversion of Control

Создадим аналогичный класс Cat. И выведем его в классе

Test.
Чтобы каждый раз не менять код, чтобы услышать очередное животное, а соответственно, чтобы не было нужды в перекомпиляции, самым лучшим решением будет вынести эти детали, например, какое животное будет говорить в отдельный файл.
Конфигурационный файл.
Слайд 27

Inversion of Control Как это будет работать в Spring? Ответственным за

Inversion of Control

Как это будет работать в Spring?
Ответственным за создание и

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

Spring container

Слайд 28

Inversion of Control Контейнер будет читать наш конфигурационный файл, и в

Inversion of Control

Контейнер будет читать наш конфигурационный файл, и в контейнере

будет создаваться тот объект(ы), которые мы опишем.

Spring container

Configuration file

Слайд 29

Inversion of Control Таким образом в конфиг. файле мы описываем наш

Inversion of Control

Таким образом в конфиг. файле мы описываем наш объект,

например: Dog, Cat и т.д. Spring container их создает, содержит.

Spring container

Configuration file

Dog

Cat


Слайд 30

Inversion of Control И когда такой объект понадобится классу Test, он

Inversion of Control

И когда такой объект понадобится классу Test, он получит

его напрямую из контейнера.
В классе Test объекты не создаются!

Spring container

Configuration file

Dog

Cat


Test

Слайд 31

Inversion of Control Основные функции, которые выполняет Spring Container: IoC –

Inversion of Control

Основные функции, которые выполняет Spring Container:
IoC – инверсия управления,

создание и управление объектами
DI – Dependency Injection (Внедрение зависимостей)
IoC – аутсорсинг создания и управления объектами, т.е. передача прав на создание и управление Spring-у
Слайд 32

Inversion of Control Создадим папку resources файл applicationContext со следующим содержимым:

Inversion of Control

Создадим папку resources файл applicationContext со следующим содержимым:

encoding="UTF-8"?>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

Слайд 33

Inversion of Control Конфигурация XML файла: class = “полное название класса”>

Inversion of Control

Конфигурация XML файла:
class = “полное название

класса”>

Слайд 34

Inversion of Control

Inversion of Control

Слайд 35

Inversion of Control Spring bean (или просто bean) – это объект,

Inversion of Control

Spring bean (или просто bean) – это объект, который

создается и управляется Spring Container.
ApplicationContext представляет собой Spring Container. Поэтому для получения бина из Spring Container нам нужно создать ApplicationContext.
Слайд 36

Inversion of Control Создаем контекст и получаем их него объект

Inversion of Control

Создаем контекст и получаем их него объект

Слайд 37

Inversion of Control Запускаем

Inversion of Control

Запускаем

Слайд 38

Inversion of Control Стоит отметить, что если мы захотим поменять класс

Inversion of Control

Стоит отметить, что если мы захотим поменять класс Dog

на Cat и вызвать его, перекомпиляция нам не потребуется, также как и изменение класса Test. Необходимо будет изменить только конфигурацию.
Слайд 39

Dependency Injection Начнем с простого примера. Допустим, у нас есть объект

Dependency Injection

Начнем с простого примера. Допустим, у нас есть объект employee

(работник), а у него есть машина, объект car.

employee

car

Слайд 40

Dependency Injection То есть при создании объекта employee, он имеет ссылку

Dependency Injection

То есть при создании объекта employee, он имеет ссылку на

объект car. Это называется зависимостью. Теперь представим, что у нас сложное приложение со множеством зависимостей, которые мы создаем вручную.
Слайд 41

Dependency Injection Например, у нашего employee есть еще ряд зависимостей. Получается,

Dependency Injection

Например, у нашего employee есть еще ряд зависимостей. Получается, что

для создания employee необходимо создать все эти объекты. Легко запутаться и много лишнего кода.

employee

car

house

pet

door

window

wall

Слайд 42

Dependency Injection Вместо этого можно все описать в конфиг. файле, и

Dependency Injection

Вместо этого можно все описать в конфиг. файле, и потом

в Spring Container создаются описанные объекты, и Spring без нашего участия внедряет эти зависимости.

employee

car

house

pet

door

window

wall

Слайд 43

Dependency Injection Для демонстрации создадим класс Person. Это будет хозяин домашнего

Dependency Injection

Для демонстрации создадим класс Person. Это будет хозяин домашнего животного.

У него будет единственный метод – позвать животное, при котором оно будет откликаться.
Слайд 44

Dependency Injection Без применения Spring работа с этим классом выглядела бы следующим образом.

Dependency Injection

Без применения Spring работа с этим классом выглядела бы следующим

образом.
Слайд 45

Dependency Injection Модифицируем код с применением уже имеющихся знаний о Spring

Dependency Injection

Модифицируем код с применением уже имеющихся знаний о Spring Container

и созданного bean.
Обратите внимание, что для изменения животного опять достаточно поменять конфиг. файл.
Но проблема с person не решена, мы по-прежнему создаем его вручную.
Слайд 46

Dependency Injection Вернемся к упомянутой выше концепции. На рисунке показана сборка

Dependency Injection

Вернемся к упомянутой выше концепции. На рисунке показана сборка объекта

employee из составляющих его элементов.

employee

car

house

pet

door

window

wall

Слайд 47

Dependency Injection Dependency Injection – это аутсорсинг добавления/внедрения зависимостей. DI делает

Dependency Injection

Dependency Injection – это аутсорсинг добавления/внедрения зависимостей. DI делает объекты

нашего приложения слабо зависимыми друг от друга.
Способы внедрения зависимостей:
с помощью конструктора
с помощью сеттеров
Autowiring
Слайд 48

Dependency Injection DI с помощью конструктора. Добавим bean myPerson. Внутри него

Dependency Injection

DI с помощью конструктора. Добавим bean myPerson. Внутри него создадим

тег constructor-arg и передадим ссылку на уже созданный ранее bean myPet.
Слайд 49

Dependency Injection Теперь нам достаточно получить bean myPerson. В bean уже

Dependency Injection

Теперь нам достаточно получить bean myPerson. В bean уже будет

внедрена зависимость.
С объектом Pet мы в коде уже не сталкиваемся.
Слайд 50

Dependency Injection DI с помощью сеттера. Добавим сеттер в класс Person,

Dependency Injection

DI с помощью сеттера. Добавим сеттер в класс Person, создадим

конструктор без параметров и закомментируем старый конструктор.
Слайд 51

Dependency Injection Видоизменим bean.

Dependency Injection

Видоизменим bean.

Слайд 52

Dependency Injection Запускаем класс Test2. Обратите внимание, что в нем не изменилось абсолютно ничего. Вывод корректен.

Dependency Injection

Запускаем класс Test2. Обратите внимание, что в нем не изменилось

абсолютно ничего. Вывод корректен.
Слайд 53

Dependency Injection Внедрение строк и других значений. Добавим имя и возраст

Dependency Injection

Внедрение строк и других значений. Добавим имя и возраст в

наш класс Person. И редактируем bean.
Слайд 54

Dependency Injection Выведем заданные параметры при помощи геттеров.

Dependency Injection

Выведем заданные параметры при помощи геттеров.

Слайд 55

Dependency Injection Внедрение строк и других значений из properties файла. Для

Dependency Injection

Внедрение строк и других значений из properties файла. Для начала

создадим файл myApp.properties и пропишем в нем значения.
Слайд 56

Dependency Injection Добавляем контекст в наш конфигурационный файл. Теперь мы можем обращаться к значениям из properties.

Dependency Injection

Добавляем контекст в наш конфигурационный файл. Теперь мы можем обращаться

к значениям из properties.