Ревью 2 теория. Инструкция по созданию бизнесобъектов. Strategy это поведенческий паттерн, выносит набор алгоритмов в собственные классы и делает их взаимозаменимыми
Скачать 0.74 Mb.
|
2.1. Что такое ApplicationContext?ApplicationContext — это главный интерфейс в Spring-приложении, который предоставляет информацию о конфигурации приложения. Он доступен только для чтения во время выполнения, но может быть перезагружен при необходимости и поддержке приложением. Число классов, реализующих ApplicationContext интерфейс, доступны для различных параметров конфигурации и типов приложений. В Spring Framework интерфейс org.springframework.factory.BeanFactory предоставляет фабрику для бинов, которая в то же время является IoC контейнером приложения. Управление бинами основано на конфигурации (java или xml). ApplicationContext предоставляет: 1. Фабричные методы бина для доступа к компонентам приложения; 2. Возможность загружать файловые ресурсы в общем виде; 3. Возможность публиковать события и регистрировать обработчики на них; 4. Возможность работать с сообщениями с поддержкой интернационализации; 5.Наследование от родительского контекста. Основные этапы поднятия ApplicationContext: 1. Парсирование конфигурации (xml, groovy, JavaConfig и пр.) и создание всех BeanDefinition (AnnotatedBeanDefinitionReader, BeanDefinitionReader, ClassPathBeanDefinitionScanner); 2. Настройка созданных BeanDefinition (BeanFactoryPostProcessor); 3. Создание кастомных FactoryBean (FactoryBean<T>); 4. BeanFactory создает экземпляры бинов, при необходимости делегируя создание FactoryBean (BeanFactory) 5. Настройка созданных бинов (BeanPostProcessor); 2.2. Что такое BeanDefinition?BeanDefinition — это интерфейс, который описывает бин, его свойства, аргументы конструктора и другую метаинформацию. 2.3. Способы конфигурации бинов?У Spring есть 4 популярных способа конфигурации: 1. XML конфигурация – использует ClassPathXmlApplicationContext(“config.xml”); 2. Groovy конфигурация – использует GenericGroovyApplicationContext(“config.groovy”); 3. Конфигурация через аннотации с указанием пакета для сканирования – использует AnnotationConfigApplicationContext(”package.name”); 4. JavaConfig – это конфигурация через аннотации с указанием класса (или массива классов) помеченного аннотацией @Configuration — AnnotationConfigApplicationContext(JavaConfig.class). 2.4. ApplicationContext и BeanFactory, чем отличаются? В каких случаях что стоит использовать?BeanFactory — это интерфейс, который предоставляет механизм конфигурации, способный управлять объектами любого типа. В общем, BeanFactory предоставляет инфраструктуру конфигурации и основные функциональные возможности. BeanFactory легче по сравнению с ApplicationContext. ApplicationContext является наследником BeanFactory и полностью реализует его функционал, добавляя больше специфических enterprise-функций. 2.5. Как получить ApplicationContext в интеграционном тесте?Если вы используете JUnit 5, то вам нужно указать 2 аннотации: @ExtendWith(TestClass.class) — используется для указания тестового класса; @ContextConfiguration(classes = JavaConfig.class) — загружает java/xml конфигурацию для создания контекста в тесте. Можно использовать аннотацию @SpringJUnitConfig, которая сочетает обе эти аннотации. Для теста веб-слоя можно использовать аннотацию @SpringJUnitWebConfig. 2.6. Как завершить работу ApplicationContext?Если не веб-приложение: Регистрация shutdown-hook с помощью вызова метода registerShutdownHook(), он также реализован в классе AbstractApplicationContext. Это предпочтительный способ. Можно вызвать метод close() из класса AbstractApplicationContext. В Spring Boot: Spring Boot самостоятельно зарегистрирует shutdown-hook за вас. 3. Чем бин отличается от POJO-класса?Любой POJO может быть бином, но не любой POJO является бином. Можно создать бин из любого POJO класса, потом его передавать (инжектить) в любой бин. Для того чтобы инжекция была «прозрачной», то рекомендуется делать ее через конструктора. На крайний случай через метод, но никогда не через поле. По словам Мартина Фаулера, POJO — это объект, который инкапсулирует бизнес-логику, а Bean (за исключением определения, уже указанного в других ответах) — это немного больше, чем контейнер для хранения данных, а операции, доступные на объекте, просто устанавливаются и получить данные. Класс pojo — это обычный класс без каких-либо специальностей, класс, полностью не связанный с технологией /framework. Класс не реализуется из технологии/структуры и не распространяется на технологию/инфраструктуру api, этот класс называется классом pojo. POJO может реализовывать интерфейсы и расширять классы, но суперкласс или интерфейс не должны быть технологией/каркасом. JavaBean — это объект Java, который удовлетворяет определенным соглашениям о программном обеспечении: 1. Поля должны быть private; 2. У полей должны быть геттеры и сеттеры; 3. Должен быть публичный конструктор без аргументов; 4. Класс должен быть Serializable; 5. Не должен являться динамическим Proxy-объектом. Динамический прокси-класс – это класс, который реализует список интерфейсов, определенных во время выполнения так, что, вызов метода через один из интерфейсов на экземпляре класса будет закодирован и диспетчеризирован другому объекту через универсальный интерфейс. |