Spring Flashcards

(37 cards)

1
Q

@Transactional. Как работает?

A

@Transactional это аннотация, которой можно аннотировать класс или метод. Она позволяет автоматически управлять транзакциями.
Аннотацией @Transactional можно пометить класс, тогда все его методы станут транзакционными, или метод.
Дефолтный propagation установлен на значении Required.
Помимо управления транзакциями через @Transactional, ими можно также управлять и через TransactionManager и через TransactionTemplate (они обеспечивают полный контроль над транзакциями).
Если повесить @Transactional над приватным методом, то транзакция не будет создана, потому что Spring использует прокси механизм для управления транзакциями.
Атрибуты @Transactional: propagation, isolation, readOnly, timeout, rollbackFor, noRollbackFor

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

@Qualifier vs @Primary

A

Если есть два бина с одинаковым именем, то при внедрении одного из них вылезет exception. Чтобы решить эту проблему можно поставить над бином @Primary, тогда бин с этой аннотацией будет предпочтительнее для внедрения. Если же нам нужно 2 этих бина, то можно использовать @Qualifier и указать в нем имя для каждого бина.

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

Жизненный цикл бина

A

Создание бина -> Внедрение зависимостей -> Постобработка -> Инициализация -> Использование -> Уничтожение.

1) Предоставляем IoC контейнеру Bean Definitions при помощи BeanDefinitionReaders
2) Он их сортирует, чтобы сначала создавать те бины, у которых нет зависимостей, а потом уже бины, зависимые от других
3) Вызываем конструктор бина или фабричный метод
4) Внедряем свойства через поля, сеттеры, если нужно, то ставим имя бину и внедряем контекст в него
5) BeanPostProccesor метод postProcessBeforeInitialization()
6) Инициализация - @PostConstruct, метод init, afterPropertiesSet
7) BeanPostProccesor метод postProcessAfterInitialization()
На этом этапе мы уже получили готовый бин, если у него scope singleton, то
добавляем его в контекст и следим за ним, иначе просто возвращаем бин
8) Если бин был в контейнере, то для каждого бина вызывается еще
PreDestroy, destroy
Еще есть BeanFactoryPostProcessor, но они нужны для изменения BeanDefinition, например внедряют значения из пропертей

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

Dependency Injection

A

Это способ управления зависимостями, при котором мы не думаем об их инициализации.

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

Зачем мы используем Spring? Почему все так любят его?

A

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

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

Inversion of control

A

Это принцип, при котором мы передаем управление объектом спрингу.

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

Какие способы внедрения зависимостей знаешь?

A

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

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

Что такое Bean?

A

@Bean это аннотация, которая ставится над методом в конфигурационном классе, чтобы указать, что он вернет объект, который будет использоваться в Spring приложении. Метаданные о созданном бине хранятся в BeanDefinition (класс бина, скоуп, зависимости, методы инициализации и уничтожения). В бин нельзя передавать final или static поля.

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

@Service, @Repository, @Component

A

@Component – общая аннотация, которая ставится над классом, который
будет управляться Spring контейнером. Нужна для обычных бинов
@Service – по факту это тот же самый компонент, просто показывает
предназначение бина(что он принадлежит слою сервисов)
@Repository – тоже является компонентом, но еще приносит вместе с собой
логику обработки исключений(он их преобразует, например SQLException в
DataIntegrityViolationException). Показывает что бин работает с бд
@Controller – настройка маршрутизации, без него не будут приниматься запросы

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

Атрибут propagation у @Transactional

A

Этот атрибут отвечает за создание вложенных транзакций. У него есть следующие параметры:
REQUIRED - применяется по умолчанию, при входе в транзакцию будет использовано уже существующая или создана новая.
REQUIRES_NEW - для внутреннего метода создается своя отдельная транзакция. Пока выполняется внутренний метод, внешняя транзакция приостанавливается.
NESTED - создает транзакцию внутри основной транзакции.
MANDATORY - требует внешнюю транзакцию, а иначе выбрасывается исключение.
SUPPORTS - метод будет выполняться в рамках транзакции, если она существует, если ее нет метод выполнится без транзакции.
NOT_SUPPORTED - метод всегда выполняется вне транзакции, даже если существует текущая транзакция, то она приостанавливается.
NEVER - запрещает выполнение метода в транзакции.

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

Почему лучше использовать конструктор?

A

Лучше всего внедрять зависимости через конструктор, потому что это гарантирует невозможность изменения зависимостей и то что они 100% будут внедрены.

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

@Controller и @RestController

A

@Controller используется, чтобы возвращать веб-страницы, если нужно вернуть какие то данные, то нужно использовать аннотацию @ResponseBody.
@RestController это комбинация @ResponseBody и @Controller.

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

Spring Boot

A

Это фреймворк, который ускоряет разработку приложений. Ключевые преимущества:
Стартеры - это готовый набор библиотек, который включает в себя все необходимые зависимости.
Встроенный Tomcat сервер.
Автоматическая конфигурация.

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

Циклическая зависимость

A

Это когда два класса ссылаются друг на друга через аннотацию @Autowired, чтобы это решить нужно либо внедрить зависимости через сеттер, либо использовать аннотацию @Lazy.

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

@Conditional в Spring

A

Используется, если мы хотим включать бин, только если выполнены определенные условия.
@ConditionalOnBean - исполняется только если существует определенный бин.
@ConditionalOnProperty - исполняется, только если в конфигурационном файле есть определенное свойство.

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

Стартеры в Spring плюсы и минусы

A

Стартеры в SpringBoot - это преднастроенные зависимости и настройки, что позволяет быстро переходить к разработке приложений.
Минусы:
- Избыточная зависимость.
- Меньшая гибкость.
Плюсы:
- Упрощенная конфигурация.
- Согласованность.
- Сокращение времени разработки.
- Модульность.

17
Q

Как обеспечить, чтобы при внедрении бина со скоупом prototype в singleton, каждый вызов получал новый экземпляр и какие проблемы могут возникнуть при этом, включая случаи с разными реализациями?

A

Существуют следующие способы:
- @Lookup
- ObjectProvider
- Прокси бин
- Получение из ApplicationContext

18
Q

@ComponentScan

A

Указывает Spring, где искать классы помеченные аннотацией @Component (или ее псевдонимами).

19
Q

Парадигма AOP

A

AOP – способ добавить нашему коду сквозную логику(логирование или обработка исключений), не внося изменения в саму функцию.
Состоит из 4 частей:
@Aspect – класс, который содержит сквозную логику
@Advice – совет, он выполняется до, после метода
@Join Point – точка соединения, место, где применяется наш аспект(вызов метода, исключение и т.д.)
@Pointcut – срез, выражение, которое определяет, к каким методам будет применяться аспект.
Это все реализовано с помощью прокси.

20
Q

@Scheduled

A

Эта аннотация используется, чтобы запускать действия по определенному расписанию.

21
Q

@PostConstruct

A

Указывает метод, который должен быть выполнен после инициализации бина. В бине можно задекларировать только один @PostConstruct метод.

22
Q

SpringData JPA

A

Это модуль Spring, который упрощает работу с JPA. Он предоставляет удобные модули для работы с данными.

23
Q

@Async

A

Аннотация @Async позволяет выполнять методы помеченные ей асинхронно (в отдельном потоке).
Принцип работы:
- Асинхронное выполнение (метод выполняется в отдельном потоке и возвращает void, Future или CompleteableFuture).
- Вызывается не сам метод, а его прокси.
- @Async использует пул потоков определенный в настройках (SimpleAsyncTaskExecutor по умолчанию).

24
Q

Виды proxy в Spring

A

Spring использует динамическое proxy для создания AOP оберток над бинами.
Типы прокси:
- JDK Dynamic proxy (используется только для интерфейсов).
- CGLib proxy (используется для классов и создает подкласс оригинального класса).

25
@Lookup
Это аннотация, которая позволяет в singleton бине получать prototype.
26
Как работает BeanPostProcessor? Почему есть before и after initialization?
Это интерфейс, который позволяет перехватывать каждый создаваемый бин и модифицировать его до и после инициализации.
27
Spring MVC. Что это? Какие проблемы решает?
Это модуль Spring, который позволяет разрабатывать приложения на основе шаблона Model-View-Controller.
28
Как гарантировать корректное обновление и сохранение изменений в сущностях, полученных в методе с @Transactional
@Transactional гарантирует, что все изменения managed сущностей будут сохранены при коммите. Не нужно вызывать save() для уже загруженных сущностей, только для NEW или DETACHED. merge() возвращает DETACHED сущность в MANAGED состояние. flush() позволяет досрочно сохранить изменения, если нужен промежуточный результат. Для чтения использовать readOnly=true, это ускорит процесс.
29
Варианты обработки Exception в Spring
@ExceptionHandler (используется для обработки исключений на уровне контроллера). @ControllerAdvice (обрабатывает исключения на всех контроллерах приложения). HandleExceptionResolver (низкоуровневая обработка исключений).
30
Spring profiles как с ними работать?
Профили позволяют загружать разные настройки в зависимости от окружения. Профили можно устанавливать через конфигурационный файл, флаги при запуске. Настраивать профиль можно через application файл или через @Profile.
31
Spring JDBC
Это модуль Spring, который упрощает взаимодействие с базой данных, предоставляя упрощенный подход к выполнению запросов.
32
Блокировка по умолчанию в Spring
Оптимистичная
33
Filter, Listener, Interceptor
Filter – интерфейс в java, который позволяет перехватывать и изменять http-запросы и ответы. Нужен для низкоуровневой обработки. Listener – ждет когда произойдет какое-нибудь событие в приложении и выполняет действие после него. Interceptor – похожая на filter штука, но нужен для высокоуровневой логики, привязанной к контроллерам и аннотациям. Порядок выполнения: Filter -> DispatcherServlet -> Interceptor(preHandle) -> Controller -> interceptor(postHandle) -> filter
34
ApplicationContext и BeanFactory
ApplicationContext – центральный интерфейс контейнера Spring, который управляет ЖЦ бинов, их зависимостями и предоставляет дополнительные возможности для разработки приложений. Это расширение интерфейса BeanFactory, поддерживающее обработку событий, интеграции с AOP и интернациолизацией BeanFactory – базовый контейнер Spring для управления бинами, работает лениво(создает бины тогда, когда они нужны), это самый минимальный и легкий контейнер, но он не поддерживает интернациолизацию, AOP, события и автоконфиги.
35
Блокировки в SpringSecurity
@Lock - можно устанавливать тип блокировки транзакции(optimistic и pesimistic) 1. Оптимистичная блокировка (Optimistic Locking): Идея: Оптимистичная блокировка предполагает, что конфликты при одновременном доступе к данным возникают редко. Она проверяет наличие конфликтов только при завершении транзакции. Как работает: использует поле версии (например, аннотированное @Version) для проверки, не изменились ли данные с момента их чтения. Типы: LockModeType.OPTIMISTIC: Гарантирует, что данные не изменялись с момента их чтения. Если данные изменились, выбрасывается исключение OptimisticLockException. LockModeType.OPTIMISTIC_FORCE_INCREMENT: Аналогичен OPTIMISTIC, но также увеличивает значение поля версии, даже если данные не изменялись. 2. Пессимистичная блокировка (Pessimistic Locking): Идея: Пессимистичная блокировка предполагает, что конфликты возникают часто, и блокирует данные на уровне базы данных, чтобы предотвратить одновременный доступ. Как работает: Блокирует строку или таблицу в базе данных, чтобы другие транзакции не могли изменить данные, пока текущая транзакция не завершится. Типы: LockModeType.PESSIMISTIC_READ: Блокирует данные для чтения. Другие транзакции могут читать данные, но не могут изменять их. LockModeType.PESSIMISTIC_WRITE: Блокирует данные для записи. Другие транзакции не могут ни читать, ни изменять данные. LockModeType.PESSIMISTIC_FORCE_INCREMENT: Блокирует данные для записи и увеличивает значение поля версии. для реализации этих блокировок используется FOR SHARE, FOR UPDATE
36
Что происходит при старте SpringBoot
1) В методе main вызывается SpringApplication.run(...). 2) Создаётся ApplicationContext (контекст Spring). 3) Выполняется автоконфигурация (@EnableAutoConfiguration): анализ классов на классах-эндпоинтах, стартовых бинах и external configuration (application.properties/yml). 4) Сканируются компоненты (@ComponentScan), создаются и инициализируются бины (с учётом зависимостей). 5) Поднимается встроенный веб-сервер (чаще всего Tomcat/Jetty), если в конфигурации есть веб-старт. 6) После инициализации контекст помечается как «готов», и приложение начинает обрабатывать HTTP-запросы (или другие задачи, в зависимости от стартеров).
37
Criteria API Spring
В интерфейсе вашего репозитория расширить его не только JpaRepository (или другой стандартный CRUD-интерфейс), но и JpaSpecificationExecutor. Это автоматически позволяет вызывать методы вроде findAll(Specification) и выполнять фильтрацию через Criteria API без явного написания JPQL или SQL. Для каждого варианта фильтрации создаётся объект Specification, внутри которого с помощью CriteriaBuilder и CriteriaQuery (неявно создаваемых Spring’ом) формируется предикат для раздела WHERE. Затем этот Specification передаётся в репозиторий, и Spring сам строит и выполняет соответствующий запрос. Если вам нужно более сложное поведение или вы хотите полностью контролировать построение Criteria-запроса, создайте дополнительный интерфейс (например, EntityRepositoryCustom) с методом вроде findByCriteria(...), а затем реализуйте его в классе (EntityRepositoryImpl), где с помощью @PersistenceContext инжектируете EntityManager, берёте CriteriaBuilder, собираете CriteriaQuery и выполняете его через EntityManager.createQuery(...). После этого основной репозиторий просто расширяет и JpaRepository, и этот кастомный интерфейс, чтобы Spring автоматически связал интерфейс с вашей реализацией.