Spring Framework
Спринг јава | |
---|---|
![]() лого | |
Оригинални назив | енгл. Spring |
Изговара се | Спринг |
Модел | објектно-оријентисани |
Актуелна верзија | 5.3.8 |
Датум актуелне верзије | 26.8.2021. |
Лиценца | https://en.wikipedia.org/wiki/Apache_License |
Веб-сајт | https://spring.io/ |
Спринг (енг. Spring) представља радни оквир (енг. Framework) за Јавa платформу, који обезбеђује инфраструктуру за развој апликације. Омогућава лакше и брже креирање софтвера, чистији Јава код, а самим тим и лакше одржавање апликације.Спринг је организован у око 20 модула које је могуће појединачно користити у зависности од потреба апликације и отвореног је кода.
Управо овако су изгледали први чланци неких сада искусних википедијанаца. Почетник треба самостално или уз помоћ других корисника да, након што се упозна са основама уређивања, чланак среди како би се уклопио у стотине хиљада постојећих чланака. Можете да затражите помоћ на Тргу или се обратите за помоћ неком од чланова Википројекта почетнички чланци. Ако имате питања, недоумице и предлоге, користите страницу за разговор. Чланак је означен овим шаблоном 26. 08. 2021. Ако не буде исправљен након седам дана, биће премештен у простор нацрта, на корисничку подстраницу или избрисан. |
Историја верзија
Верзија | Датум |
---|---|
0.9 | 2003 |
1.0 | 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 |
Прву верзију је написао Rod Johnson, а представио у октобру 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.
Структура
Спринг је организован у око 20 модула које је могуће појединачно користити у зависности од потреба апликације. Модули су груписани у целине, а то су:
- Основнo складиште (енг. Core container)
- Приступ и интеграција података (енг.Data Access/Integration)
- Аспектно оријентисано програмирање ( енг. Aspect Oriented Programming или AOP)
- Управљање порукама (енг. Messaging)
- Тест
Основно складиште
Основно складиште (енг. Core container) је срж Спринг радног оквира. Контејнер је задужен за креирање објеката, њихово повезивање, конфигурисање и управљање њиховим целокупним животним циклусом од стварања до уништења. Спринг контејнер користи ињекцију зависности (Dependency Injection или скраћено DI) за управљање компонентама које чине апликацију, ови објекти се називају семена (енг. Beans).
Контејнер добија упутства о томе које објекте треба инстанцирати, конфигурисати и саставити читајући пружене конфигурационе метаподатке. Конфигурациони метаподаци могу бити представљени XML-ом, Јава анотацијама или Јава кодом. Користи Јава ПОЈО (енг. Plain Old Java Object) класе и метаподатке о конфигурацији за стварање потпуно конфигурисаног система или апликације. Постоје две врсте контејнера, фабрика семена (енг. BeanFactory) и апликациони контекст (енг. ApplicationContext).
BeanFactory
BeanFactory представља најједноставнији контејнер који пружа основну подршку за ДИ и дефинисан је SpringFramework интерфејсом[4]. У зависности од дефиниције зрна, фабрика ће вратити или независну инстанцу садржаног објекта (образац дизајна прототипа) или једну заједничку инстанцу. Који тип инстанце ће бити враћен зависи од фабричке конфигурације зрна. Обично фабрика зрна учитава дефиниције зрна ускладиштене у извору конфигурације (као што је XML документ) и користи springframework.beans пакет за конфигурисање зрна. Међутим, имплементација може једноставно вратити Јава објекте које креира по потреби директно у Јава коду.
ApplicationContext
ApplicationContext представља централни интерфејс за обезбеђивање конфигурације апликације. Ово је само за читање док је апликација покренута, али се може поново учитати ако имплементација то подржава. Апликациони контекст прижа:
• Фабричке методе зрна за приступ компонентама апликације. Наслеђено од ListableBeanFactory.
• Способност учитавања ресурса датотека на генерички начин. Наслеђено од ResourceLoaderInterface.
• Могућност објављивања догађаја регистрованим слушаоцима. Наслеђено од ApplicationEventPublisherInterface.
• Способност решавања порука, подржавајући интернационализацију. Наслеђено од MessageSourceInterface.
• Наслеђивање из родитељског контекста. Дефиниције у контексту потомка увек ће имати приоритет. То значи, на пример, да један надређени контекст може да користи цела веб апликација, док сваки сервлет има свој подређени контекст који је независан од било ког другог сервлета.
Апликативни контекст обухвата све функционалности контејнера BeanFactory па се препоручује његово коришћење када су у питању већи системи, док се BeanFactory препоручује за мање системе, попут мобилних апликација.
Модул за приступ и интеграцију података (Data Access/Integration) преставља слој апликације који служи за управљање подацима који се налазе у фајл систему или базама података. Такође омогућава рад са трансакцијама и сесијама без обавезе да програмер зна било шта о томе. Један од главних разлога коришћења Спринг радног оквира је баш постојање овог модула, јер нам у великој мери помаже да избегнемо мукотрпну програмску комуникацију са базом података.
Овај слој се састоји од ORM (Object-Relational Mapping), JDBC (Java Database Connectivity), OXM (Object/XML Mapping), JMS (Java Messaging Service) i Трансакционог (Transaction) модула.[5]
Спринг приступ подацима
ORM
Представља процес који обезбеђује конвертовање Јава објеката у табеле базе података. Другим речима користи се за интеракцију са релационим базама без коришћења SQL-а. Овај модул обезбеђује слојеве интеграције са технологијама као што су JPA (Java Persistance API), JDO (Java Data Objects), Hibernate и iBatis, које успостављају директну комуникацију са разним базама података.
JDBC
JDBC представља Јавин апликативни интерфејс који дефинише како клијент приступа подацима. То је технологија заснована на Јави која се користи за повезивање апликације са базама података и пружа методе за читање и ажурирање самих података у релационим базама. Овај АПИ чини много ствари како би помогао програмеру. Између осталог, прати промене на ентитетима. Омогућава мапирање широког низа објектних конструкција у једнако широк низ дизајна база података. Када се врши учитавање ентитета, покрећу се SQL изрази, након чијих извршења постоји потпуно учитан објекат који је спреман за коришћење.
ОXM
OXM представља подршку за мапирање објеката у XML и супротно. Овај процес је познат под називом марширање, или XML серијализација/десеријализација. Постоје два интерфејса која се користе за ове процесе, а то су MarshallerInterface i UnmarshallerInterface. Они врло лако, без потребе да се било шта мења на класама ентитета, врши мапирање и серијализацију објеката, тако да их можемо врло лако проследити путем интернета, или на неки други начин.
JMS
JMS Спринг представља интеграциони оквир који поједностављује коришћење јавиног JMS АПИ-ja. Састоји се од класе JmsTemplate која рукује креирањем и ослобађањем ресурса приликом слања или синхроног примања порука.
CrudRepository
CrudRepository је део модула Спринг дата и представља апстракцију која помаже при смањењу количине поновљеног кода који служи за креирање слоја перзистенције. Овај интерфејс садржи генеричке круд (CRUD-Create, Read, Update, Delete) operacije над ентитетима одређеног типа. Састоји се од неколико метода које се баве интеракцијом са базом. Коришћење је врло једноставно, потребно је само да проширимо CrudRepository интерфејс и да му задамо тип ИД-ја и класу коју ће користити за приступ подацима.
public interface CodeRepository extends CrudRepository<Code, Long> {}
Када смо креирали репозиторијум, потребно је да његову инстанцу ињектујемо у класи у којој желимо да приступамо подацима. Најлакши начин да то буде обављено је коришћењем анотација.
@Autowired
private CodeRepository codeRepository;
Сада је довољно да позовемо методу save() која се налази у CodeRepository (наслеђена је из CrudRepository) да бисмо сачували ентитет у бази. Такође постоје методе за брисање, проналазак по ИД-ју, проверу да ти ентитет постоји. Постоји могућност дефинисања сопствених функција, на следећи начин.
List<Code> findByAccessTime(Calendar time);
Видимо да постоји улазни параметар, што значи да ће ова функција вратити листу свих кодова који имају вредност у колони access_time и та вредност је једнака променљивој time. Круд репозиторијум аутоматски зна по имену функције по ком ће критеријуму претраживати податке. Постоји и JpaRepository који проширује CrudRepository I PagingAndSortingRepository, то значи да има додатне фукционалности као што су пагинација и сортирање листи објеката по одређеном критеријуму.
Спринг Веб
Спринг Веб представља Спрингов модул који пружа основне веб-оријентисане функције интеграције као што су функционалност отпремања датотека и иницијализација ИоЦ контејнера помоћу контекста веб оријентисане апликације. Овај модул се заснива на МВЦ имплементацији веб апликације, што значи да су слој презентације, слој обраде захтева (контролер) и слој модела података у потпуности раздвојени. Оваква хијерархија омогућава лакше креирање апликација, отклањање грашака и локализацију проблема. Наиме, овај систем је заснован на захтевима, што значи да слој презентације мора да комуницира са контролером како би добио или послао одређене податке. Даље, контролер на основу захтева који је добио, конвертује и обраћује информације, након чега уписује или чита податке из перзистенционог слоја. Цео овај процес се одвија у следећим корацима:
• Слој презентације шаље ХТТП захтев (HTTP request) контролеру и одређени временски период очекује одговор.
• Контролер прима захтев, обрађује га, припрема податке за упис или читање.
• Контролер учитава податке или манипулише подацима у слоју модела.
• Контролер генерише одговор (Response) и шаље га слоју презентације.
• На основу одговора, слој презентације приказује одређене информације кориснику.
Спринг МВЦ се састоји из више интерфејса који су задужени за правилно функционисање поретходно описаног дизајна, а најбитнији су:
• контролер: налази се између модела и приказа, служи за управљање захтевима и одговорима. Мапира долазеће ХТТП захтеве на одговарајуће методе и преусмерује информације.
• WebHandler: након примања захтева из њега купи атрибуте, приступа подацима и парсира их у објекте, одлучује о типовима података.
• LocaleResolver: служи за одређивање локализације(језика) на основу сесије, колачића, или самог ХТТП захтева
• MultipartResolver: користи се код отпремања датотека, помаже контролеру да добије фајл и обради га на одговарајући начин
• View: одговоран је за враћање одговора клијенту, наиме, генерише одговор у формату који клијент очекује, тај формат се добија оф ViewResolver интерфејса
• ViewResolver: одређује који је формат одговора клијенту, на основу имена клијента
У овом модулу постоји подршка за WebSocket протокол. Поменути протокол омогућава комуникацију између сервера и прегледача. У односу на ХТТП захтеве предност је то што омогућава двосмеру комуникацију у реалном времену. Што даје могућност серверу да у било ком тренутку обавести клијента уместо да клијент константно шање захтеве ради ажурирања. Да би поменута комуникација била могућа, потребно је да прегледач повеже(претплати) на одређени канал, са ког ће примати поруке. То је могуће урадити коришћењем ЈаваСкрипта и пакета Socket.io.
Анотације Спринг оквира се користе како би фрејмворк могао да препозна шта која класа предтавља, другим речима, дефинише се понашање Спринг радног оквира.
- @Required се примењује на сетер методе поља, обавезује контејнер да попуни поменута поља у време конфигурације семена. Ова поља морају имати своје вредности у XML конфигурационом фајлу.
- @Autowired се користи над пољима и методама, наиме означава да дефинисана променљива мора бити попуњена семеном у време конфигурације. То се ради тако што се у класи А дефинише поље типа класе Б уз ову анотацију, на тај начин се врши ињекција зависности класе Б. Потребно је да класа Б буде дефинисана као семе (Bean).
- @Qualifier ако један интерфејс наслеђује више класа и покушамо да урадимо ДИ над пољем типа интерфејса, Спринг ће се збунити и неће знати коју од тих класа да ињектује, зато се користи ова анотација у којој се наводи име жељене класе.
- @Configuration ова анотација се користи на класама које дефинишу семена, наиме, те класе ће представљати замену за XML конфигурациони фајл. У овим класама ће се креирати методе које ће инстанцирати и конфигурисати семена зависности. Ове методе имају анотацију @Bean.[6]
- @Bean се користи на методама које инстанцирају и враћају одређени објекат који ће бити коришћен за ињекцију зависности.
- @Lazy подразумевано је да се објекти означени са @Autowired инстанцирају при покретању сервера, ако се користи ова анотација, семе ће се креирати тек при првој потреби за коришћење.
- @Value се користи за убацивање вредности неког поља, баш као што се @Autowired користи за ињектовање семена. То значи да ће променљива имати вредност при покретању апликације.
- @Component се користи над класама и говори Спрингу да та класа представља семе, тако да ће је механизам за скенирање компоненти додати у контекст апликације.
- @Controller је индикатор који говори да је класа Спринг контролер. Ова анотација се користи када је потребно дефинисати контролере за Спринг МВЦ или Спринг ВебФлукс (Spring WebFlux).
- @Service користи се над класама, означава је као сервис, што значи да ће у њој бити дефинисана бизнис логика, разна израчунавања, позиви спољашњих АПИ-ја.
- @Repository користи се над класама које директно пристуапају базама података. Ако нека класа наслеђује Repository, CrudRepository или JpaRepository, није потребно експлицитно коришћење ове анотације, јер Спринг препознаје о чему се ради.
- @GetMapping, @PostMapping, @PutMapping, @PatchMapping, @DeleteMapping се користе над методама и означавају их као руковаоце за одређене ХТТП захтеве. Респективно то су HTTP GET, HTTP POST, HTTP PUT, HTTP PATCH и HTTP DELETE.
- @PathVariable се користи за анотацију параметара метода руковаоца. Ова анотација се користи за хватање динамичких промена у самом УРИ-у где ће та промена представљати параметар функције.
- @RequestAttribute се користи за анотацију параметара метода руковаоца. Користи се када је потребно да из објекта који се налази у ХТТП захтеву извучемо жељене параметре. Битно је да се назив атрибута и назив параметра подударају.
- @RequestBody се користи за анотацију параметара метода руковаоца. Када је у питању ова анотација тело ХТТП захтева се мапира на параметар функције, наиме, порука се конвертује у објекат.
- @RequestHeader се користи за анотацију параметара метода руковаоца. Користи се да се функцији као параметар проследи одређени хедер чије име је дефинисано у анотацији.
- @RequestParam се користи за анотацију параметара метода руковаоца. Када се у ХТТП захтеву налазе параметри(Query parameters), ова анотција се користи да се добију и проследе функцији као аргументи.
- @ResponseBody се користи да дефинише да резултат извршења мора бити уписан директно у тело одговора на ХТТП захтев. Што значи да ће Спринг враћени објекат уписати директно у одговор, а то може бити као JSON или XML.
- @ResponseStatus се користи када желомо да одредимо статус одговора методе контролера. Тада се у ХТТП одговор постављају две вредности, код и порука
Референце
- ^ „Spring Framework 1.0 Final Released”. Official Spring Framework blog. Приступљено 27. 8. 2021.
- ^ Jolt winners 2006
- ^ „JAX Innovation Award Gewinner 2006”. Архивирано из оригинала 17. 8. 2021. г.
- ^ „Spring Framework 1.0 Final Released”. spring.io (на језику: енглески). Приступљено 2021-08-26.
- ^ „Spring Framework” (PDF). Приступљено 18. 8. 2021.
- ^ „Spring framework”. Uvod u Spring Framework. Приступљено 18. 8. 2021.