SPRING / CORE / MVC / BOOT / AOP / SECURITY / DATA / THYMELEAF/ SWAGGER / ACTUATOR / VALIDATION /...


Bu meqalede asagidakilari oyreneceksiz:
Dependency injection nedir? IOC nedir ? SOLID-in ‘D’-si nedir?
Spring-in bize verdiyi ustunlukler nedir?
Springin hansi modullari var ve nece isleyir?
Niye Spring Boot ? Spring Boot bizim ucun backgroundda auto etdiyi seyler eslinde nece bas verir ? Backgroundda application.properties ve.s nece oxunur , datasource nece secilir, embedd tomcat nece qalxir ?
MVC, Spring MVC nedir ve arxada nece isleyir ?
@Trsancational backgroundda eslinde nece isleyir ?
Thymeleaf istifadesi
API Swagger, Actuator, graceful shutdown … ve.s haqqinda

Spring-in (daha dogrusu spring IOC container) -in avantaji nedir?

Esas dependency incejtion ile baglidir ancaq spring tekce bundan ibaret deyil, bir cox modullari ile size genis imkanlar ve tez bir vaxtda app yaza bilmenizi temin edecek.
IOC app daxilindeki obyektlerin dependecinilerini azaltmaq ucun istifade edilen programming prispidir eslinde.
Dependency injection ise springin de istifade etdiyi IOC yollarindan,metodlarindan biridir ve Springde IOC container var hansiki bean-lerin idare edilmesinden mesuldur.
Biz bu yolla tight couple olunmus classlarimizi loose edirik. SOLID-in D (dependency inversion)-da deyildiyi kimi asiliqlari maksimum az tutmaq lazimdir, ust seviye sinifler alt seviyye siniflere bagli olmali deyiller. Cunki asililiqlar flexibility ve re-usability imkanlarini asagi salir.
Diger IOC yollari kimi asagidakilari da misal ceke bielrik:
Strategy Pattern, Factory pattern , Service Locator ve.s 
Spring Container xml ve ya annotaion konfiurasyalarina gore ozu scan edir ,gorur ve dependency-ni temin edir.
Springde iki cur bean container var : Beanfactory ve ApplicationContext
BeanFactory en sade DI veren containerdir, factory pattern sturkturunda yazilmsidir, yeni ki, arxada sizin konfigurasyaniza uygun obyekt qaytaran bir factory isleyir eslinde. ApplicationContext Beanfactory-nin butun ozellikelrini alir ve elave de bir nece ustunlukleri vardir.
ApplicationContext hem de konfiqurasya bilgilerini de ozunde tutur eger @autowired, @service @repository ve.s istifade edirikse bunun bilgilerini de orada tutulur.
Yuxaridaki sekilde Spring-in bize verdiyi modullari gorursunuz.Onlarin her biri ile derinden olmasa da isleyisi ile tanis olaciq etrafli.
CORE MODULE ?
Springin esas modulu core moduludur demek olar. Cunki spring app ise dusdukde ilk olaraq Spring beanlerin tutuldugu ve aralirindaki dependecylerin enject olunmasini temin etmek ucun container yaradir bu modul vasitesi ile.
Data access modulu ?
Adi ustunde baza ile elaqe qurmaq CRUD emeliyyatlarimizi yerine yetirmek,transactionlarin idare edilmesi ucun ve.s bu moduldan istfde edilir.
Orada bize tanis olmayan OXM modulu (Object XML mapping) Java-XML convertasyasi ucun lazim olur. JMS ise message produce ve ya consume etmek ucundur.
Spring JDBC sizin evezinize connection close open edir, exception handle edir , statmentleri exacute edir resultsete yigir ve.s
Spring ORM ise size ORM toolari (hibernate,jpa,ibatis ve.s) integrasya etmeye imkan verir
Springde dedikki hansisa obyekt yaradib diger obyekte setter metod ve ya constructor vasitesile inject etmek evezine xml konfiqurasyada tenzimleyib getBean deye bilirik .getBean ise bize istediyimiz Spring obyektini new ile yaratmis kimi qaytarir geri. Bunun ucun arxada Spring Java reflection istfde edir.
Springi uc yolla app-imizde configure ede bilerik:
XML, Java ve Annotation-larla
Daha elegant yol annotasiyalarin istfdesidir. @Atowired annotasyasi ile biz springde obyektleri inject ede bilerik.
Ancaq bunu enable etmek ucun 2 yol var
  1. Konfigurasyamiza bunu elave etmek:
Qeyd : xmlns:context=”http://www.springframework.org/schema/context" yuxarida import listde elave olundugundan emin olmalisiz.
<beans><context:annotation-config /></beans>
Annotation-config @Component- den basqa butun annotationlarimizi tanimasi ucun elave edilir.
Eger @Component annotation-da taninmasi isetyrikse elave olaraq scan setrini de elave etmeliyik :
<context:component-scan>
Elave qeyd “ eger <context:component-scan>” istiafde edirsizse yuxaridaki annotation-config elave etmeye ehtiyac yoxdur, cunki annotation-config-i de scan edir, elave o isi de gorur ozunde.
2) Ve ya asagidakini birbasa elave etmekle
<beans><bean class=”org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor”/></beans>
Xml yox, annotasya ile java class vasitesile de dedik ki konfiqurasya ede bilerik bean-lerimizi.
Bunun ucun class uzerinde @Configuration elave etmeliyik ve elave olaraq @ComponentsScan elave etmelyik ki classlari scan etsin lazim olan. Ve istifade edeceyimiz classlarda @Bean elave ederek onlarin bean oldugunu gostermeliyik.
Springde Bean Scope-lar :
Singleton — getbean ile her muracietde ApplicationContende eyni obyekt qayidir
Prototype — Her muracietde yeni obyekt yaradilir APplicationContextde ve geri qaytarilir
Request — her http requestde requets bitdikden sonra diger bitir omru.Ve yeni requestde yeni obyektqayidir ( prototype-dan ferqli olaraq getBean istifadesinde her defe yeni obyekt yaratmir eyni obyekt qaytarir )
Session — requestin tam tersi her requestde eyni obyekt qayidir
GlobalSession ve Custom

@Autowired

Springde demisdik ki, beanler arasinda dependency yaratmaq ucun bu annotasyadan istifade edirdik. Bunu ise 2 cur xml ve java configlerle ede bilridik.
Birinci yol XML configurasyadir ki burada byName,byType,byConstructor autowiredler vardir. Bunlar eslinde sadedeir. Defalt olaraq xml configuartion yoxdursa autowired etmir, java config annotation ile ise byType isleyir.
byType ile edirsizce Class-inizda dependency tutudugunuz clasin referens tipine uygun bean inject edir.
byName-de bean name ile class daxilindeki referans adina baxir. byConstructorda ise class daxilinde constructurumuza hansi tip referans verilibse onun bean-ini inject edir.
Ve bir de @Autowired annotation ile istifadesine baxaq :
Bunun ucun evvelce tebiiki annotatio config enable edirik :
<context:annotation-config />
Ve daha sonra artiq lazimi referans uzerine Class daxilinde @Autowired elave ederek bean inject etmesini gosteririk.
Hemin annotasyani konstruktor ve ya set metod uzerine de elave ede bilersiz tebiiki. Bu arada Lombok-un @RequiredArgsConstructor ile de constructor injection ede bilersiz.
@Qualifier
Eger eyni tipden bean sayiniz coxdursa ve autowired ederken ikisinden biri injeckt edilmesini isteyirsiznise
@Qualifier(bean name) yazaraq yazdiginiz name-de uygun bean injeck edilir
@Primary
Qualifiers evezine diger bir yol var hansiki konfiqurasya zamani bean uzerine @Primary elave etdikde geatBean dedikde eyni tipden olan beanlerden primary olan avtomatik goturulur

@Componentscan

Spring app run olduqda butun komponentleri application contextde register ve locate etmeye calisir bunun ucun componentleri scan edir. @Component, @Controller, @Service, ve @Repository annotasyalari avtomatik scan edib komponent oldugunu belirleyir.
@Componentscan ile “com.test.resul” paket altindakilarin scan olunmasi ucun:
<context:component-scan base-package=”com.test.resul” />

@Profile
Bunu misal uzerinden izah edim. Print servisimiz var html ve pdf eden iki ayri @component classimiz olsun birinde @Profile(‘pdf”) birinde ise @Profile(“html”) -dir
Biz application.properties faylimizda spring.profiles.active = pdf yazsaq inject edilen servisin uygun profildeki komponentin print metodu ise dusecek

Spring MVC

Javada web frameworkle en sade sekilde web app servlet istifade ederek ede bilirdik ancaq burada html ui kodlar java icerisinde qarismis veziyyetde idi.
MVC bir pattern-dir. Burada bizde Model View ve Controller var. Bunu bir restoran misali uzerinden izah etsek.Restoranda client(musteri) sifaris verir ofisant (view) vasitesile. Sifaris gedir arxaya aspaza(Controller) ve yeniden uygun yemek (response) hazir olduqda ofisant(view) vasitesile geri gelir musteriye(cliente) teqdim edilir.
Spring MVC nece isleyir arxada ?
Spring mvc-de de arxada eslinde yene de servlet isleyir. Yeni burada da eslinde arxada HttpServletRequest ve HttpSerletResponse istifade edilir.
Burada esas merkezde dispatcherservlet dayanir ve front controller rolunu oynayir ki burada request clientden qebul edilir ve handler mapping vasitesile url-e uygun sahib oldugu controllere yonlendirilir ve cavab geri dispatcherservlet-den jsp ve.s kimi view texnologiyalari ile html seklinde kodlanaraq viewresolverdeki viewlardan birine-a qaytarilir
Ve dispatcherservlet servletdir eslinde yeni HttpServletden extend edilib ve WebAplicationContext ile isleyir haniski orada handlermapping, viewresolver ve.s tuulur
Spring MVC ile bir app yaratmaq ucun asagidaki esas ardiciligi etmek lazimdir:
1)web.xml falinda deyisiklik etmek
Dispatcher servletimizi tanidiriq
2)spring-dispatcher-servlet.xml yaratmaq
Handlermapping, controllerimiz ve viewresolverimizi konfiqurasya edirik
Static tutdugumuz sekiller ve.s fayllar olan folderimizi bucur tanidiriq MVC proyektimize :
3)Controller yaratmaq
Controller tanimlamaq ucun @Controller annotation-una ehiyac var.
Ve view-a nese oturmek isteyirikse ModelMap -e key,value seklinde map edib gondere bilirikve view-da hemin key esasinda ekrana value-sini verir.
@RequestMapping-de ise url mappingimizi qurmaq ucun istfde edirik
Yonlendirme ucun RedirectView da vardir ancaq bu biz her hansi controllerden digerine muraciet edecikse ve url param deyisir ve url aramlar gorunur:
4).jsp her hansi fayl yaratmaq gormek ucun ui
Spring MVC-de birden cox configurasya fayllari yaradib web.xml-imize tanida bilerik
Bunun ucun iki yol var
1)ContextConfigure istifadesi
2) ayrica all.xml kimi bir sey yaradib ayri ayri olan xml-lerimizi ora import edib esas konfigurasyamizda ise all.xml gosteririk
@PathVariable
Bu annotation vasitesile url param-i goture bilerik controllerimizde ve istufade ede bilerik
Birden cox PathVariable istifade edile biler.
@RequestParam
@RequestHeader

Spring MVC-de exception handling

  1. @ExceptionHandler — controller seviyyesinde handler
  2. @ControllerAdvice — global butun controller ucun handle
Burada NullPointer exception handle edilir controllerimizde ve errr sehfemize yonelidirk

@ResponseBody / @Controller ve @RestController

Eger biz geriye view name string kimi qayatririqsa bunu @Controller yox @RestController icerisinde etsek cox guman ki size view name -i return edecek hec bir yonlendirme etmeden cunki siz o metodu
@Controller olan classda yazmali idiniz. Cunki @Restcontroller altinda api mentiqi CRUD -larimizi ve.s tuturuq istesez ayrica paket yaradib bole bilersiz bunlari ve ya @Controller class altinda hamisini
yazib sadece json ve.s qatarmaq istedikde sadece elave olaraq @ResponseBody yazmaniz kifayetdir.
ResponseEntity

Spring Data JPA ?

Spring Data JPA springin data moduluna aiddir. JPA umumiyyetle ORM istifade etmeyimiz ucun olan spesifikasyadir. Hibernate ise JPA-in implimintasyadir.
Spring Data JPA bize ne verir ?
JPA-ya alternativ deyil o da JPA istfde edir sadece elave olaraq bir layer de var orada ve elave Repository interface verir hansiki biz onun vasitesile CRUD , filterleme ve.s metodlari hazir sekilde bize veren repository-lerimizi yarada bilerik.
Meselem burada Foo pojo-muzda name adinda field oldugunu gorub onun ucun bize generate ede bilir findByName adindan metod
Elave olaraq manual olaarq ozumuz ea query-ler yaza bilerik @Query ve ya @NamedQuery ile:
@query by default olaraq JPQL istifade edir ancaq native SQL ile de yazmaq olar.
Spring Data JPA aktiv etmek ucun ise asagidaki 2 yoldan biri edilmelidir :
1)DAO packagimizi gostererek @EnableJpaRepositories annotationi ile
2) XML konfigurasya ile asagidakini elave etmekle
Spring Boot istifade edirsinizse ise bu ozu avtomatik bas verir.

Spring Boot ?

Spring Boot esas bize verdiyi ozellik MVC-den ferqli olaraq cox suretli ve asan sekilde spring boot ile bir app yazib qaldira bilersiz. Boot wordingi ise bootstrap sozunden gelir. Spring boot ile uzun konfigursyalari , war fayl deploy ve.s ucun vaxt itkisi olmur. Ve Spring boot daxilinde embeded tomcat,jetty ve UnderTow ile gelir.Yeni stand alone-dir sadece run etdikde ozu default konfigurasylari edir , application contexti start edir , path scan edir ve proyekti deploy edir daxili tomcata ve start edir tomcati.Bunun axrada nece bas verdiyini ayrca izah edecem evvelce umumi boot islemesini izah etdikden sonra.
Bundan elave Spring boot bize health manitoring, CLI tool , YAML support da verir. Spring Initializr ile rahat sekilde spring proyekt generate ede bilersiz.
Spring Boot-da esas main class uzerinde @SpringBootApplication anotasyasi qeyd olunmalidir
Bu Annotasya ile @EnableAutoConfiguration @ComponentScan @Configuration bir yerde stifadesi eyni seydir.
Bizim spring boot web app qaldirmagimiz ucun esas asagidaki 2 dependecy olmasi vacibdir:
spring -boot-starter-parent -> ozunde esas depedencyleri saxlayir , default konfiqyrasyalari edir,
dependency conflictlere nezaret edir ve.s
spring -boot-starter-web -> web proyekt ucun lazimi dependencyleri yukleyir,embedded tomcat ve.s yukleyir, auto configurationlari edir , dispatcher servlet, default error page ve.s
Spring boot -da application.properties adli faylimiz ile bezi konfigurasylari da ede bilerik proyektin:
Meselem Burada biz app name, ve run portumuzu vere bilerik
Eyni seyi bize application.yml YAML faylimizla da ede bilerik:
Spring-boot-starter-actuator -> proyektin health, traffic ve.s bilgileri ucun istifade ede bilersiz Size endpointler verir hansiki oradan manitoring ede bilersiz app-inizi
Springfox-swagger2 — proyektinizin swaggerinin avtomatik hazirlanmasi ucun bu dependency ve elave @EnableSwagger2 annotasyayasi istifde edirsiz
Spring boot ile war fayl yaradib onu manual olaraq tomcata deploy etmek olarmi ?
Normalda dedik Spring boot qalxanda daxilindeki embedded tomcata deploy bas verir.Eger ozunuz spring boot ile yaranan war tomcata atsaz calismayacaq
ancaq eger bu prosesi manual ozunuz etmek istesez sade formada asagidakilari etelisiniz:
  1. SpringBootServletInitializer -dan extend edirik app clasimizi
  2. Configure metodunu override edirik asagidaki formada
Demeli biz app-imizda main class-a @SpringBootApplication elave etdik controlelrimizi ve.s yazdiq run etdikde properties faylimizdan configuration oxunur , datasource yaradilir, embedded tomcat qalxir ve.s ve rest api-miz isleyir. Bes bu magic arxada nece bas verir gelin ona baxaq ))
Eslinde arxada bir cox prosessler gedir ancaq biz esas 3 meseleye baxaciq :
Evvelce amma @Conditional ve @PropertySources annotationlarinin ne oldugunu bilmelisiz
@Propertysource ile her hansi path-deki properties faylini read etmesini deye bilersiz. Spring main method run etdikde spring ozu arxada 17 dene bele @PropertySource ile mueyyen configuration-lari read edir , application.properties ise sadece bunlardan biridir :
read edilen 17 conf sirasi ile bunlardir
Bes daha sonra ne bas verir ? Her bir spring boot -un asagidaki dependency-si olur
org.springframework.boot:spring-boot-autoconfigure
Esas magic-e komek eden bu jar-dir ve bu META-INF altinda spring.factories adli faylla gelir.Ve bu jar o fayli scan edir. Bes bu faylda neler va ne bas verir ?
Bu faylda 100-lerle asagidaki kimi line oldugunu gorersiz eger acsaz
Her application run olduqda spring bu line-lari @Conditional base annotationlari ile ile eslinde bir bir yoxlayir scan edir.
Adi datasoruce zamani da @Conditional istifade edilir gelin Hikarinin conf classina baxaq DataSourceConfiguration.Hikari.class
  1. adi cofiguration-dir
  2. hikaridatasoruce.class-in classpath-de olub olmamasi yoxlanir
  3. user-in ozunun datasource bean declare edib etmediyi yoxlanilir
4. spring.datasource.type tapilmasa digerini istfde etmesini deyir
5. butun sertler ok-dirse bean-imiz yaranir.
Indi yeqin ki daha da aydin oldu niye eger hikari varsa classpath-de avtomatik hikari istifade edildiyi ve hikari yoxdursa ve meselem DBCP2 varsa onun connection pool-unu aldigimiz.
Bes yaxsi embedded tomcat nece olur ? ne bas verir arxada ?
Eslinde yene de bizim meshur @conditional istifade edilir)) @ConditionalOnClass(Tomcat.class)
server.port tapilir, dispatcher servlet register edilir ve start edilir tomcat. Daha derin melumat ucun asagidaki classlari arasdira bilersiz:
DispatcherServletAutoConfiguration, EmbeddedWebServerFactoryCustomizerAutoConfiguration
Demeli eslinde Spring boot nedir ?
Bir nece auto configuration classs-lardan ibaretdir ve @conditional base annotationlarla sertlere gore bize @bean-ler verir

@ConfigurationProperties

Bu annotation vasitesile biz .properties ve ta .yaml fayllarizdaki propertyleri obyekte map ede bilerik.
Default olaraq application.properties faylindan oxuyur ancaq @PropertySource annotation vasitesile source deyise bilersiz:
Properties faylimizda app prefixinin istifade olundugunu qeyd edirik
Eger application.propertiesden leave ayrica meselem mail.properties falan yaratsaydiq
@Propertysource istfde edib hemin fayli gostermeliydiz
Ve daha sonra AppProperties clasimiza bind edirik propertyleri bu annotationlar vasitesile
Ve artiq AppProperties inject edib oradan get ede bilerik propertylerimizi:

Spring boot banner

Fikir vermisizse app qalxanda logda asagidaki kimi banner gelir bunu istesez deyismek ve ya sondurmek olar:
Sondurmek ucun:
SPRING_MAIN_BANNER-MODE=off
Basqa bir custom bannere deyismek ucun:
Ansi enabled etmekle windowsda rengli gelecek bannerimiz
Bu evvelden hazirladigimiz banner ucun templatedir : banner.txt
Ve qalir run etmek app-inizi)

Spring AOP ? (cross cutting concerns)

Aspect Oriented programming — programming pattern-dir hansiki bize busineess logic kodlarimiz ile log, security, cache ve.s kimi concern-leri ayri tutmagimiza komek olur.
Normalda app-imizde data,business ve web layer varsa bunlarin her birinde yuxarida sadaladiglarimiz concernler hamisi lazim ola biler ancaq bunu kod qarsiqligi olmasin deye AOP ile ayira bilerik.
Spring AOP arxada proxy ve decorator pattern istifade edir.
AOP ozunde ise bezi asagidaki concept-leri vardir :
Advice-larin ise asagidaki tipleri ola biler:

Spring Transaction Management

Spring transactionlari nece idare edir?
Bunun ucun evvelce transaction nedir ? ACID nedir ? niye istifade edirik kimi suallari yaxsi olarki bilesiniz.
Spring 2 cur transaction management destekleyir :
  1. programmatic — prorqmci ozu open/close commit/rolback ve.s edir
  2. declarative — proqramci sadece xml ve ya annotationlarla idare etmeni tehvil verir
Spring tranasaction strategy abtraction yaratmaq ucun asagidaki interfeysi istfde edir:
Springle programmatic transaction management:
TransactionTemplate istifadesi ile veya birbasa PlatformTransactionManager istifadesi ile
Springle declarative transaction management :
Context xml faylinda transactionManager tanitmaqla , @EnableTransactionManagement ile ve ya @Transactional annotation-i ile
Spring boot ise @EnableTransactionManagement -i avtomatik elave edir ve JDBC auto-configuration ile birlikde PlatformTransactionManagement yaradir arxada sizin ucun.
@Transactional — class ve ya metod seviyesinde elan edile biler ( Sinif seviyyesinde tanimlndiqda hemin sinif daxilindeki butun metodlar transaction icerisinde run edilir)
Elave olaraq qeyd edim ki parent class-da tanimlanan @Transactional sub classlara ve onlarin metodlarina da avtomatik tesir edir.
@Transactional arxada eslinde proxy istifade edir yeni bizim real kodumuzda deyisiklik etmir annotasyamiz elave olunan bean-in elave bir dinamik proxy classini yaradir
ve onun transaction manager-e access-i vardir hansiki close ve open ede bilsin deye transactioni.Artiq hemin bean-e birbasa muracet evezine proxy uzerinden gedecekdir
muracietler transactionInterceptor vasitesile.
Bu proxy-ni yaratmaq ucun arxada CGLIB ve ya JDK Dynamic proxy isytifade edilir:
Bu sekilde qeyd etdikde JDK eks halda cglib istfde edilir.
@Transactional-a timeout deyeri de vere bilirik
@Transactional isolation level de vere bilirik :
Burada bir nece leveller var :
R E A D _U N C O MMITTE D — hele commit olunmamis data-larin da read edile bilmesine imkan verir
R E A D _C O MMITTE D — Sadece commit edilen datalari readable edir.
R E PE A TA B L E _R E A D — eyni data oxunarken bir data kimi cekir onu.
S E R IA L IZ A B L E : tekrar oxunmanin qarisini alir, diger tableleri lock ede bilir isleyerken
@Transactional propegate deyilen parameter de alir :
Spring RuntimeException ve ondan toreyen butun excaptionlar zamani avtomatik rollback edir. Eger basqa exception zamani da avtomatik rollback getmesini isteyirikse
@Transactional-in rollbackFor -unu istfde edirik.
Springde distrubited transactionlar ucun ise 2PC(two phase commit) , Java-nin ozunun JTA(java transaction API) -i ve ya Saga istfde edile biler.
Spring datasource configuration
Spring ile hem properties fayl hem java ile datasoruce configuration ede bilerik.Biz proyektimize spring-data-jpa elave dependencyimizi elave etdikde eslinde arxada muxtelif databasedler ucun connection jarlar elave olunur.
Datasoruce configuration-imizi application.properties fayilimizda
ve ya @Configuraton anotasyali java clasimizda qeyd edirik ( son variant daha cox tovsiye olunur).
Connection pool ise burada yene avtomatik springin axrada isleyen alqoritmine esasen secilir. Bu spring 1 ve soring 2-de ferqlilik teskil edir.
Beleki spring 1 default olaraq jdbc connection pool istifade edir,
Hikari sureti ve populyarligi nezere alinaraq yeni versiyalarda ise default evvelce Hikari axtarilir pool.
Ancaq kohne versiyada da tebiiki diger pool ve ya ele Hikari ozunu istfde ede bielrsiz bunun ucun 1 step edirsiz ,
1 evvelce hikari dependency elave edirsiz , 2 tomcatvjdbc dependency-sini silirsiz :
Qeyd ucun deyim ki eger ne Hikari ne JDBC pool tapilmasa default 3-cu olaraq arxada Common DBCP2 istfde edilir.
Bir nece pool da eyni zamanda configurasya ede bilerik ancaq burada esas biri @Primary ile tag olunmalidir mutleq.

Thymeleaf istifadesi

Evvelce dependency-mizi add edirik pom.xml faylimiza
<! — thymeleaf →
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Thymeleaf-de asagidaki tipler ola biler :
Evvelce normal text vermek, sert vermek ve loop-a baxaq :
Indi ise create new User vurduqda bazamiza User insert edek:
Entity klasimizi yaradiriq :
Application.properties faylimizda connection propertylerimizi set edirik:
JpaRepository ve ya CrudRepository-den extend etdikde size hzir verir crud funksiyalarini.
Bu arada bu ikisinin ferqi kimi qeyd ede bilerik ki, JpaRepository elave olaraq bize PagingAndSortingRepository verir ki bununla biz pagination ve sorting ucun istfde ede bilrik.
Controllerimizde uygun ( bir dene GET form olan sehfe ucun , bir eded de POST etmek ucun) funksiyalarimizi yaziriq :
Ve create form-umuzu yaradiriq asagidaki kimi :

Spring Security ?

Spring security bize authentication, authorization ve.s imkanlari ile daha secure java web app yaza bilmemiz ucun imkan yaradan frameworkdur.
Eslinde ise arxada servlet filterlerinden (BasicAuthenticationFilter,UsernamePasswordAuthentcationFilter,DefaultLoginPageGenratingFIlter, FilterSecurityIterceptor ve.s ) ibaretdir.
Spring security bir cox texnologiyalari detsekleyir :
Evvelce authentication nedir xatirladaq :
Burada clientin kim oldugunu oyrenirik , username password isteyirik bu merhele authentication adlanir
Autherization :
Clientin user role-larina uygun app mueyyen hisselerine giris ve qadagalarin teyin edildiyi merheledir
Spring security ucun dependecilerimizi evvelce elave etmeliyik:
Hem xml hem java ile configuration ede bilerik yene de.
Gelin java ile configuration-a baxaq . Evvelce WebSecurityConfigurerAdapterden extend edirik Security config classimizi ve @Configuration
class oldugunu qeyd edirik anotasyamizla.
Burada AuthenticationManagerBuilder parameter alan metodumuzu override ediri.
Ve burada biz in-memory authentication 2 user yaradib ona password ve ROLE set etdik.
Asagida configure HttpSecurity-de ise hansi Role olan userler hansi sehfelere accesi olacaq onu yaziriq.
Bu arada spring security Login sehfesini ozu generate edir sizin ucun.
Bazadan user ve role cedvellerine gore istifade etmek istesez datasource istfde edirik asagidki kimi:
Ve ya asagidaki kimi queryler ile dinamik:

Spring swagger api documentation ?

Bunun ucun evvelce uygun dependency elave edirik :
Main classimiza @EnableSwagger2 annotation-i elave etmeliyik
Ancaq bu tovsiye olunmur yaxsi olardiki ayrica config class-da tutasiz swagger configleri:
Burda select apiselectorbuilder builder obyektini istfde edr ve selectden sonra biz set edirik Docket onyetimize parametrleri
Ve biz /api-docs desek asagidaki neticeni gorerik :
Bu biraz human readable deyil json format ona gore UI ile gormek daha yaxsi olardi :
Bunun ucun de elave dependency vardir:
Artiq /swagger-ui.html#/ deyerek gede bilerik ui swaggerimize:
Elave olaraq Api doc melumatlari elave etmek ucun Apinfo istfde ede bilersiz :
Parametrlere definition elave etmek ucun :
@ApiModel istfde edirik
Funskiyalarimiza definition vermek ucun ise :
@ApiOperation notes istfde edirik

Spring graceful shutdown ?

Dusunun ki tomcat sonur ve hazirda davam etkemde olan thread yarimciq qalir qirilir axrada.Bu kimi halin qarsisini almaq ucun spring boot-da ozumuz vaxt vere bilerik gozlemesi ucun ve elave @Predestroy ile butun threadler bitenden sonra ne ise etmesi lazimdirsa onu da vere bilerik.
Application.properties:
@Predestroy istifadesi

Spring Boot Actuator

App-imizin manitoringi ucun, trafiki ve ya state-i anlamaq ucun , metric-leri almaq ucun istifade edirik:
Bize asagidaki endpontleri verir :
Bundan elave artiq secuirty ile bir yerde /actuator linklere de user role-a gore access vere bilerik:
Meselem SUPERUSER role-lu user-e access vermek ucun ise asagidakini elave edirik:
Endpointin adress ve ya portunu deyismek ucun :

Spring Boot Bean Validation


Yorumlar

Bu blogdaki popüler yayınlar

INGILIS DILI BUTUN ZAMANLAR

İNGİLİS DİLİNDƏ ƏN ÇOX İSTİFADƏ OLUNAN 2600 CÜMLƏ QƏLİBLƏRİ VƏ 6000 SÖZ