Spring Framework

С Википедије, слободне енциклопедије
Спринг јава
лого
Оригинални називенгл. Spring
Изговара сеСпринг
Моделобјектно-оријентисани
Актуелна верзија5.3.8
Датум актуелне верзије26. август 2021.
Систем типоваApplication framework
ЛиценцаApache License
Веб-сајтhttps://spring.io/

Spring Framework је радни оквир за платформу Java који обезбеђује инфраструктуру за развој апликације. Омогућава лакше и брже креирање софтвера, чистији код на јави, а тиме и лакше одржавање апликације. Spring је организован у око 20 модула које је могуће појединачно употребљавати зависно од потреба апликације и отвореног је кода.

Историја верзија[уреди | уреди извор]

Верзија Датум
0.9 2003.
1.0 24. март 2004.
2.0 2006.
3.0 2009.
3.1 2011.
4.0 2013.
4.2 2015.
5.0 2017.
5.3 2020.
5.3.8 2021.

Прву верзију је написао Род Џонсон, а представио је крајем октобра 2002. У јуну 2003. оквир је први пут објављен под лиценцом Apache 2.0 license. Прво издање за продукцију (верзија 1.0) објављено је у марту 2004. године.[1] Верзија 1.2.6 освојила је награду за продуктивност Jolt, али и награду за иновацију године JAX.[2][3] Верзија 4.0 обухвата значајна побољшања, попут подршке за Java SE 8, Groovy 2, неке аспекте Java EE 7 и WebSocket.

Модули[уреди | уреди извор]

Spring Framework је организован у око 20 модула које је могуће појединачно употребљавати у зависности од потреба апликације.

  • Основно складиште (енгл. Core container) срж је овог радног оквира. Складиште је задужено за креирање објеката, њихово повезивање, конфигурисање и управљање њиховим целокупним животним циклусом од стварања до уништења. Постоје две врсте складишта — фабрика семена (енгл. BeanFactory) и апликациони контекст (енгл. ApplicationContext).[4]
  • Аспектно оријентисано програмирање (енгл. Aspect Oriented Programming или AOP) омогућава имплементацију унакрсних проблема
  • Приступ подацима (енгл. Data Access), рад са системима за управљање релационим базама података на платформи Java помоћу Java Database Connectivity (JDBC) и објектно-релационих алата за мапирање база података NoSQL.
  • Инверзија контролног контејнера: конфигурација апликативних компоненти и управљање животним циклусом објеката на јави.
  • Размена порука (енгл. Messaging)
  • MVC (енгл. Model-view-controller), оквир заснован на HTTP-у и у сервлету који пружа функционалност за проширење и прилагоћавање веб-апликација и RESTful (репрезентативни пренос стања)
  • Оквир за даљински приступ: конфигурациони позив даљинксе процедуре (RPC), која подразумева разврставање стилова објеката преко мрежа које подржавају позивање удаљених метода на јави (RMI), COBRA (Архитектура посредника захтева за заједничке објекте) и протоколе засноване на HTTP-у, укључујући веб-услуге (SOAP; Протокол за једноставан приступ објектима).
  • Управљање трансакцијама: координира трансакције за објекте на јави.
  • Даљинско управљање: конфигуративно излагање и управљање објектима на јави за локалну и даљинску конфигурацију путем Проширења управљања јавом (енгл. Java Management Extensions)
  • Тестирање: класе за писање јединичних и интеграционих тестова.

Инверзија контролног контејнера[уреди | уреди извор]

Срж Sping Framework-а је његов инверзијски контролни контејнер (IoC), који помоћу рефлексије пружа доследан начин конфигурисања и управљања објектима на јави. Ова врста контејнера одговорна је за управљање животним циклусом одређених објеката. То подразумева креирање ових објеката, позивање њихових метода иницијализације и њихово конфигурисање.

Објекти које је креирао контејнер називају се управљаним објектима. Контејнер се може конфигурисати учитавањем XML-а (енгл. Extensible Markup Language) или помоћу посебних напомена на јави, што подразумева њихово откривање на конфигурационим класама. Оне дефинишу информације које су неопходне за креирање управљаних објеката.

Објекти се могу добити претраживањем зависности или убацивањем нових објеката од којих ће зависити.[5] Претраживање зависности је образац где од објекта контејнера позивалац тражи објекат с одређеним именом или одређеним типом. Убризгавање зависности подразумева образац где долази до размене објеката, тј. прослеђивања објеката другим објектима. Оно се може извести помоћу конструктора, пропертија или фабричких метода.

Употреба контејнера олакшава конфигурацију и прилагођавање апликације. Међутим, у многим случајевима није неопходна употреба кад се употребљавају други делови Spring Framework-а. Spring-ов контејнер пружа доследан механизам за конфигурисање апликација и интегрише се с готово свим Јава окружењима, од малих апликација до великих пословних апликација. Контејнер се може претворити у делимично усклађен EJB-ом 3.0 .Програмер не креира директно објекат, већ описује како би требало бити креиран, дефинишући га у Спринг конфигурацијској датотеци. Слично томе, услуге и компоненте се не позивају директно; уместо тога Спринг конфигурациона датотека дефинише које се услуге и компоненте морају позвати. Циљ тог IoC-а је повећање једноставности одржавања и тестирања.

Аспектно-оријентисано програмирање[уреди | уреди извор]

Spring Framework има сопствени оквир за аспектно-оријентисано програмирање који модулира међусекторксе проблеме у аспектима.Мотивација за стварање засебног AOP оквира потиче из уверења да би требало омогућити пружање основних AOP функција без превише сложености у дизајну, имплементацији или конфигурацији.Овај оквир је заснован на proxy pattern и конфигуран је за време извођења. Ово дозвољава сано јавно извршавање метода на постојећим објектима на тачки спајања.

У поређењу са AspectJ оквиром, горе поменути спринг је мање моћан, али уједно и мање компликован. Спринг 1.2 укључује подршку за конфигурисање AspectJ аспеката у контејнеру. Спринг 2.0 је додао још интеграција, на пример pointcut се може поново користити и може се мешати са аспектима заснованим на Спринг AOP-у. Затим, Спринг 2.0 је додао нову аспектну библиотеку која користи AspectJ за пружање заједничких Спринг функција, као што су декларативно управљање трансакцијама о убризгавање зависности.

Спринг AOP је осмишљен тако да може да ради са унакрсним проблемима унутар Spring Framework-а. Сваки објекат који је креиран и конфигурисан у контејнеру може се обогатити помоћу Спринг AOP-а. Spring Framework интерно користи Спринг AOP за управљање трансакцијама, сигурност, даљински приступ и JMX.

Од верзије 2.0 оквира, Спринг нуди два приступа конфигурацији AOP-а:

  • приступ заснован на шеми[6]
  • стил означавања заснован на @AspectJ[7]
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop.xsd">

Окврир за приступ подацима[уреди | уреди извор]

Модул за приступ и интеграцију података (Data Access/Integration) јест слој апликације који служи за управљање подацима који се налазе у систему датотека или базама података. Подршка је обезбеђена за све популарне оквире за приступ подацима у Јави: JDBC, iBatis/MyBatis, Hibernate, Java Data Objects (JDO, укинуто од 5.х), Java Persistence API (JPA), Oracle TopLink, Apache OJB и Apache Cayenne.

Функције које Spring пружа:

  • Управљање ресурсима - аутоматско прикупљање и ослобађање ресурса базе података
  • Руковање изузецима - превођење изузетка који је повезан са приступом података
  • Учешће у трансакцији - транспарентно учешће у текућим трансакцијама
  • Одмотавање ресурса - дохватање објеката базе података
  • Апстракција за руковање бинарним великим објектима (BLOB) и знаковним великим објектима (CLOB).

Све ове функције постају доступне када користите класе шаблона које нуди Спринг за сваки подржани оквир.Спринг Фрамеворк је једини оквир доступан у Јави који нуди управљана окружења за приступ подацима изван сервера апликација или контејнера.[8]

Управљање трансакцијама[уреди | уреди извор]

Спрингов оквир за управљање трансакцијама доноси механизам апстракције на Јава платоформи. Његова трансакција је способа за:

  • рад са локалним и глобалним трансакцијама ( локална трасакција не захтева сервер апликације)
  • рад са уметнутим трансакцијама
  • рад са тачкама чувања
  • ради у готово свим окружењима Јава платформе

Java Transaction API (JTA) подржава само угњежђене трансакције и глобалне трансакције и захтева сервер апликација (а у неким случајевима и примену апликација на серверу апликација).

Оквир пружа два начина додавања управљања трансакцијама:

  • програмски
  • конфигуративно

Модел-поглед-контролер[уреди | уреди извор]

Модел-поглед-контролер представња оквир за веб апликације, који првобитно није био планиран. Спрингови програмери су одлучили да напишу сопствени веб оквир као реакцију на оно што су тада сматрали лошим дизајном доступних оквира.[9] Посебно су сматрали да постоји недовољно раздвајање између слојева за презентацију и руковање захтевима, и између слоја за руковање захтевима модела.[10]

Спринг је оквир заснован на захтевима. Оквир дефинише стратешке интерфејсе за све.одговорности са којима мора да се носи савремени оквир заснован на захтевима. Циљ сваког интефејса је да буде једноставан и јасан како би сви корисници могли да напишу сопствене имплементације. MVC отвара пут за чистији код. Сви интерфејси су чврсто везани за Servlet API.

Најважнији интерфејси које дефинише Спринг MVC и њихове одговорности наведени су у наставку:

  • Контролер: долази између модела и приказа ради управљања долазним захтевима и преусмеравања на одговарајући одговор. Контролер ће пресликати HTTP захтев у одговарајуће методе. Пребацује се са преласка на модел или приказ.
  • HandlerAdapter: извршавање објеката који обрађују долазне захтеве
  • LocaleResolver: служи за одређивање локализације(језика) на основу сесије, колачића, или самог ХТТП захтева
  • MultipartResolver: користи се код отпремања датотека, помаже контролеру да добије фајл и обради га на одговарајући начин
  • ViewResolver: одређује који је формат одговора клијенту, на основу имена клијента
  • View: одговоран за враћање одговора клијенту. Неки захтеви се могу погледати директно без одласка на део модела; други могу проћи кроз све три.

Сваки горе наведени интерфејс има важну одговорност у укупном оквиру. Спринг MVC се испоручује са имплементацијама свих ових интерфејса и заједно нуди скуп функција на врху Servlet API . Међутим, програмери могу слободно писати друге имплементације. Предност високог нивоа апстракције коју нуди Спринг MVC јест једноставност тестирања имплементација тих интерфејса.

Ток рада Спринг MVC[уреди | уреди извор]

Када корисник кликне на везу или пошаље образац свом веб прегледачу, захтев иде на Спринг DispatcherServlet. Он консултује једно или више мапирања, изабран је као одговарајући контролор и прослеђује захтев. Контролер обрађује одређени захтев и генерише резултат. Ове информације је потребно форматирати у html- у или било којој технологији попут JSP-а. Када контролер није повезан са одређеним приказом, DispatcherServlet проналази стварни JSP уз помоћ ViewResolver.

Конфигурација DispatcherServlet-а[уреди | уреди извор]

Мора бити конфигурисан у web.xml

<servlet>
  <servlet-name>MyServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>MyServlet</servlet-name>
  <url-pattern>/<url-pattern>
</servlet-mapping>

Оквир за управљање на даљину[уреди | уреди извор]

Оквир за даљински приступ је апстракција за рад са различитим технологијама заснованим удаљеним позивима процедура доступним на Јава платформи и за повезивање клијената и за разврставање објеката на серверима. Најважнија карактеристика коју нуди овај оквир је олакшавање конфигурације и употребе ових технологија што је више могуће комбиновањем инверзије контроле и AOP-а.

Оквир омогућава аутоматскос поновно повезивање након прекида везе. Спринг пружа подршку за ове протоколе и производе:

  • протоколе засноване на ХТТП:
    • Hessian: бинарни протокол за серијализацију, одржава се помоћу протокола заснованих на CORBA
    • RMI (1): позивање метода користећи RMI инфраструктуру која је специфична за Спринг
    • RMI (2): позивање метода помоћу RMI интерфејса у складу са редовном употребом RMI -ја
    • RMI-IIOP (CORBA): позивање метода помоћу RMI-IIOP (CORBA)
  • SOAP
    • Интеграција са оквиром веб услуга Apache Axis

Apache CXF пружа интеграцију са Spring Framework-ом за извоз објеката у стилу RPC-а на страни сервера.

Брзи развој апликација преко конвенције[уреди | уреди извор]

Spring Boot[уреди | уреди извор]

Spring Boot је Спрингово решење за конфигурацију преко конвенције за креирање самосталних апликација заснованих на Спрингу, које можете " покренути ".[11]Већини Spring Boot апликација је потребно врло мало Спринг конфигурације.

Кључне карактеристике:

  • Креирање самосталне Спринг апликације
  • Уградња Tomcat-а или Jetty директно (нема потребе за постављањем WAR датотека )
  • Обезбеђена одлучни "почетни" модели пројектних објеката
  • Аутоматска конфигурација Спринга када год је то могуће
  • Омогућене функције спремне за производњу, као што су метрике, проверене исправности и спољна конфигурација
  • Апсолутно нема генерисања кода и нема захтева за XML конфигурацију.
  • Интеграција и подржавање свих образаца интеграције предузећа

Spring Roo[уреди | уреди извор]

Spring Roo је пројекат заједнице који нуди алтернативни приступ заснован на генерисању кода при коришћењу конфигурације преко конвенције за брзу израду апликација у Јави. Тренутно подржава Spring Security и Spring Web Flow . Разликује се од других оквира за брзи развој апликација фокусирањем на:

  • Проширење (путем података)
  • Продуктивност Јава платформе (за разлику од других језика)
  • Избегавање закључавања
  • Избегавање извршавања
  • Употребљивост (посебно преко функција љуске и начина коришћења)

Batch оквир[уреди | уреди извор]

Spring Batch је оквир за пакетну обраду који пружа функције за вишекратну употребу које су неопходне за обраду великих количина запис, укључујући:

  • евидентирање/праћење
  • управљање трансакцијама
  • статистика обраде послова
  • поновно покретање посла

Такође пружа напредније техничке услуге и функције које ће омогућити оптимизацију и технике партиционисања серијских послова изузетно великог обима и високих перформанси. Spring Batch извршава низ послова; посао се састоји од много корака, а сваки корак се састоји од задатка ЧИТАЊЕ-ОБРАДА-ПИСАЊЕ .

Процес „ЧИТАЊЕ-ОБРАДА-ПИСАЊЕ” се састоји од ових корака: „читање” података из ресурса, „обрада” затим „уписивање” у друге ресурсе. На пример, могу се прочитати податке из CSV датотеке, затим обрадити их, а касније и уписати у базу података.

Појединачни оперативни задатак представља могућност да се ради само један задатак, као што је чишћење ресурса пре или након покретања. Кораци се могу повезати заједно да би се изводили као посао.

Оквир интеграције[уреди | уреди извор]

Спринг интеграције је оквир који пружа функције за вишекратну употребу неопходне за слање порука или архитектуре засноване на догађајима.

  • рутери — усмерава поруку до канала за поруке на основу услова
  • трансформатори — претвара/трансформише/мења корисни терет поруке и ствара нову поруку са трансформисаним корисним оптерећењем
  • адаптери — за интеграцију са другим технологијама и системима
  • филтри — филтрира поруку на основу критеријума. Ако критеријуми нису испуњени, порука се одбацује
  • активатори услуге — позивају операцију на услужном објекту управљања и ревизије

Референце[уреди | уреди извор]

  1. ^ „Spring Framework 1.0 Final Released”. Official Spring Framework blog. Приступљено 27. 8. 2021. 
  2. ^ Jolt winners 2006
  3. ^ „JAX Innovation Award Gewinner 2006”. Архивирано из оригинала 17. 8. 2021. г. 
  4. ^ Spring Framework documentation for the Core Container
  5. ^ What is the difference between the depencylookup and dependency injection - Spring Forum. Forum.springsource.org (2009-10-28). Retrieved on 2013-11-24.
  6. ^ „Spring AOP XML Configuration”. Архивирано из оригинала 10. 02. 2018. г. Приступљено 27. 08. 2021. 
  7. ^ AspectJ Annotation Configuration
  8. ^ „Spring Data JPA for Abstraction of Queries”. Приступљено 27. 08. 2021. 
  9. ^ Introduction to the Spring Framework
  10. ^ Johnson, Expert One-on-One J2EE Design and Development, Ch.12. et al.
  11. ^ Spring Boot