|
| 1 | +[Вопросы для собеседования](README.md) |
| 2 | + |
| 3 | +# Spring |
| 4 | + |
| 5 | ++ [Spring Core](#Spring-Core) [Junior] |
| 6 | ++ [Spring MVC](#Spring-MVC) [Junior] |
| 7 | ++ [Spring Validator](#Spring-Validator) [Junior] |
| 8 | ++ [Spring Boot](#Spring-Boot) [Junior] |
| 9 | ++ [Spring Security](#Spring-Security) [Junior] |
| 10 | ++ [Spring REST](#Spring-REST) [Junior] |
| 11 | ++ [JWT](#JWT) [Junior] |
| 12 | + |
| 13 | +## Spring Core |
| 14 | + |
| 15 | +__Framework__ - Платформа, которая определяет структуру системы (приложения) и облегчает разработку системы и их интеграцию. |
| 16 | +Фреймворк - это больше, чем просто библиотека (определяет структуру системы, предоставляет определенные паттерны разработки). |
| 17 | + |
| 18 | +__Востребованность Spring__: |
| 19 | ++ Один из самых популярных web-фреймворков в мире. |
| 20 | ++ Самый популярный Java-фреймворк. |
| 21 | ++ Java - один из самых популярных ЯП в мире. Spring обычно используется везде, где используется Java. |
| 22 | ++ Очень востребован работодателями по всему миру. |
| 23 | + |
| 24 | +Spring Framework сщстоит из множества компонентов => облегчает множество аспектов разработки приложений на Java. |
| 25 | +Компоненты: |
| 26 | ++ Контекст приложения (Application Context) и Внедрение зависимостей (Dependency Injection). |
| 27 | ++ Удобный и эффективный доступ к БД (замена JDBC). |
| 28 | ++ Компонент для разработки web-приложений на Java (Spring MVC)/ |
| 29 | ++ Множество других полезных компонентов (spring.io). |
| 30 | + |
| 31 | +__Application Context & Dependency Injection__ |
| 32 | +Типичное Java приложение - это набор Java объектов, которые взаимодействуют друг с другом и ссылаются друг на друга. |
| 33 | + |
| 34 | + |
| 35 | + |
| 36 | +Кргда Java приложение запускается, все необходимые Java объекты создаются и помещаются в оперативную память. В ходе работы приложения, объекты могут добавляться / удаляться. Также могут изменяться связи между объектами. |
| 37 | +Большое количество объектов и связей между ними встречается в любом более-менее сложном Java приложении. Spring помогает нам в работе с множеством объектов. |
| 38 | + |
| 39 | +Существуют некоторые проблемы при создании приложений, например, нужно что бы конкретный объект создавался только один раз (пример Database). Можно решить это без Spring с помощью паттерна Singleton. но для этого требуется дополнительный код. Еще одна проблема, что нужно внедрять ссылку на этот единственный объект (Database) во все остальные классы, выстроить иерархию. Можно сделать вручную, но это очень сложно и запутанно. |
| 40 | + |
| 41 | + |
| 42 | + |
| 43 | + |
| 44 | + |
| 45 | +Spring Framework дает возможность удобного и эффективного доступа к БД, предоставляет для этого множество инструментов для взаимодействия с БД. |
| 46 | +JDBC - примитивный и неудобный способ взаимодествия с БД. Он не подходит для сложных приложений, слишком низкоуровневый. |
| 47 | + |
| 48 | +__Spring MVC__ - компонент Spring Framework, который позволяет создавать Web - приложения. |
| 49 | +Щгромное количество Web - приложений в интернете работают на Spring MVC. |
| 50 | +Помимо этого, Spring MVC часто используется в качестве backend - API для мобильных приложений. |
| 51 | + |
| 52 | +## Наполнение конфигурационного файла Spring |
| 53 | +Конфигурационный файл Spring должен называться __applicationComtext.xml__ |
| 54 | + |
| 55 | +```xml |
| 56 | +<?xml version="1.0" encoding="UTF-8"?> |
| 57 | +<beans xmlns="http://www.springframework.org/schema/beans" |
| 58 | + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| 59 | + xmlns:context="http://www.springframework.org/schema/context" |
| 60 | + xsi:schemaLocation="http://www.springframework.org/schema/beans |
| 61 | + http://www.springframework.org/schema/beans/spring-beans.xsd |
| 62 | + http://www.springframework.org/schema/context |
| 63 | + http://www.springframework.org/schema/context/spring-context.xsd"> |
| 64 | + |
| 65 | + <bean id="testBean" |
| 66 | + class="ru.kirillova.springcourse.TestBean"> |
| 67 | + <constructor-arg value="Neil"/> |
| 68 | + </bean> |
| 69 | +</beans> |
| 70 | +``` |
| 71 | + |
| 72 | +Это стандартная конфигурация, которая позволяет использовать Spring Framework. |
| 73 | +В теге `<bean>` создается новый бин, у него есть `id` - уникальный идентификатор объекта, `class`- путь к классу, бин которого мы хотим создать, `TestBean` - название класса, бин которого мы хотим создать, `"ru.kirillova.springcourse.TestBean"` - соответственно сам путь до класса, ` <constructor-arg>` - передаем параметры для конструктора для создания бина. |
| 74 | + |
| 75 | +## Inversion of Control (IoC) |
| 76 | +__Инверсия управления__ |
| 77 | + |
| 78 | + |
| 79 | + |
| 80 | + |
| 81 | + |
| 82 | + |
| 83 | + |
| 84 | +__Что такое Bean?__ |
| 85 | +Это просто Java объект. Когда Java объекты создаются с помощью Spring'а они называются бинами (beans). |
| 86 | +Бины создаются из Java классов (так же, как и обычные объекты). |
| 87 | + |
| 88 | +```xml |
| 89 | +<bean id="testBean" |
| 90 | + class="ru.kirillova.springcourse.TestBean"> |
| 91 | + <constructor-arg value="Neil"/> |
| 92 | +</bean> |
| 93 | +``` |
| 94 | + |
| 95 | + |
| 96 | + |
| 97 | +`MusicPlayer` слабо зависит от интерфейса `Music`. В методе `playMusic()` видим, что `MusicPlayer` сам создает свои зависимости, даже если будем использовать Spring Framework, мы будем сами обращаться к application context'у и будем сами извлекать из него созданный бин. |
| 98 | + |
| 99 | + |
| 100 | + |
| 101 | +__Inversion of Control__ - это такой архитектурный подход, когда сущность не сама создает свои зависимости, а когда зависимости для этой сущности поставляются извне. |
| 102 | + |
| 103 | + |
| 104 | + |
| 105 | + |
| 106 | + |
| 107 | + |
| 108 | + |
| 109 | +Решние этой проблемы с помощью внедрения зависимостей (Dependency Injection) с помощью Spring Framework будет рассмотрена далее. |
| 110 | + |
| 111 | + |
| 112 | +__Смотри код в папке `spring-app1` или уроки №5,6, показано на практике внедрение зависимостей и создание бинов на примере `MusicPlayer`__ |
| 113 | + |
| 114 | + |
| 115 | +## Какие есть способы конфигурации Spring Framework? |
| 116 | ++ XML файл когфигурации (старый способ, но многие существующие приложения до сих пор его используют, будут рассмотрены несколько примеров далее с его использованием). |
| 117 | ++ Java аннотации и немного XML (современный способ). |
| 118 | ++ Вя конфигурация на Java коде (современный способ). |
| 119 | + |
| 120 | +## Типичные шаги в работе со Spring |
| 121 | ++ Создаем Java классы (будущие бины) |
| 122 | ++ Создаем и связываем бины с помощью Spring (аннотации, XML или Java код) |
| 123 | ++ При использовании, все объекты (бины) берутся из контейнера Spring |
| 124 | + |
| 125 | +## Dependency Ijection |
| 126 | +__Способы внедрения зависимостей:__ |
| 127 | ++ Через конструктор |
| 128 | ++ Через setter |
| 129 | ++ Можно внедрять ссылки или простые значения |
| 130 | ++ Можно внедрять значения из внешнего файла |
| 131 | ++ Есть множество конфигураций того, как внедрять (scope, init-method, destroy-method, factory method и т.д.) |
| 132 | ++ Можно внедрять через XML, Java-аннотации или Java код |
| 133 | ++ Процесс внедрения можно автоматизировать (Autowiring) |
| 134 | + |
| 135 | + |
| 136 | + |
| 137 | + |
| 138 | + |
| 139 | + |
| 140 | + |
| 141 | +__Что такое scope?__ |
| 142 | +scope задает то, как Spring будет создавать ваши бины. |
| 143 | +Есть такой scope, который называется __Singleton__, он используется по умолчанию. |
| 144 | +Singleton - это паттерн программирования. |
| 145 | + |
| 146 | +не указывает scope, по умолчанию Singleton: |
| 147 | + |
| 148 | +```xml |
| 149 | +<bean id="musicBean" |
| 150 | + class="ru.kirillova.springcourse.ClassicalMusic"> |
| 151 | +</bean> |
| 152 | +``` |
| 153 | + |
| 154 | ++ По умолчанию создается один объект (он создается до вызова метода `getBean()`). |
| 155 | ++ При всех вызовах `getBean()` возвращается ссылка на один и тот же единственный объект. |
| 156 | + |
| 157 | +Scope Singleton чаще всего используется тогда, когда у нашего бина нет изменяемых состояний (stateless). |
| 158 | +Потому что если будем изменять состояние у Singleton бина, столкнемся с проблемой. |
| 159 | + |
| 160 | + |
| 161 | + |
| 162 | +здесь видим, что среда разработки говорит, что Singleton используется по умолчанию, и указывать его явно нет смысла. |
| 163 | + |
| 164 | +Еще один scope, который называется __Prototype__, каждый раз раз создает новый объект при вызове `getBean()`. Используется, когда у бина есть изменяемые состояния (stateful). |
| 165 | + |
| 166 | +Другие scope'ы , такие как request, session, flobal-session, будут изучены в разделе Spring MVC. |
| 167 | + |
| 168 | +## Жизненный цикл бина (Bean Lifecycle) |
| 169 | +смотри код в папке C:\IntelliJ IDEA workspace\SpringCourse\Lesson8.InitDestroyAndFactory |
| 170 | + |
| 171 | +__Специальные методы бинов__ |
| 172 | +init-method, destroy-method, factory method |
| 173 | + |
| 174 | + |
| 175 | + |
| 176 | +__init-method__ |
| 177 | +Это метод, который запускается в ходе инициализации бина. Используется для инициализации ресурсов, обращения к внешним файлам, запуска БД. |
| 178 | + |
| 179 | +__destroy-method__ |
| 180 | +Этот метод, который запускается в ходе уничтожения бина (при завершении приложения). В этом методе обычно происходит очищение ресурсов, закрытие потоков ввода-выводы, закрытие доступа к БД. |
| 181 | + |
| 182 | + |
| 183 | + |
| 184 | +```java |
| 185 | +public class ClassicalMusic implements Music { |
| 186 | + private ClassicalMusic() {} |
| 187 | + |
| 188 | + public static ClassicalMusic getClassicalMusic() { |
| 189 | + return new ClassicalMusic(); |
| 190 | + } |
| 191 | + |
| 192 | + public void doMyInit() { |
| 193 | + System.out.println("Doing my initialization"); |
| 194 | + } |
| 195 | + |
| 196 | + public void doMyDestroy() { |
| 197 | + System.out.println("Doing my destruction"); |
| 198 | + } |
| 199 | + |
| 200 | + @Override |
| 201 | + public String getSong() { |
| 202 | + return "Hungarian Rhapsody"; |
| 203 | + } |
| 204 | +} |
| 205 | +``` |
| 206 | + |
| 207 | +__Тонкости init и destroy методов:__ |
| 208 | ++ Модификатор доступа - может быть любой у обоих методов (public, protected, private). |
| 209 | ++ Тип возвращаемого значения - может быть любой, но чаще всего используется void, т.к. нет возможности получить возвращаемое значение. |
| 210 | ++ Название метода - может быть любое. |
| 211 | ++ Аргументы метода - эти методы не должны принимать на вход какие-либо аргументы. |
| 212 | + |
| 213 | +Для бинов со scope "prototype" Spring не вызывает destroy мотод. |
| 214 | +Spring не берет на себя полный жизненный цикл бинов со scope "prototype". Spring отдает prototype бины клиенту и больше о них не заботится (в отличие от singleton бинов). |
| 215 | + |
| 216 | +__factory method__ |
| 217 | +Фабричный метод (англ. Factory Method) - это паттерн программирования. |
| 218 | +Если объекты класса создаются фабричным методом, то можно определить factory method. |
| 219 | + |
| 220 | + |
| 221 | + |
| 222 | +## Что такое Java аннотация? |
| 223 | +__Java аннотация__ - это специальный тип комментариев в вашем коде с помощью которых можно: |
| 224 | ++ Передавать какие-либо инструкции для Java компилятора (пример: @Override). |
| 225 | ++ Передавать какие-либо инструкции для анализаторов исходного кода. |
| 226 | ++ Передавать метаданные, которые могут быть использованы либо вашим Java приложением(с помощью рефлексии), либо другими приложениями или фреймворками (привет: Spring Framework). |
| 227 | + |
| 228 | + |
| 229 | + |
| 230 | +__Аннотация @Component__ |
| 231 | ++ Помечаем ей класс, если хотим, чтобы Spring создал бин из этого класса. |
| 232 | ++ Именно эту аннотацию Spring ищет, когда сканирует все ваши классы. |
| 233 | ++ Можно указать `id` для создаваемого бина, можно не указывать (тогда будет название `название_класса_с_маленькой_буквы`). |
| 234 | + |
| 235 | +При использовании аннотаций, ручное создание бинов в xml файле уже не актуально, нужно всего лишь сказать Spring чтобы он отсканировал все компоненты, включает эту операцию следующуя строка: |
| 236 | + |
| 237 | +```xml |
| 238 | +<context:component-scan base-package="ru.kirillova.springcourse" /> |
| 239 | +``` |
| 240 | + |
| 241 | +Теперь при запуске приложения Spring отсканирует все классы в пакете `springcourse` и создаст бины классов, помеченных аннотацией `@Component`. |
| 242 | + |
| 243 | +__Аннотация @Autowired__ |
| 244 | +Эта аннотация осущществляет внедрение зависимостей. |
| 245 | + |
| 246 | + |
| 247 | + |
| 248 | + |
| 249 | + |
| 250 | +Мы можем внедрять бины указывая конкретный класс, или какой-то интерфейс: |
| 251 | + |
| 252 | + |
| 253 | + |
| 254 | + |
| 255 | + |
| 256 | + |
| 257 | + |
| 258 | + |
| 259 | + |
| 260 | + |
| 261 | + |
| 262 | + |
| 263 | + |
| 264 | + |
| 265 | + |
| 266 | + |
| 267 | + |
| 268 | + |
| 269 | + |
| 270 | + |
| 271 | + |
| 272 | + |
| 273 | + |
| 274 | + |
| 275 | + |
| 276 | + |
| 277 | + |
| 278 | + |
| 279 | + |
| 280 | + |
| 281 | + |
| 282 | + |
| 283 | +## Spring MVC |
| 284 | + |
| 285 | +## Spring Validator |
| 286 | + |
| 287 | +## Spring Boot |
| 288 | + |
| 289 | +## Spring Security |
| 290 | + |
| 291 | +## Spring REST |
| 292 | + |
| 293 | +## JWT |
| 294 | + |
| 295 | + |
| 296 | + |
| 297 | + |
| 298 | + |
| 299 | + |
| 300 | + |
| 301 | + |
| 302 | + |
| 303 | + |
| 304 | + |
1 | 305 |
|
0 commit comments