JavaRush /Java Blogu /Random-AZ /Bahar haqqında nə bilmək lazımdır: tarix, əsas modullar, ...

Bahar haqqında nə bilmək lazımdır: tarix, əsas modullar, Java EE ilə müqayisə

Qrupda dərc edilmişdir
Salam! Hal-hazırda, Java biliyi olan bir tərtibatçı üçün ən populyar inkişaf istiqaməti veb inkişafıdır. Təbii ki, bu ixtisas üçün təhsil almaq üçün tələb olunan texnologiyaların siyahısı var. Əsas olanlardan biri Bahardır . Bahar haqqında nə bilmək lazımdır: tarix, əsas modullar, Java EE ilə müqayisə - 1Bunun əvəzinə Java EE öyrənə biləcəyinizi iddia edə bilərsiniz . Bu, əlbəttə ki, doğrudur, lakin indi yeni layihələrin böyük əksəriyyəti Spring istifadə edir ki, bu da onu Java veb tərtibatçısı üçün faktiki olaraq defolt, məcburi texnologiyaya çevirdi. Bazarın tələbləri ilə ayaqlaşmaq istəyirsinizsə, onu öyrənməli olacaqsınız. Bu gün mən Bahar haqqında danışmaq istərdim , yəni onun haqqında təsəvvürünüzü bir az genişləndirmək üçün: onun yaranma tarixi, Java EE stekindən əsas fərqlər haqqında danışın və Bahar yığınının əsas komponentləri haqqında qısa məlumat verin . Gəlin başlayaq! Bahar haqqında nə bilmək lazımdır: tarix, əsas modullar, Java EE ilə müqayisə - 2

1. Bahar necə və nə vaxt meydana çıxdı və zamanla nəyə çevrildi

Hər şey 2002-ci ilin oktyabrında Rod Conson “Expert One-onone J2EE Design and Development” kitabını yazanda başladı: WroxBahar haqqında nə bilmək lazımdır: tarix, əsas modullar, Java EE ilə müqayisə - 3 tərəfindən nəşr olunan bu kitabda müəllif Java inkişafının o dövrdəki vəziyyətini təsvir edir və bir sıra işlərə işarə edir. Java EE və komponent əsaslı (Enterprise Java Bean)EJB çatışmazlıqları . Eyni zamanda, Rod Conson müntəzəm Java siniflərinə (POJO - sadə köhnə Java obyektləri) və asılılıq inyeksiyasına əsaslanan daha sadə həll təklif edir. Kitabda o, EJB istifadə etmədən yüksək keyfiyyətli, genişlənə bilən onlayn rezervasiya tətbiqini necə yarada biləcəyinizi izah edir. Bunlar. o, proqramların hazırlanmasının mürəkkəbliyini necə aradan qaldıracağını və əvvəllər yalnız EJB-lərdən istifadə etməklə mümkün olan hər şeyə nail olmaq üçün sadə JavaBeans-dan istifadə etməyi mümkün etməyi aydın şəkildə nümayiş etdirdi. Bununla belə, Baharın əhatə dairəsi server tərəfində işləyən proqram komponentlərinin inkişafı ilə məhdudlaşmır. İstənilən Java proqramı sadəlik, sınaqdan keçirilə bilənlik və boş birləşmə baxımından çərçivənin üstünlüklərindən istifadə edə bilər. Onun J2EE inkişaf dizaynı dərhal hit oldu. Kitabın bir hissəsi kimi sərbəst təqdim olunan proqram kodunun çoxu təkrar istifadə edilə bilərdi və bir sıra tərtibatçılar tezliklə ondan öz layihələrində istifadə etməyə başladılar. Wrox-un kitab üçün mənbə kodu və yamaqları olan veb səhifəsi var idi. Onlar həmçinin kitab üçün onlayn forum təqdim ediblər. 2003-cü ilin fevralında tərtibatçılar Jürgen Heller və Jann Karoff Rod Consonu çərçivə koduna əsaslanan açıq mənbəli layihə yaratmağa inandırdılar. O andan etibarən Rod, Jurgen və Yann tamamilə yeni bir şey yaratmaq üçün əməkdaşlıq etməyə başladılar. Əslində, yeni çərçivə üçün "Bahar" adını verən Yann Karoff idi. Burada nəzərdə tutulan odur ki, Bahar bahar kimidir: ənənəvi J2EE-nin “qışından” sonra yeni bir başlanğıc.
  • 2003-cü ilin iyun ayında Spring 0.9 Apache 2.0 lisenziyası altında buraxıldı.
  • Spring 1.0 2004-cü ilin martında buraxıldı. Maraqlıdır ki, Spring 1.0-ın buraxılmasından əvvəl də əvvəlki versiya 0.9 çox yaxşı qarşılandı və geniş şəkildə qəbul edildi.
  • 2004-cü ilin avqustunda Rod Conson, Jürgen Heller, Keith Donald və Colin Sampaleanu Bahar konsaltinq, təlim və dəstək şirkəti olan interface21-i təsis etdilər .
  • Oktyabr 2006: XML konfiqurasiya fayllarını asanlaşdıran Spring 2.0 buraxıldı.
  • 2007-ci ilin noyabrında buraxılmış Spring 2.5 annotasiya konfiqurasiyalarını təqdim etdi.
  • 2012-ci ilin dekabrında buraxılan Spring 3.2 Java konfiqurasiyasını təqdim etdi, Java 7, Hibernate 4, Servlet 3.0-ı dəstəklədi və həmçinin ən azı Java 1.5 tələb etdi.
  • Yann Karoff komandanı erkən tərk etdi. Rod Conson 2012-ci ildə yaz komandasını tərk etdi. Jürgen Heller hələ də Bahar inkişaf komandasının fəal üzvüdür.
  • 2014-cü ildə buraxılmış Spring 4.0 Java 8 üçün əlavə dəstək verdi.
  • Həmçinin 2014-cü ildə Spring Boot dünyaya təqdim edildi.
  • Spring 5.0 2017-ci ildə buraxıldı. Spring 5-i dəstəkləyən Spring Boot 2.x kimi.
  • Əslində, bizim sevimli çərçivəmiz indi bildiyimizə çevrildi.

2. Spring vs Java EE

Veb tərtibatçıları üçün iki əsas Java yığınının kiçik bir müqayisəsini aparaq: SpringJava EE. Bahar haqqında nə bilmək lazımdır: tarix, əsas modullar, Java EE ilə müqayisə - 4
Java EE
Üstünlüklər Qüsurlar
  • Java EE-də yazılmış proqramlar daha etibarlı, təhlükəsiz və genişləndirilə bilən hesab olunur
  • Java EE sənaye tərəfindən təsdiqlənmiş API standartıdır
  • Əsasən, Spring kimi annotasiyalara və CDI (kontekst və asılılıq inyeksiyası) əsasında
  • EJB konteynerlərinə və POJO-lara əsaslanan icra
  • Çox sayda əməliyyatı olan mürəkkəb proqramlar JEE tərəfindən çox yaxşı idarə olunur
  • Genişləndirilə bilən monolit tətbiq üçün istifadədə uğurludur
  • Java EE-nin xüsusi üslub və sintaksisi olan öz OOP dili var
  • Yeni başlayanlar üçün (və bəzən yaşlı insanlar üçün də) başa düşmək çətin olan çox mürəkkəb proqram inkişaf mühiti
  • Dizayn, yerləşdirmə və tətbiqin inkişafı da daxil olmaqla layihənin yekun dəyəri qadağanedici ola bilər
Oracle tərəfindən lisenziyalaşdırılmış Java EE, kütləvi bazar proqramlarının yaradılması üçün geniş şəkildə uyğunlaşa bilən, paylana bilən mühit tələb edən təşkilatlar və şirkətlər üçün nəzərdə tutulmuşdur. Spring kimi, Java EE verilənlər bazasına giriş (JDBC, JPA), uzaqdan mühəndislik çağırışı (RMI), məlumat (JMS), veb administrasiyası, XML emalı üçün əlavə kitabxanaları ehtiva edir və müəssisə JavaBeans, portletlər, Servletlər, Java Server Səhifələri üçün standart API-ləri xarakterizə edir, Bahar haqqında nə bilmək lazımdır: tarix, əsas modullar, Java EE ilə müqayisə - 5Java EE-nin əsas məqsədi müxtəlif API-lərdən istifadə edərək cari proqramların yaradılması ilə bağlı tərtibatçıların üzləşdiyi əsas problemlərin həllini tapmaqdır . Eyni zamanda, Java EE-də inkişaf yüksək mürəkkəblik səviyyəsinə malikdir və bu, təkcə yeni başlayanlar üçün deyil, barı yüksək səviyyədə qaldırır. Təcrübəli mütəxəssislər üçün artıq yazılmış funksionallığı başa düşmək çətin ola bilər, buna görə də Java EE-də inkişaf daha uzun çəkir və müvafiq olaraq daha bahalıdır. Java EE haqqında qısaca olaraq bunu deyə bilərik: Mürəkkəb, lakin çevik. Yaxşı, indi bir az Bahar haqqında danışaq . Bahar haqqında nə bilmək lazımdır: tarix, əsas modullar, Java EE ilə müqayisə - 6
Bahar
Üstünlüklər Qüsurlar
  • Obyektlə qarşılıqlı əlaqəni səmərəli təşkil etməyə imkan verir
  • Java EE-dən daha sadədir
  • IOCAOP əsasında həyata keçirilir ki, bu da tətbiqlərin boş birləşməsini təmin edir
  • XML, Groovy və ya annotasiya konfiqurasiyası əsasında işləyir
  • Sadə köhnə Java obyektlərindən istifadə etməyə imkan verir - POJO-lar, tərtibatçılar proqram serveri kimi müəssisə konteynerinə ehtiyac duymurlar.
  • Java tərtibatçılarını yüksək səviyyəli modulluqla təmin edir
  • Java EE kitabxanalarının tətbiqlərini təmin edir, lakin öz yolu ilə onların istifadəsini xeyli asanlaşdırır
  • Açıq Mənbə Lisenziyası
  • Spring Boot proqramın ilkin quraşdırılmasını xeyli asanlaşdırır
  • Bahar proqram kodunu yoxlamaq ümumiyyətlə asandır
  • Baharın inkişafı nisbətən çətindir, çünki aydın bir diqqət yoxdur
  • Yeni Java tərtibatçısı üçün Spring çərçivəsini öyrənmək çətin ola bilər (lakin hələ də Java EE-dən daha asandır)
  • Bahar Java EE-dən daha yavaşdır
Spring böyük biznes üçün açıq mənbəli Java çərçivəsidir. Bahar çərçivəsi J2EE ideyalarının mümkün qədər sadə şəkildə həyata keçirilməsini təmin etmək və POJO əsaslı proqramlaşdırma modelinin imkanlarını genişləndirməklə mükəmməl proqramlaşdırma təcrübələrindən istifadə etmək məqsədi daşıyır. Bunlar. Java EE daha çox rəsmi standartdır, Spring isə bu standartı özünəməxsus şəkildə həyata keçirən bir çərçivədir.

Müqayisə nəticələri

Mənim anlayışımda Java EE və Spring JDBC və Hibernate kimidir, burada JDBC daha sürətli texnologiyadır, lakin eyni zamanda çoxlu lazımsız kodlarla. Və Hibernate artıq JDBC-dən istifadə edir, lakin eyni zamanda inkişafı əhəmiyyətli dərəcədə sadələşdirir və azaldır (bəzi məhdudiyyətlər qoysa da). Onlardan hansının daha yaxşı olduğunu dəqiq söyləmək mümkün deyil. Bu da bir qədər sualı xatırladır: hansı daha yaxşıdır - ArrayList və ya LinkedList. Axı, cavab eyni olacaq - vəziyyətdən asılı olaraq. Onların hər birinin öz güclü və zəif tərəfləri var və siz onların arasından diqqətlə seçim etməlisiniz, vəziyyətinizi ölçüb-biçməli və onlardan hansının indi daha çox fayda gətirəcəyini başa düşməlisiniz. Bahar haqqında nə bilmək lazımdır: tarix, əsas modullar, Java EE ilə müqayisə - 7

3. Yay komponentləri

Yaxşı, indi Baharı təşkil edən çərçivələr haqqında bir az danışaq.

Bahar çərçivəsi

Bu, istənilən yerləşdirmə platformasında müasir Java əsaslı müəssisə proqramları üçün hərtərəfli proqramlaşdırma və konfiqurasiya modelini təmin edən əsas moduldur. Buraya bir çox əsas (əsas) Spring texnologiyaları daxildir :
  • əsas - IoC (nəzarətin çevrilməsi) və DI (asılılığın inyeksiyası) konsepsiyalarını həyata keçirən əsas funksionallıq ;
  • AOP - Aspect-Oriented Programming - son-to-end məntiqinin həyata keçirilməsinə yönəlmiş aspekt yönümlü proqramlaşdırma;
  • MVCWebFlux - veb qarşılıqlı əlaqə üçün çərçivələr;
  • JDBC , ORM - verilənlər bazası ilə qarşılıqlı əlaqə texnologiyaları;
  • Test - Spring konteyner məlumatlarının şəffaf, sadə sınaqdan keçirilməsi üçün funksionallıq;
  • SpEL - Spring Expression Language - Bahar ifadə dili;
  • və s.

Yaz çəkmə

İlkin proqram quraşdırmasını minimuma endirməklə və Spring proqram elementlərini avtomatik konfiqurasiya etməklə Bahar əsaslı proqramların yaradılmasını asanlaşdırır. 5 dəqiqə ərzində Bahar açılışının başlamasına misal

Bahar məlumatları

Məlumata çıxış texnologiyalarından, relyasiyalı və qeyri-relyasiyalı verilənlər bazalarından istifadəni əhəmiyyətli dərəcədə asanlaşdırır (təkrarlanan kodu aradan qaldırır və verilənlərlə qarşılıqlı əlaqəni asanlaşdırır). Bu məqalədə Spring Data-nı birləşdirən yaxşı bir təlimat var.

Bahar Buludu

O, mikroservis arxitekturasında istifadə olunur, mikroservislərin bir-biri ilə qarşılıqlı əlaqəsini sadələşdirir və AWS , Azure və s. kimi bulud platformalarında tətbiqlərin yerləşdirilməsini avtomatlaşdırır. Spring Cloud haqqında ətraflı təlimata burada baxın , lakin mən sizi xəbərdar edəcəm ki, bu mövzu asan deyil və yüksək səviyyəyə yaxın mütəxəssislərə yönəlib.

Bahar Təhlükəsizliyi

Tətbiq üçün güclü və fərdiləşdirilə bilən autentifikasiya (autentifikasiya) və girişə nəzarət (avtorizasiya) aləti təmin edir. Bu yazıda Spring Security-ni tətbiqinizə qoşmaq üçün sadə bir nümunə tapa bilərsiniz . Bahar haqqında nə bilmək lazımdır: tarix, əsas modullar, Java EE - 8 ilə müqayisə

Spring GraphQL

Bu modul GraphQL Java-da qurulmuş Spring proqramlarına dəstək verir. GraphQL, müştərilərə ehtiyac duyduqları məhdud məlumat toplusunu sorğulamağa imkan verən API-lər üçün sorğu dilidir, bu da öz növbəsində məhdud sayda sorğularda məlumatların toplanmasına imkan verir. Əgər siz artıq JPA ilə tanışsınızsa, oxşar (və ya eyni) konsepsiyaya malik EntityGraph ilə artıq rastlaşmısınız. GraphQL haqqında daha ətraflı burada oxuya bilərsiniz .

Bahar sessiyası

Bahar çərçivəsinin bu hissəsi istifadəçi sessiyası məlumatlarını idarə etmək üçün API və tətbiqetmələri təmin edir (istifadəçi sessiyası məlumatları Redis , MongoDb , HazelCast və s. kimi davamlı yaddaşda saxlanılır ). Spring Session istifadə nümunəsini burada tapa bilərsiniz .

Bahar inteqrasiyası

Bu modul Bahara əsaslanan proqramlarda mesajlaşmanı sadələşdirmək və deklarativ adapterlər vasitəsilə xarici sistemlərlə inteqrasiyanı dəstəkləmək üçün nəzərdə tutulmuşdur. Bu adapterlər uzaqdan idarə etmə, mesajlaşma və planlaşdırma üçün Spring dəstəyindən daha yüksək səviyyəli abstraksiya təmin edir. Ətraflı məqalə .

Bahar İstirahəti

REST API işlənməsini asanlaşdıran zəngin alətlər dəsti təqdim edir: sorğuların yönləndirilməsi, JSON/XML-ni tələb olunan tipli obyektlərə çevirmək üçün alətlər və s. Baharda RESTful xidmət nümunəsi bu materialda tapıla bilər .

Bahar Veb axını

Spring Web Flow Spring MVC-yə əsaslanır və veb tətbiqinin "axınlarını" həyata keçirməyə imkan verir. Bu cür axınlar istifadəçini bəzi biznes tapşırığını yerinə yetirərkən istiqamətləndirən addımlar ardıcıllığını əhatə edir. Onlar çoxsaylı HTTP sorğularını əhatə edir, vəziyyətə uyğundur, tranzaksiya məlumatları ilə işləyir, təkrar istifadə edilə bilər və təbiətdə dinamik və davamlı ola bilər. Spring Web Flow-u birləşdirən nümunəni bu təlimatda ingilis dilində görmək olar .

Bahar Veb Xidmətləri

Bu modul XML faydalı yükləri manipulyasiya etmək üçün bir çox yollardan birini istifadə edərək çevik veb xidmətləri yaratmağa imkan verməklə müqavilə əsaslı SOAP xidmətlərini inkişaf etdirməyi asanlaşdırmaq üçün nəzərdə tutulmuşdur. SOAP - Simple Object Access Protocol - Sadə obyekt giriş protokolu.

Bahar HATEOAS

Modul Spring və xüsusilə Spring MVC ilə işləyərkən HATEOAS prinsipinə əməl edən REST nəzarətçiləri yaratmağı asanlaşdırmaq üçün bəzi API-lər təqdim edir. HATEOAS - Tətbiq Dövlətinin Mühərriki kimi Hypermedia - Tətbiq vəziyyətinin mühərriki kimi Hipermedia. Bu Bahar kitabxanasının istifadəsinə burada baxa bilərsiniz .

Bahar Dəstəsi

Bu modul korporativ sistemlərin gündəlik fəaliyyəti üçün vacib olan toplu məlumatların emalı (məlumat böyük hissələrdə - partiyalar şəklində işləndikdə) üçün funksionallıq təmin edir. Spring Batch, giriş/izləmə, tranzaksiyaların idarə edilməsi, işin emalı statistikası, işi yenidən başlatma, atlama və resursların idarə edilməsi daxil olmaqla, böyük həcmli qeydləri idarə etmək üçün lazım olan təkrar istifadə edilə bilən xüsusiyyətləri təmin edir. Spring Batch haqqında maraqlı rəyi bu linkdə tapa bilərsiniz .

Bahar AMQP

Modul AMQP əsaslı mesajlaşma həllərinin inkişafı üçün əsas Bahar konsepsiyalarını tətbiq edir. O, mesajların göndərilməsi və qəbulu üçün yüksək səviyyəli abstraksiya kimi şablon təqdim edir. O, həmçinin dinləyici konteyneri ilə mesajla idarə olunan POJO-lara dəstək verir. AMQP - Advanced Message Queuing Protocol - Advanced Message Queuing Protocol. Layihə iki hissədən ibarətdir: spring-amqp əsas abstraksiyadır və spring-dovşan RabbitMQ üçün həyata keçirilir . Spring istifadə edərək RabbitMQ bağlantısı ilə nümunə Bahar haqqında nə bilmək lazımdır: tarix, əsas modullar, Java EE ilə müqayisə - 9

Apache Kafka üçün bahar

Bu layihə Kafka əsaslı mesajlaşma həllərinin inkişafı üçün əsas Bahar konsepsiyalarını tətbiq edir . Şablon mesajların göndərilməsi üçün yüksək səviyyəli abstraksiya kimi təqdim olunur. O, həmçinin lazımi qeydlər və dinləyici konteyneri ilə mesajla idarə olunan POJO-lara dəstək verir. Burada Spring AMQP ilə aydın oxşarlıq var, lakin bu modul xüsusi olaraq Kafka üçün uyğunlaşdırılıb. Bahar Kafkanı birləşdirən nümunəni burada görmək olar .

Spring CredHub

Cloud Foundry platformasında işləyən CredHub serverindən etimadnamələrin saxlanması, əldə edilməsi və silinməsi üçün müştəri tərəfi dəstəyi təmin edir . CredHub - Müxtəlif növ etimadnamələri təhlükəsiz saxlamaq, yaratmaq, əldə etmək və silmək üçün API təmin edir. Spring CredHub, CredHub API üçün Java bağlamasını təmin edərək, Spring proqramlarını CredHub ilə inteqrasiya etməyi asanlaşdırır.

Bahar FLO

Bu, axın və toplu məlumatların monitorinqi üçün boru kəmərləri və sadə qrafiklər üçün sadə HTML5 daxil edilə bilən vizual dizayner təklif edən JavaScript kitabxanasıdır. Bu texnologiyanın demosu linkdəki videodadır .

Bahar LDAP

Bu kitabxana LDAP əməliyyatlarını sadələşdirir və Spring JdbcTemplate-ə əsaslanır. Çərçivə kontekst axtarışına və bağlanmasına, nəticələrə baxmağa, dəyərlərin kodlaşdırılmasına/şifrinin açılmasına, filtrlərə və daha çox şeyə imkan verir (Spring Jdbc ilə eyni prinsiplər əsasında qurulub) Spring LDAP-ın nümunə tətbiqini burada tapa bilərsiniz .

Bahar Roo

Bu modul Bahar əsaslı tətbiqinizi yarada və idarə edə bilən RAD aləti təqdim edir. Onun məqsədi Java tərtibatçılarının məhsuldarlığını artırmaqdır. O, tətbiqinizin biznes məntiqini yaza bilməz, lakin konfiqurasiya və infrastruktur məsələlərini idarə edə bilər.

Bahar qabığı

Kitabxana Spring Shell bankalarına etibar etməklə və öz əmrlərinizi əlavə etməklə (Bahar paxlalarında üsullar kimi gəlir) tam xüsusiyyətli qabıq (həmçinin komanda xətti kimi tanınır) tətbiqi yaratmağı asanlaşdırır. Komanda xətti proqramı yaratmaq, məsələn, layihənizin REST API ilə qarşılıqlı əlaqədə olmaq və ya yerli fayl məzmunu ilə işləmək üçün faydalı ola bilər. Ətraflı buradaburada oxuyun .

Bahar dövlət maşını

Bu modul proqram tərtibatçılarına Spring proqramları ilə dövlət maşını konsepsiyalarından istifadə etməyə imkan verir . Bu funksiyadan istifadənin ətraflı nümunəsini buradaburada tapa bilərsiniz .

Bahar Vault

Spring Vault tanış Bahar abstraksiyalarını və sirrlərə daxil olmaq, saxlamaq və ləğv etmək üçün müştəri dəstəyi təmin edir. O, Vault ilə qarşılıqlı əlaqədə olmaq üçün həm aşağı səviyyəli, həm də yüksək səviyyəli abstraksiyalar təklif edir , istifadəçini infrastruktur problemlərindən azad edir. Spring Vault tətbiqi nümunəsi Bahar haqqında nə bilmək lazımdır: tarix, əsas modullar, Java EE ilə müqayisə - 10"Bütün bunları öyrənməliyəmmi?" – heyrətlə soruşursan. Qorxma! Bu səhvdir! Daha doğrusu, elə də deyil. Bu, Baharda mövcud texnologiyaların tam siyahısı idi. Bir başlanğıcın bilməli olduğu texnologiyaların siyahısı daha təvazökardır:
  • Bahar nüvəsi
  • Yaz çəkmə
  • Spring Web (MVC və REST)
  • Spring Data (Bahar ORM, Spring JDBC, Spring JPA)
  • Bahar Testi
Layihələrdə tez-tez rast gəlinən başqa texnologiyalar da var, lakin onların mürəkkəbliyinə görə onlarla adətən yaşıl naşılar deyil, daha təcrübəli tərtibatçılar məşğul olurlar. Bununla belə, yeni başlayanlar üçün ən azı ümumi anlayışa sahib olmaq da faydalıdır:
  • Bahar Təhlükəsizliyi
  • Bahar AOP
  • Bahar Buludu
Digər texnologiyalar daha az istifadə olunur, ona görə də müəyyən bir layihə üzərində işləmək üçün onları yalnız ciddi şəkildə öyrənmək lazımdır. Yeri gəlmişkən, Java tərtibatçısının bilməli olduğu tam yoxlama siyahısını mənim digər məqaləmdə tapa bilərsiniz. Bu gün mənim üçün hamısı budur, tezliklə görüşərik! Bahar haqqında nə bilmək lazımdır: tarix, əsas modullar, Java EE ilə müqayisə - 11
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION