Инструкция по созданию бизнесобъектов. Strategy это поведенческий паттерн, выносит набор алгоритмов в собственные классы и делает их взаимозаменимыми
Скачать 0.73 Mb.
|
6.1. Bean Lifecycle?За кулисами фреймворка с ними происходит множество процессов. Во многие из них можно вмешаться, добавив собственную логику в разные этапы жизненного цикла. Через следующие этапы проходит каждый отдельно взятый бин: 1. Инстанцирование объекта. Техническое начало жизни бина, работа конструктора его класса; 2. Установка свойств из конфигурации бина, внедрение зависимостей; 3. Нотификация aware-интерфейсов. BeanNameAware, BeanFactoryAware и другие. Технически, выполняется системными подтипами BeanPostProcessor, и совпадает со следующим шагом; 4. Пре-инициализация – метод postProcessBeforeInitialization() интерфейса BeanPostProcessor; 5. Инициализация. Разные способы применяются в таком порядке: • Метод бина с аннотацией @PostConstruct из стандарта JSR-250 (рекомендуемый способ); • Метод afterPropertiesSet() бина под интерфейсом InitializingBean; • Init-метод. Для отдельного бина его имя устанавливается в параметре определения initMethod. В xml-конфигурации можно установить для всех бинов сразу, с помощью default-init-method; 6. Пост-инициализация – метод postProcessAfterInitialization() интерфейса BeanPostProcessor. Когда IoC-контейнер завершает свою работу, возможно, кастомизировать этап штатного уничтожения бина. Как со всеми способами финализации в Java, при жестком выключении (kill -9) гарантии вызова этого этапа нет. Три альтернативных способа «деинициализации» вызываются в том же порядке, что симметричные им методы инициализации: 1. Метод с аннотацией @PreDestroy; 2. Метод с именем, которое указано в свойстве destroyMethod определния бина (или в глобальном default-destroy-method); 3. Метод destroy() интерфейса DisposableBean. Что происходит внутри init? 1. Метод запускается в ходе инициализации бина; 2. Инициализируются ресурсы, обращение к внешним файлам, запуск БД Что происходит внутри destroy? 1. Метод запускается в ходе уничтожения бина; 2. Освобождаются ресурсы. Методы можно задать в xml конфигурации используя следующий код: Init и destroy являются ссылками на соответствующие методы в бине. Так и с помощью аннотаций @PostConstruct и @PreDestroy для соответствующих методов (устарели в java 9 были удалены в java 11, необходимо явно прописать зависимость). 7. Что такое Dependency Injection?Dependency Injection (внедрение зависимости) — это набор паттернов и принципов разработки программного обеспечения, которые позволяют писать слабосвязанный код. В полном соответствии с принципом единой обязанности объект отдает заботу о построении требуемых ему зависимостей внешнему, специально предназначенному для этого общему механизму. Dependency Injection — это шаблон проектирования для реализации IoC, где инвертируемым (переопределяемым) элементом контроля является настройка зависимостей объекта. Соединение объектов с другими объектами или «внедрение» объектов в другие объекты выполняется контейнером IoC, а не самими объектами. В Spring Framework инверсия контроля достигается именно внедрением зависимостей. Инверсия контроля и внедрение зависимостей считаются одним и тем же. В Spring Framework внедрение зависимостей описывается как процесс, посредством которого объекты определяют свои зависимости (то есть другие объекты, с которыми они работают) только через аргументы конструктора, аргументы фабричного метода или свойства, которые устанавливаются в экземпляре объекта после того, как он создан или возвращен из метода фабрики. После чего контейнер IoC внедряет эти зависимости в компонент при его создании. Во время DI происходит создание спрингом бинов и внедрение их в другие бины. Всего есть 3 варианта внедрения: через конструктора, через сеттеров, через аннотацию над полем. К достоинствам применения DI можно отнести: 1. Сокращение объема связующего кода. 2. Упрощенная конфигурация приложения. 3. Возможность управления общими зависимостями в единственном репозитории. 4. Улучшенная возможность тестирования. 5. Стимулирование качественных проектных решений для приложений (стандартизация и улучшение архитектуры). Реализация DI в Spring основана на двух ключевых концепциях Java — компонентах JavaBean и интерфейсах. При использовании Spring в качестве поставщика DI- гибкость определения конфигурации зависимостей внутри приложений разнообразными путями (т.е. внешне в XML-файлах, с помощью конфигурационных Java классов Spring или посредством аннотаций Java в коде). Компоненты JavaBean (также называемые POJO) предоставляют стандартный механизм для создания ресурсов Java, которые являются конфигурируемыми множеством способов. За счет применения DI объем кода, который необходим при проектировании приложения на основе интерфейсов, снижается почти до нуля. Кроме того, с помощью интерфейсов можно получить максимальную отдачу от DI, потому что бины могут использовать любую реализацию интерфейса для удовлетворения их зависимости. К типам реализации внедрения зависимостей в Spring относят: 1. Constructor Dependency Injection — это тип внедрения зависимостей, при котором зависимости компонента предоставляются ему в его конструкторе (или конструкторах). Рекомендуется как основной способ, т.к. даже без спринга внедрение зависимостей будет работать корректно. 2. Setter Dependency Injection — контейнер IoC внедряет зависимости компонента в компонент через методы установки в стиле JavaBean. В основном через сеттеров. При модификации не создает новые экземпляры, в отличии от конструктора. Он при каждой модификации создает новый экземпляр. 3. Внедрение через поле или использование аннотации @Value. |