18124

Spring Framework

Лекция

Информатика, кибернетика и программирование

Тема 9: Spring Framework Spring є Java framework який надає розробнику сукупність сервісів для побудови масштабованих J2EE програм. Spring реалізує в собі концепцію MVC. Inversion of Control IoC Іноді можна почути терміни Inversion of Control та Dependency Injection як взаємозамінні але це не зовсім вірно. Inversion of Co...

Украинкский

2013-07-06

86 KB

1 чел.


Тема 9: Spring Framework

Spring є Java framework, який надає розробнику сукупність сервісів для побудови масштабованих J2EE програм. Spring реалізує в собі концепцію MVC.

Inversion of Control (IoC)

Іноді можна почути терміни Inversion of Control та Dependency Injection як взаємозамінні, але це не зовсім вірно. Inversion of Control набагато більш загальна річ, що виражається багатьма різними способами. Dependency Injection є одним з таких способів.

Inversion of Control покриває широке поле методів, які дозволяють об’єкту бути пасивним учасником в системі. Коли застосовується IoC метод, то об’єкт передає контроль над якимись своїми властивостями чи аспектами framework'у чи середовищу. Прикладами такого контролю можуть бути створення об’єктів чи передача управління залежним об’єктам. IoC може виключити необхідність явного програмування вказаних дій за допомогою використання Dependency Injection та аспектно-орієнтованого програмування (Aspect-Oriented Programming AOP) відповідно.

 Приклад AOP.

Припустимо, є бізнес-компонент, який вимагає забезпечення безпеки у вигляді авторизації при своєму використанні.

public class BankAccount {

public void transfer(BigDecimal amount, BankAccount recipient) {

SecurityManager.hasPermission(this, Permission.TRANSFER,

SecurityContext.getCurrentUser());

recipient.deposit(this.withdraw(amount));

}

public void closeOut() {

SecurityManager.hasPermission(this, Permission.CLOSE_OUT,

SecurityContext.getCurrentUser());

this.open = false;

}

public void changeRates(BigDecimal newRate) {

SecurityManager.hasPermission(this, Permission.CHANGE_RATES,

SecurityContext.getCurrentUser());

this.rate = newRate;

}

}

Недоліком даного коду є постійність перевірки безпеки, яка до того ж спричиняє перемішування коду перевірки безпеки і бізнес-логіки. Бажано, щоб код мав наступний вигляд і при цьому безпека зберігалась:

public class BankAccount {

public void transfer(BigDecimal amount, BankAccount recipient) {

recipient.deposit(this.withdraw(amount));

}

public void closeOut() {

this.open = false;

}

public void changeRates(BigDecimal newRate) {

this.rate = newRate;

}

}

Це може забезпечити AOP шляхом застосування так званих аспектів (aspects). Аспекти – це правила програми, які застосовуються автоматично в масштабах певної частини програмної системи. Відповідно налаштований за допомогою xml-файлів AOP framework (як частина Spring), буде автоматично вставляти відповідний код (в даному випадку перевірки авторизації) у всі потрібні методи.

Dependency Injection

Поняття Dependency Injection є стержневим в Spring. Dependency Injection є методом об’єднання різних об’єктів в єдину систему. При його застосування framework сам забезпечує встановлення зв’язків між об’єктами, позбавляючи програміста необхідності написання в своєму коді логіки зв’язування об’єктів чи створення об’єктів.

Якщо два об’єкти зв’язані, бажано, щоб зв’язок не був жорстким і не був прив’язаний до конкретного середовища.

Приклад.

public interface CashRegister {

public BigDecimal calculateTotalPrice(ShoppingCart cart);

}

public interface PriceMatrix {

public BigDecimal lookupPrice(Item item);

}

public class CashRegisterImpl implements CashRegister {

private PriceMatrix priceMatrix = new PriceMatrixImpl();

public BigDecimal calculateTotalPrice(ShoppingCart cart) {

BigDecimal total = new BigDecimal("0.0");

for (Item item : cart.getItems()) {

total.add(priceMatrix.lookupPrice(item));

}

return total;

}

}

В даній програмі є ряд недоліків.  По-перше, для кожного екземпляру CashRegisterImpl потрібен окремий екземпляр PriceMatrixImpl. Якщо створення і зберігання PriceMatrixImpl є витратними операціями, то це має значення. Для, наприклад, віддалених (remote) ресурсів або таких, що вимагають використання зовнішніх ресурсів, наприклад, баз даних, бажано мати один створений об’єкт, який паралельно використовуватиметься багатьма іншими об’єктами. По-друге, що ще більш важливо, CashRegisterImpl жорстко прив’язаний до конкретної реалізації PriceMatrix – PriceMatrixImpl. Третя проблема є прямим наслідком жорсткої зв’язаності – явно створюючи PriceMatrixImpl всередині CashRegisterImpl, програміст створює ситуацію, складну для тестування, тому що не дає можливості вставити mock-об’єкт замість реального PriceMatrixImpl для тестування.

Використання Dependency Injection перекладає відповідальність за створення та знаходження внутрішнього об’єкту зі створюваного класу на framework. Є дві техніки застосування Dependency Injection. Перша – constructor-based injection. Приклад:

public class CashRegisterImpl implements CashRegister {

private PriceMatrix priceMatrix;

public CashRegisterImpl(PriceMatrix priceMatrix) {

this.priceMatrix = priceMatrix;

}

public BigDecimal calculateTotalPrice(ShoppingCart cart) {

BigDecimal total = new BigDecimal("0.0");

for (Item item : cart.getItems()) {

total.add(priceMatrix.lookupPrice(item));

}

return total;

}

}

При цьому не потрібно навіть запитувати ресурс (об’єкт), framework сам дасть його.

Друга, більш популярна, техніка застосування Dependency Injection – setter-based injection. При ній для injection використовується set-метод. Приклад:

public class CashRegisterImpl implements CashRegister {

private PriceMatrix priceMatrix;

public setPriceMatrix(PriceMatrix priceMatrix) {

this.priceMatrix = priceMatrix;

}

public BigDecimal calculateTotalPrice(ShoppingCart cart) {

BigDecimal total = new BigDecimal("0.0");

for (Item item : cart.getItems()) {

total.add(priceMatrix.lookupPrice(item));

}

return total;

}

}

Framework неявно викликає setPriceMatrix – і програма автоматично отримує об’єкт для поля priceMatrix.

Для того, щоб Dependency Injection працювало, потрібно відповідні біни описати відповідним чином в файлі applicationContext.xml.

Application Context

The ApplicationContext є реалізацією BeanFactory, яка, в свою чергу, є реєстром всіх об’єктів, керованих Spring. Загалом, BeanFactory відповідає за створення бінів, зв’язування їх з залежними бінами і забезпечення засобів зручного пошуку бінів. ApplicationContext може розглядатися як повнофункціональна BeanFactory. ApplicationContexts також додає деякі додаткові можливості до BeanFactory. Він може автоматично обробляти BeanFactory після ініціалізації шляхом запуску BeanFactoryPostProcessors. Він також забезпечує можливість інтернаціоналізації, механізм маршрутизації повідомлень для слабо зв’язаних об’єктів і підтримує інтерфейси життєвого циклу, такі, як ApplicationContextAware.

ApplicationContext задається в файлі applicationContext.xml. Приклад:

<?xml version="1.0"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<bean id="cashRegister" class="org.example.CashRegisterImpl">

< property name="priceMatrix" ref="priceMatrixBean" />

</bean>

<bean id="priceMatrixBean" class="org.example.PriceMatrixImpl" />

</beans>

Plain Old Java Objects (POJO)

Отже, Dependency Injection та Spring Application Context є двома центральними концепціями в Spring Framework. Вони є інструментом забезпечення можливості побудови програми на основі виключно plain old Java objects (POJOs). Це дає можливість розробляти web-програми, які є повністю об’єктно-орієнтованими без прив’язки до конкретного framework всередині бізнес-логіки. Це дає змогу сфокусуватися на розробці бізнес-логіки вбудовану в model замість концентрації на специфічному для використовуваного framework коді. Це відчиняє двері для всіх  design patterns, принципів і практик ефективної об’єктно-орієнтованої розробки.

Інші конфігураційні файли

У web-програмі на основі Spring повинні бути ще файли web.xml та ім’я-servlet.xml. Приклад web.xml:

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4"

xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<display-name>FirstSpringMVC</display-name>

<listener>

 <listener-class>

  org.springframework.web.context.ContextLoaderListener

 </listener-class>

</listener>

<servlet>

 <servlet-name>spring</servlet-name>

 <servlet-class>

  org.springframework.web.servlet.DispatcherServlet

 </servlet-class>

</servlet>

<servlet-mapping>

 <servlet-name>spring</servlet-name>

 <url-pattern>/app/*</url-pattern>

</servlet-mapping>

<welcome-file-list>

 <welcome-file>index.html</welcome-file>

 <welcome-file>index.jsp</welcome-file>

</welcome-file-list>

</web-app>

Елемент org.springframework.web.context.ContextLoaderListener потрібен для створення ApplicationContext, а org.springframework.web.servlet.DispatcherServlet перехоплює всі команди і перенаправляє в потрібному напрямку. Назва сервлета для DispatcherServlet (в цьому випадку spring) ставиться на перше місце в назві файлу ім’я-servlet.xml, тобто файл в цьому випадку повинен мати назву spring-servlet.xml. Приклад цього файлу:

<?xml version="1.0"?>

<!DOCTYPE beans PUBLIC

"-//SPRING//DTD BEAN//EN"

"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<bean name="/home"

 class="spring1.controller.FacultiesController">

 <property name="facultyDAO" ref="facultyDAO" />

</bean>

<bean id="viewResolver"

 class="org.springframework.web.servlet.view.InternalResourceViewResolver">

 <property name="prefix" value="/WEB-INF/jsp/" />

 <property name="suffix" value=".jsp"/>

</bean>

</beans>

В ньому зокрема описуються контролери і viewResolver'и – класи, що перетворюють логічні імена ресурсів відображення у їх фізичні імена.

Рівні абстракції в web-програмах

Оволодіння framework'ом – це не тільки вивчення API. Цілісне розуміння архітектури Spring MVC web-програми дає ключ до розуміння причин використання Spring і, таким чином, дозволяє приймати правильні рішення при побудові програми.

Spring-програма розділяється на рівні. Рівень – це блок з певною область відповідальності всередині програми. Рівні є абстракціями всередині програми і контракт взаємодії між ними встановлюється за допомогою інтерфейсів. Рівні мають концептуальні межі і не обов’язково розділені фізично. Найчастіше, всі рівні працюють в одній віртуальній машині.

Типова Spring MVC програма має п’ять рівнів абстракції, кожен з яких розробник повинен програмувати.

Рисунок. Рівні в Spring MVC програмі

Domain model перетинає всі інші рівні тому, що всі вони залежать від domain model.

Рівень UserInterface відповідає за взаємодію програми з кінцевим користувачем.

Web-рівень має два основних призначення – забезпечити логіку переміщення по сторінках програми та забезпечити з’єднання між service-рівнем та тим, що стосується http.

Service-рівень реалізує укрупнену функціональність програми. Він дає можливість виконати бізнес-дію за допомогою виклику одного методу.

Рівень Domain model реалізує більш детальну бізнес-логіку програми.

Persistence-рівень відповідає за взаємодію зі сховищем даних і забезпечує отримання і збереження об’єктів для Domain model.

Виокремлення доменів, таких, як persistence, web-навігація, user interface в окремі рівні дає можливість створювати гнучкі і легко тестовані програми. Реалізація кожного рівня може змінюватись незалежно, що підвищує гнучкість програми. Зменшення зв’язаності між різними областями в програмі підвищує тестованість, роблячи можливим протестувати кожну частину окремо. Така можливість забезпечується мінімізацією кількості залежностей між рівнями. Чим менше залежностей має рівень, тим дешевше його змінити. Добре, якщо рівень залежить тільки від одного чи двох інших рівнів. Потрібно уникати залежності якогось рівня в програмі від багатьох інших частин програми. Зростання рівня залежностей можна уникнути як мінімум двома шляхами. Якщо якийсь рівень має занадто багато зв’язків з іншими рівнями, потрібно розглянути можливість створення нового рівня абстракції. З іншого боку, якщо якийсь рівень проходить через всю програму (через багато інших рівнів), його можна представити як аспект системи і використати, наприклад, Spring AOP, при цьому усуваючи явні залежності в коді.


 

А также другие работы, которые могут Вас заинтересовать

27479. Механизм правового регулирования: понятие, особенности, структура 31 KB
  Механизм правового регулирования представляет собой систему юридических средств организованных в целях преодоления препятствий при реализации субъективных прав обязанностей и интересов субъектов права. Механизм правового регулирования является механизмом реализации нормативности права и стабилизации общественных отношений. Как процесс правовое регулирование состоит из следующих стадий: правотворчество и его влияние на регламентацию общественных отношений; возникновение субъективных прав и субъективных обязанностей; осуществление права...
27480. Можно ли отнести к какому-либо виду систематизации: Сборник законов о труде, Устав студенческого научного общества, Положение о службе в ОВД 32.5 KB
  Выявляются имеющиеся противоречия в содержании правовых норм, пробелы в праве, множественность актов, посвященных одним и тем же вопросам, обнаруживаются устаревшие нормы, действие которых перекрыто актами, изданными позднее
27481. Мононормы: понятие и общая характеристика 26.5 KB
  Мононормы: понятие и общая характеристика. Мононормы первобытного общества – это единые нерасчлененные нормы определявшие порядок организации общественной жизни взаимоотношений между членами общества отправления религиозных обрядов ритуалов этикета исполнявшиеся в силу обычая. Таким образом подводя итог всему изложенному можно резюмировать: социальными регуляторами в первобытном обществе выступали естественная власть и мононормы которые и обеспечивали его целостность и упорядочивали складывавшиеся в нем общественные отношения.
27482. Назовите стадии процесса применения норм права, дайте им краткую характеристику 28.5 KB
  Применение права это государственновластная деятельность компетентных государственных органов или иных лиц по специальному уполномочию государства заключающаяся в вынесении индивидуальных конкретных предписаний направленных на реализацию норм права. Прежде всего применение права отличается от непосредственной реализации по субъекту применение всегда осуществляется государственным органом должностным лицом или иным субъектом по специальному уполномочию государственного органа. Стадии применения права: 1 установление фактических...
27483. Нетипичные формы правления 28.5 KB
  Типичные: 1 Монархия; 2 Республика. Нетипичные: 1 полупрезидентская республика – в ней устанавливается ответственность перед парламентом отдельных министров главы государства. 2 полупарламентская республика – в ней устанавливается усложненный порядок объявления вотума недоверия правительству. 3 монархическая республика республиканская монархия – в ней монарх переизбирается через определенный срок восточные эмираты – через 5 лет.
27484. Общая характеристика древнего (рабовладельческого) государства и права 31 KB
  Общая характеристика древнего рабовладельческого государства и права. Типология государства – традиционно рассматривают как теория учение о типах государств когдалибо существовавших в истории человеческого общества или существующих в настоящее время. Типология государства – это процесс систематизации государств с учетом их сущностных свойств для повышения эффективности в теоретической и практической деятельности по изучению государства и правоприменения. Под типом государства понимаются взятые в единстве общие черты различных...
27485. Общая характеристика законодательной власти в России 26 KB
  Общая характеристика законодательной власти в России. Общее наименование органа законодательной власти парламент. В СФ входит по 2 представителя от каждого субъекта федерации: по одному от представительного и исполнительного органа государственной власти.
27486. Общая характеристика исполнительной власти в России 31 KB
  Правительство РФ состоит из председателя Правительства РФ заместителей председателя правительства РФ и федеральных министров ст. Думы Председателя Правительства России принимает решение об отставке Правительства имеет право председательствовать на заседаниях Правительства по предложению Председателя Правительства РФ назначает на должность и освобождает от должности заместителей Председателя Правительства и министров представляет Гос. Являясь Верховным Главнокомандующим вооруженными силами России Президент подчиняет себе непосредственно...
27487. Общая характеристика методов ТГП 32.5 KB
  Методология включает различные методы приемы и средства познания правовой действительности. Все методы теории государства и права можно расположить в следующей последовательности: – всеобщие методы; – общенаучные методы; – частнонаучные методы. Всеобщие методы: диалектика и метафизика являются по своей сути философскими мировоззренческими подходами. Общенаучные методы применяются на отдельных этапах.