Spring Flashcards

1
Q

Что такое Spring Framework? На чем он базируется?

A

Spring — это фреймворк с открытым исходным кодом для разработки приложений на Java. Фреймворк нацелен на упрощение использования Java в разработке и улучшение практики программирования.
Spring - крупный фреймворк, потому что создатели этого фреймворка ухитрились охватить практически все аспекты программирования промышленных Java-приложений.
Составные части (компоненты) Spring Framework:
* IoC (Inversion of Control) контейнер;
* AOP-фреймворк (включая интеграцию с AspectJ);
* Data Access фреймворк;
* Transaction management;
* MVC-фреймворк;
* Remote Access фреймворк;
* Batch processing;
* Spring Security;
* Remote Management;
* Messaging-фреймворк;
* Testing-фреймворк.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Каковы преимущества использования Spring?

A
  • Легкость — он относительно легкий, когда дело касается размера и прозрачности. Базовая версия Spring Framework составляет около 2 МБ.
  • Инверсия управления (Inversion of control, IOC) — слабая связанность достигается в Spring с использованием техники инверсии управления. Объекты предоставляют свои зависимости вместо того, чтобы создавать или искать зависимые объекты.
  • Аспектно-ориентированность — Spring поддерживает аспектно-ориентированное программирование и обеспечивает согласованную разработку, отделяя бизнес-логику приложения от системных служб.
  • Контейнеры — Spring Container создаёт объекты, связывает их вместе, настраивает и управляет ими от создания до момента удаления.
  • MVC Framework — это хорошо спроектированный веб-фреймворк MVC, который обеспечивает альтернативу другим излишне спроектированным или менее популярным веб-фреймворкам.
  • Управление транзакциями — Spring имеет согласованный интерфейс управления транзакциями, который может масштабироваться до локальной транзакции или глобальных транзакций.
  • Обработка исключений — Spring предоставляет удобный API для преобразования исключений, связанных с конкретной технологией (например, вызванных JDBC, Hibernate или JDO) в согласованные, непроверенные исключения.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Какие подпроекты Spring вы знаете? Кратко опишите их.

A
  • Core — ключевой модуль, обеспечивающий основные части платформы, такие как IoC или DI.
  • JDBC - включает уровень абстракции JDBC, который устраняет необходимость кодирования JDBC для баз данных конкретных поставщиков.
  • Интеграция ORM — обеспечивает уровни интеграции для популярных API объектно-реляционного сопоставления, таких как JPA, JDO и Hibernate.
  • Web - веб-ориентированный модуль интеграции, который обеспечивает многокомпонентную загрузку файлов, прослушиватели сервлетов и функции контекста веб-приложений.
  • Платформа MVC - веб-модуль, реализующий шаблон проектирования Model View Controller.
  • Модуль АОП - реализация аспектно-ориентированного программирования, позволяющая определять чистые перехватчики методов и точки.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что такое Inversion of control и какие реализации существуют? В чем идея инверсии управления?

A

Инверсия управления — это принцип разработки программного обеспечения, который передает управление объектами или частями программы контейнеру или фреймворку. Чаще всего мы используем его в контексте объектно-ориентированного программирования.
В отличие от традиционного программирования, в котором наш пользовательский код обращается к библиотеке, IoC позволяет фреймворку управлять потоком программы и выполнять вызовы нашего пользовательского кода. Для этого фреймворки используют абстракции со встроенным дополнительным поведением. Если мы хотим добавить собственное поведение, нам нужно расширить классы фреймворка или добавить наши собственные классы.
Преимущества этой архитектуры:
* отделение выполнения задачи от ее выполнения
* упрощение переключения между различными реализациями
* большая модульность программы
* более простое тестирование программы за счет изоляции компонента или имитации его зависимостей и предоставления компонентам возможности взаимодействовать через контракты.
Есть несколько реализаций инверсии управления:
* шаблон проектирования стратегии
* шаблон фабрики
* шаблон локатора сервисов
* внедрение зависимостей.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

В чем разница между IOC и Dependency Injection? Преимущества Dependency Injection?

A

Inversion of Control (инверсия управления) — это некий абстрактный принцип, набор рекомендаций для написания слабо связанного кода. Суть которого в том, что каждый компонент системы должен быть как можно более изолированным от других, не полагаясь в своей работе на детали конкретной реализации других компонентов.
Dependency Injection (внедрение зависимостей) — это одна из реализаций этого принципа; это шаблон, который мы можем использовать для реализации IoC, представляет собой общую концепцию, утверждающую, что мы не создаем наши объекты вручную, а вместо этого описываем, как они должны создаваться. Затем контейнер IoC будет создавать экземпляры необходимых классов, если это необходимо.
Внедрение внедрения зависимостей дает вам следующие преимущества:
* Возможность повторного использования кода
* Легкость рефакторинга
* Легкость тестирования

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Что такое IOC Spring контейнер?

A

IoC-контейнер — это какая-то библиотека, фреймворк, программа, которая позволит вам упростить и автоматизировать написание кода с использованием данного подхода на столько, на сколько это возможно.
Контейнер IoC является общей характеристикой фреймворков, реализующих IoC.
В среде Spring интерфейс ApplicationContext представляет контейнер IoC. Контейнер Spring отвечает за создание, настройку и сборку объектов, известных как bean -компоненты, а также за управление их жизненными циклами.
Платформа Spring предоставляет несколько реализаций интерфейса ApplicationContext: ClassPathXmlApplicationContext и FileSystemXmlApplicationContext для автономных приложений и WebApplicationContext для веб-приложений.
Для сборки bean-компонентов контейнер использует метаданные конфигурации, которые могут быть в форме XML-конфигурации или аннотаций.
Вот один из способов вручную создать экземпляр контейнера:
ApplicationContext context = new ClassPathXmlApplicationContext(“applicationContext.xml”);
Чтобы установить атрибут элемента в приведенном выше примере, мы можем использовать метаданные. Затем контейнер будет читать эти метаданные и использовать их для сборки bean-компонентов во время выполнения.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Как Spring загружает классы из контекста?

A

Используется стандартный механизм загрузки классов Java: выполняется обход загрузчиков классов в попытке найти искомый класс среди загруженных ранее, и, если класс удалось найти не удалось, происходит попытка загрузить его.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Какие виды внедрения зависимости есть? Какая разница меду ними?

A

Существует несколько различных вариантов внедрения bean-компонентов Spring:
* внедрение через сеттер;
* внедрение через конструктор;
* внедрение через поле.
Рекомендуемый подход — использовать аргументы конструктора для обязательных зависимостей и сеттеры для необязательных. Это связано с тем, что внедрение конструктора позволяет вводить значения в неизменяемые поля и упрощает тестирование.
@Autowired может использоваться вместе с конструкторами, сеттерами или любым другими методами. Когда Spring находит @Autowired на методе, Spring автоматически вызовет этот метод, после создания экземпляра бина. В качестве аргументов, будут подобраны подходящие объекты из контекста Spring.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Что такое контекст приложения (ApplicationContext)?

A

ApplicationContext - это главный интерфейс в Spring-приложении, который предоставляет информацию о конфигурации приложения. Он доступен только для чтения во время выполнения, но может быть перезагружен при необходимости и поддержке приложением. Число классов, реализующих ApplicationContext интерфейс, доступны для различных параметров конфигурации и типов приложений.
ApplicationContext создаёт и хранит экземпляры классов вашего приложения, определяет их зависимости друг с другом и автоматически их задаёт. Для того чтобы Spring создал контекст с экземплярами классов, ему нужно предоставить дополнительную информацию — мета-данные, из каких классов/объектов состоит приложение, как они создаются, какие у них есть зависимости и т. д.
Итого: Spring Context + мета-данные = работающее приложение.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Приоритет применения конфигураций.

A

Конфигурацию можно выполнить с помощью XML-файлов, аннотаций или java-code.
1. Xml конфигурация — ClassPathXmlApplicationContext(”context.xml”);
2. Конфигурация через аннотации с указанием пакета для сканирования — AnnotationConfigApplicationContext(”package.name”);
3. JavaConfig — конфигурация через аннотации с указанием класса (или массива классов) помеченного аннотацией @Configuration — AnnotationConfigApplicationContext(JavaConfig.class).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Можем ли мы иметь несколько файлов конфигурации Spring в одном проекте?

A

Да, в крупных проектах рекомендуется иметь несколько конфигураций Spring для повышения удобства обслуживания и модульности.
Мы можем загрузить несколько файлов конфигурации на основе Java:
@Configuration
@Import({MainConfig.class, SchedulerConfig.class})
public class AppConfig {}
Или мы можем загрузить один файл XML, который будет содержать все остальные конфиги:
ApplicationContext context = new ClassPathXmlApplicationContext(“spring-all.xml”);
И внутри этого XML-файла у нас будет следующее:

<import></import>

<import></import>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Какой способ конфигурации выбрать и почему? (вопрос философский)

A

Предпочитаю аннотации, если кодовая база хорошо описывается такими элементами, как @Service, @Component, @Autowired. Однако, когда дело доходит до конфигурации, у меня нет каких-либо предпочтений. Я бы оставил этот вопрос команде.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Почему не нужно сейчас уже указывать аннотацию Autowired? Неявное внедрение.

A

Spring умеет анализировать наш код, он читает класс, видит, что у него есть только один конструктор, затем он пытается определить какой у него аргумент, и если этот аргумент находится в Spring-контейнере, то есть кандидат на внедрение зависимости есть, он его успешно внедряет.
(Бин нашего класса должен быть в файле конфигурации и наш зависимый класс, тоже должен быть объявлен бином в файле конфигурации. Если удалить что-то – идея будет ругаться).
Мы можем поставить @Autowired, но она будет избыточна, и от нее ничего не поменяется.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Что такое Spring beans?

A

Spring beans — это экземпляры объектов, которыми управляет Spring Container. Они создаются и подключаются фреймворком и помещаются в контейнер, откуда вы можете их позже извлечь.
Во-первых, необходимо создать экземпляр компонента Spring на основе определения компонента Java или XML. Также может потребоваться выполнить некоторую инициализацию, чтобы привести его в пригодное для использования состояние. После этого, когда бин больше не нужен, он будет удален из контейнера IoC.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Что содержится в определении bean-компонента?

A

Определение bean-компонента содержит информацию, называемую метаданными конфигурации, которая необходима контейнеру, чтобы знать следующее:
*Как создать bean;
*Подробности жизненного цикла bean;
*Зависимости bean.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Что такое Bean wiring?

A

Bean wiring — это действие по созданию ассоциаций между компонентами приложения (beans) в контейнере Spring. «Связка» (wiring) — это то, что является внедрением зависимостей. Это означает, что вы можете просто сказать: «Мне нужна эта вещь», и фреймворк будет следовать определенным правилам для получения этого объекта.

17
Q

Какова область действия по умолчанию у bean-компонента в Spring framework?

A

Область действия bean-компонента по умолчанию — Singleton (шаблон проектирования).

18
Q

Являются ли Singleton Beans потокобезопасными?

A

Нет, singleton bean-компоненты не потокобезопасны, поскольку потокобезопасность связана с выполнением, тогда как singleton — это шаблон проектирования, ориентированный на создание. Безопасность потоков зависит только от самой реализации компонента.

19
Q

Что такое BeanDefinition и зачем он нужен?

A

Для того чтобы наша конфигурация была понята Spring’ом существует XmlBeanDefinitionReader. Это внутренний компонент Spring’a, который сканирует xml и на основе того, что мы там написали создает BeanDefinition’ы. BeanDefinition – это объект, который хранит в себе информацию о бине. Сюда входит: из какого класса его (бин) надо создать; scope; установлена ли ленивая инициализация; нужно ли перед данным бином инициализировать другой и иные проперти, которые описаны в xml. Все полученные BeanDefinition’ы складываются в HashMap, в которой идентификатором является имя бина (установленное вами или присвоенное спрингом) и сам BeanDefinition объект. После того, как все BeanDefinition’ы созданы на сцену выходит новый герой – BeanFactory. Этот объект итерируется по HashMap’e с BeanDefinition’ами, создает на их основе бины и складывает в IoC контейнер. Здесь есть нюанс, на самом деле, при старте приложения, в IoC контейнер попадут бины, которые имеют scope Singleton, остальные же создаются тогда, когда они нужны (prototype, request, session).
BeanDefinition — это специальный интерфейс, через который можно получить доступ к метаданным будущего бина. В зависимости от того, какая у вас конфигурация, будет использоваться тот или иной механизм парсирования конфигурации.

20
Q

Что такое scope? Какие есть, зачем нужен?

A

singleton – объект создается один раз для каждого контейнера Spring IoC, при последующих внедрениях переиспользуется. Полезен для большинства случаев: различные сервисы, объекты без состояния, неизменяемые объекты.
prototype – при каждом внедрении фабрика бинов создает новый объект. Нужен для изменяемых бинов с состоянием.
Spring Web добавляет 4 дополнительных скоупа, которые делают бин синглтоном в пределах обработки одного сетевого запроса (request), клиентской сессии (session), контекста сервлета (application) и вебсокет-сессии (websocket).

21
Q

Какой механизм использует Spring для разбора конфигураций?

A

У каждой реализации контекста свой инструментарий, но в основном используется сканирование. До момента создания BeanDefinition, мы не пытаемся загружать классы: сначала происходит сканирование по указанным параметрам, а после создаются подходящие BeanDefinition’ы на основании результатов сканирования. Затем уже постпроцессоры пытаются донастроить сам BeanDefinition, загрузить к нему класс и т.д.

22
Q

Для чего нужен Component Scan?

A

Если понимать, как работает Component Scan, то легко можно понять Spring.
Первый шаг для описания Spring Beans это добавление аннотации — @Component, или @Service, или @Repository.
Однако, Spring ничего не знает об этих бинах, если он не знает где искать их. То, что скажет Spring где искать эти бины и называется Component Scan. В @ComponentScan вы указываете пакеты, которые должны сканироваться.
Spring будет искать бины не только в пакетах для сканирования, но и в их подпакетах.

23
Q

В чём отличие между @Component и @ComponentScan?

A

@Component и @ComponentScan предназначены для разных целей
@Component помечает класс в качестве кандидата для создания Spring бина.
@ComponentScan указывает, где Spring искать классы помеченные аннотацией @Component или его производной.

24
Q

В чём разница между @Component, @Service и @Repository аннотациями?

A

Все они определяют бины Spring. Однако между ними всё же есть разница.
@Component — аннотация для любого компонента фреймворка.
@Repository — компонент, который предназначен для хранения, извлечения и поиска. Как правило, используется для работы с базами данных.
@Service — фасад для некоторой бизнес логики

25
Q

Аннотация import.

A

С помощью @Import можно добавить классы в перечень сканируемых, даже если они лежат в другом пакете.

26
Q

В чём разница между @Bean и @Component?

A

@Bean используется в конфигурационных классах Spring. Он используется для непосредственного создания бина.
@Component используется со всеми классами, которыми должен управлять Spring. Когда Spring видит класс с @Component, Spring определяет этот класс как кандидата для создания bean.

27
Q

В чем разница между IOC (Inversion of Control) и Application Context?

A

IOC — инверсия управления. Вместо ручного внедрения зависимостей, фреймворк забирает ответственность за это.
ApplicationContext — реализация IOC спрингом.
Application Context также включает дополнительные функции, которые обычно нужны для разработки корпоративных приложений.
Bean Factory — это базовая версия IOC контейнера.

28
Q

Что такое Spring MVC framework: с чего начинается, что под капотом, для чего нужен?

A

Фреймворк Spring MVC обеспечивает архитектуру паттерна Model — View — Controller при помощи слабо связанных готовых компонентов. Это способ организации кода, который предполагает выделение блоков, отвечающих за решение разных задач. Один блок отвечает за данные приложения, другой отвечает за внешний вид, а третий контролирует работу приложения. Паттерн MVC разделяет аспекты приложения (логику ввода, бизнес-логику и логику UI), обеспечивая при этом свободную связь между ними.
* Model (Модель) инкапсулирует (объединяет) данные приложения, в целом они будут состоять из POJO («Старых добрых Java-объектов», или бинов).
* View (Вид) отвечает за отображение данных Модели, чаще всего - генерируя HTML, которые мы видим в своём браузере.
* Controller (Контроллер) обрабатывает запрос пользователя, создаёт соответствующую Модель и передаёт её для отображения в Вид.
Вся логика работы Spring MVC построена вокруг DispatcherServlet, который принимает и обрабатывает все HTTP-запросы (из UI) и ответы на них.
Ниже приведена последовательность событий, соответствующая входящему HTTP-запросу:
* После получения HTTP-запроса DispatcherServlet обращается к интерфейсу HandlerMapping, который определяет, какой Контроллер должен быть вызван, после чего, отправляет запрос в нужный Контроллер.
* Контроллер принимает запрос и вызывает соответствующий служебный метод, основанный на GET или POST. Вызванный метод определяет данные Модели, основанные на определённой бизнес-логике и возвращает в DispatcherServlet имя Вида. Каждый класс контроллера сопоставляет один или несколько запросов с методами, которые обрабатывают и выполняют запросы с предоставленными входными данными.
* При помощи интерфейса ViewResolver DispatcherServlet определяет, какой Вид нужно использовать на основании полученного имени.
* После того, как Вид создан, DispatcherServlet отправляет данные Модели в виде атрибутов в Вид, который в конечном итоге отображается в браузере.
Все вышеупомянутые компоненты, а именно, HandlerMapping, Controller и ViewResolver, являются частями интерфейса WebApplicationContext extends ApplicationContext, с некоторыми дополнительными особенностями, необходимыми для создания web-приложений.

29
Q

Что такое DispatcherServlet: для чего используется, как создать?

A

DispatcherServlet — это реализация шаблона проектирования Front Controller, который обрабатывает все входящие веб-запросы к приложению Spring MVC. В Spring MVC DispatcherServlet используется для поиска правильного контроллера для обработки запроса. Это делается с помощью сопоставления обработчиков: например, аннотации @RequestMapping.

30
Q

Как работает аннотация @RequestMapping ?

A

@RequestMapping связывает URL-адрес с методами Spring Controller-а.
@PathVariable – аннотация, которая используется для получения значения переменной из адреса запроса.
@GetMapping(value = “/clients/{id}”)
public ResponseEntity<Client> read(@PathVariable(name = "id") int id) {}
@RequestBody – связывает тело ННТР метода с параметром метода Контроллера.
@PostMapping(value = "/clients")
public ResponseEntity<?> create(@RequestBody Client client) { }</Client>

@RequestParam - аннотация может использоваться для извлечения параметров запроса в методе обработчика.
@GetMapping(“/users”)
public List<User> getUsers(@RequestParam String firstName, @RequestParam int age) {
return userService.findUsersWith(firstName, age); }</User>

31
Q

Нужен ли spring-mvc.jar в пути к классам или он является частью spring-core?

A

Spring-mvc.jar является частью spring-core, что означает, что если вы хотите использовать инфраструктуру Spring MVC в своем проекте Java, то вы должны включить ее spring-mvc.jar в путь к классам вашего приложения. В веб-приложении Java spring-mvc.jar обычно помещается в папку /WEB-INF/lib.

32
Q

Как работает контролер: все способы как его создать?

A

В Spring, Controller – это класс, который отвечает за подготовку карты модели с данными, отображаемыми представлением, а также за выбор правильного представления.
Controller является частью MVC. Если вкратце - Controller взаимодействует с моделью, получает из неё какие-то данные и затем отображает их в представлении.
RestController используется для создания RESTfull веб-сервисов. Он взаимодействует с какими-либо данными и возвращает объект, который представляется в HTTP ответе в виде JSON или XML.
Аннотация @RestController – это не что иное, как сочетание аннотации @Controller и @ResponseBody. Он был добавлен в Spring для упрощения разработки веб-служб RESTful.
@RestController превращает помеченный класс в Spring-бин. Этот бин для конвертации входящих/исходящих данных использует Jackson message converter. Как правило целевые данные представлены в json или xml.
Принципиальное различие между веб-приложением и API-интерфейсом REST заключается в том, что ответ веб-приложения представляет собой общий вид HTML + CSS + JavaScript, тогда как API-интерфейс REST просто возвращает данные в форме JSON или XML.
Основная разница между @Controller и @RestController заключается в способе создания тела HTTP ответа. Если класс имеет аннотацию @Controller, то его методы-обработчики без @ResponseBody возвращают строку (String) - название представления, которое надо показать пользователю. Методы-обработчики с @ResponseBody могут иметь любой тип возвращаемого значения.
@RestController по сути объединяет в себе эти две аннотации, и соответственно методы класса, помеченного данной аннотацией могут иметь любой тип возвращаемого значения.

33
Q

Что такое Spring Boot, в чем его ценность? В чем разница между Spring и Spring Boot

A

Spring Boot — это проект, который предоставляет предварительно настроенный набор фреймворков для уменьшения шаблонной конфигурации, чтобы вы могли запускать приложение Spring с минимальным объемом кода.
Это не отдельный фреймворк, а дополнение к Spring, которое облегчает работу с ним. Spring нужно конфигурировать для каждого нового проекта. Конфигурация может занять много времени и не дать ощутимые преимущества в дальнейшей работе. Чтобы исправить проблему, был создан Spring Boot. Он включает комплекс утилит для автоматизации настройки.
Spring Boot:
* автоматически конфигурирует проекты на основе одного из стартовых пакетов для них;
* облегчает создание и развертывание приложений на Spring;
* быстро и легко управляет зависимостями и подгружает необходимые модули;
* поддерживает встроенный сервер для запуска приложений;
* может автоматически создать и настроить базу данных для приложения.
При необходимости настройки Spring Boot можно изменить, чтобы он конфигурировал и настраивал компоненты иначе. Набор утилит облегчает работу со Spring, поэтому некоторые туториалы по умолчанию написаны с учетом использования Spring Boot.

34
Q

Стартеры в Spring Boot.

A

Стартеры - это набор удобных дескрипторов зависимостей, которые вы можете включить в свое приложение. Вы получаете универсальный набор для всех необходимых вам Spring и связанных с ними технологий без необходимости искать примеры кода и копировать, и вставлять множество дескрипторов зависимостей. Например, если вы хотите начать использовать Spring и JPA для доступа к базе данных, включите в ваш проект зависимость spring-boot-starter-data-jpa.
Стартеры содержат множество зависимостей, которые необходимы вам для быстрого запуска и запуска проекта с согласованным, поддерживаемым набором управляемых переходных зависимостей.
Например:
spring-boot-starter Core starter, включающий поддержку автоконфигурации, логирование и YAML
spring-boot-starter-aop Starter для аспектно-ориентированного програм-ния с Spring AOP и AspectJ
spring-boot-starter-data-jdbc Starter для использования Spring Data JDBC
spring-boot-starter-data-jpa Starter для использования Spring Data JPA с Hibernate

35
Q

Что такое Spring Security?

A

Spring Security — это отдельный модуль среды Spring, который фокусируется на предоставлении методов аутентификации и авторизации в приложениях Java. Он также позаботится о большинстве распространенных уязвимостей безопасности, таких как атаки CSRF.
Чтобы использовать Spring Security в веб-приложениях, мы можем начать с простой аннотации @EnableWebSecurity.