JavaRush /Блоги Java /Random-TG /Баҳор барои танбалҳост. Асосҳо, мафҳумҳои асосӣ ва мисолҳ...
Стас Пасинков
Сатҳи
Киев

Баҳор барои танбалҳост. Асосҳо, мафҳумҳои асосӣ ва мисолҳо бо код. Қисми 1

Дар гурӯҳ нашр шудааст
Бисёр одамон пас аз хондани мақолаҳои ман дар бораи сохтани қолаб барои веб-лоиҳа ва эҷоди хидмати оддии веб бо истифода аз сервлетҳо ҳайрон шуданд, ки кай ман дар бораи Баҳор менависам. Ман намехостам, ман хондани китобро пешниҳод кардам (ва то ҳол мегӯям, ки китоб аз 10, ҳатто 100 мақола дар интернет беҳтар аст). Аммо ҳоло ман қарор додам, ки барои фаҳмонидани як чиз ба одамони гуногун, ман вақти зиёдтарро сарф мекунам, назар ба он ки як бор нишаста мақола нависам ва сипас танҳо истиноди онро интишор кардам. Пас ман ба хотири истинод менависам)). Баҳор барои танбалҳост.  Асосҳо, мафҳумҳои асосӣ ва мисолҳо бо code.  Қисми 1 - 1Дар ин мақола ман наменависам, ки чӣ гуна лоиҳаи кориро дар фасли баҳор дар 5 дақиқа пас аз намунаи худ созам. Ман танҳо дар бораи чизҳои асосӣ менависам, ки бидуни огоҳии онҳо лоиҳаро оғоз кардан мумкин аст, аммо дар он ҷо чӣ рӯй дода истодааст ва муҳимтар аз он, чаро маълум нест.

Framework Spring чист?

Spring Framework ё танҳо Баҳор , яке аз чаҳорчӯбаҳои маъмултарин барои эҷоди барномаҳои веб дар Java мебошад. Чаҳорчӯба чизи монанд ба китобхона аст (шояд ин истилоҳ ба шумо шиностар бошад), аммо як нукта вуҷуд дорад. Тахминан, бо истифода аз китобхона, шумо танҳо an objectҳои синфҳои дар он мавҷудбударо эҷод мекунед, усулҳои лозимаро даъват мекунед ва ба ин васила натиҷаи заруриро ба даст меоред. Яъне, равиши императивтар вуҷуд дорад: шумо дар барномаи худ возеҳ нишон медиҳед, ки дар кадом лаҳзаи мушаххас шумо бояд кадом an objectро эҷод кунед, дар кадом лаҳза усули мушаххасро даъват кунед ва ғайра. Бо чаҳорчӯбаҳо, чизҳо каме фарқ мекунанд. Шумо танҳо баъзе аз синфҳои худро нависед, дар он ҷо як қисми мантиқро нависед ва худи чаҳорчӯба an objectҳои синфҳои шуморо эҷод мекунад ва методҳоро барои шумо даъват мекунад. Аксар вақт, синфҳои шумо баъзе интерфейсҳоро аз чаҳорчӯба амалӣ мекунанд ё баъзе синфҳоро аз он мерос мегиранд ва ҳамин тавр баъзе аз функсияҳое, ки аллакай барои шумо навишта шудаанд, мегиранд. Аммо набояд ин тавр бошад. Масалан, дар фасли баҳор, онҳо мекӯшанд, ки то ҳадди имкон аз чунин пайвастагии қатъӣ дур шаванд (вақте ки синфҳои шумо мустақиман аз баъзе синфҳо/интерфейсҳои ин чаҳорчӯба вобастаанд) ва барои ин мақсад эзоҳҳоро истифода мебаранд. Мо дертар ба ин нукта бармегардем. Аммо фаҳмидан муҳим аст, ки Spring ин танҳо маҷмӯи баъзе синфҳо ва интерфейсҳоест, ки аллакай барои шумо навишта шудаанд :) Ман инчунин мехоҳам фавран қайд кунам, ки Spring метавонад на танҳо барои веб-барномаҳо, балки барои консолҳои маъмултарин низ истифода шавад. барномаҳое, ки барои ҳамаи мо барномаҳо шиносанд Ва имрӯз мо ҳатто чунин чизеро менависем.

Сохтор

Аммо баҳор як чаҳорчӯбаи мушаххас нест. Ин як номи умумӣ барои як қатор чаҳорчӯбаҳои хурд аст, ки ҳар яки онҳо як намуди кори гуногунро иҷро мекунанд.
Баҳор барои танбалҳост.  Асосҳо, мафҳумҳои асосӣ ва мисолҳо бо code.  Қисми 1 - 2
Тавре ки шумо мебинед, пружа сохтори модулӣ дорад. Ин ба мо имкон медиҳад, ки танҳо он модулҳоеро, ки барои замимаи мо лозиманд, пайваст кунем ва на он модулҳоеро, ки мо бешубҳа истифода намебарем, пайваст кунем. То ҷое ки ман медонам, маҳз ҳамин равиш ба Баҳор кӯмак кард, ки аз рақиби он вақт (EJB) бартарӣ дошта, пешсаф шавад. Зеро барномаҳое, ки EJB-ро истифода мебаранд , вобастагии зиёдеро ба худ кашиданд ва дар маҷмӯъ онҳо суст ва бесарусомон шуданд. Тасвир нишон медиҳад, ки чаҳорчӯбаи баҳорӣ аз якчанд модул иборат аст:
  • дастрасии маълумот;
  • веб;
  • аслӣ;
  • ва дигарон.
Имрӯз мо бо баъзе мафҳумҳои модули асосӣ шинос мешавем, аз қабor: лӯбиё, контекст ва ғайра. Тавре ки шумо тахмин карда метавонед, модули дастрасии додаҳо дорои асбобҳо барои кор бо додаҳо (асосан базаҳои маълумот), веб - барои кор дар шабака (аз ҷумла барои эҷоди барномаҳои веб, ки баъдтар баррасӣ хоҳанд шуд). Илова бар ин, инфрасохтори ба истилоҳ тамоми баҳор мавҷуд аст: бисёр лоиҳаҳои дигар, ки расман ба худи чаҳорчӯб дохил карда нашудаанд, вале ба таври бефосила ба лоиҳаи баҳори шумо ворид карда шудаанд (масалан, ҳамон амнияти баҳорӣ барои кор бо иҷозати корбар дар сайт, ки умедворам, ки мо ҳам рӯзе эҳсос хоҳем кард).

Чаро баҳор дар Java?

Хуб, ба ҷуз аз он ки он муд, услубӣ ва ҷавонӣ аст, ман дарҳол гуфта метавонам, ки вақте ки шумо онро каме азхуд мекунед, шумо мефаҳмед, ки ҳоло чӣ қадар корҳои гуногунро иҷро кардан лозим нест ва чӣ қадар Баҳор мегирад. Шумо метавонед якчанд даҳҳо сатри конфигуратсия нависед, якчанд синф нависед - ва шумо лоиҳаи корӣ хоҳед гирифт. Аммо вақте ки шумо дар бораи он фикр мекунед, ки чӣ қадар "дар зери сарпӯш" вуҷуд дорад, чӣ қадар кор анҷом дода мешавад ва агар шумо ҳамон як лоиҳаро дар сервлетҳои бараҳна ё дар розеткаҳо ва Java-и тоза иҷро карда бошед, чӣ қадар code бояд навишта шавад. - мӯи сарат рост меистад :) Хатто чунин иборае ҳаст, мисли «сеҳри» Баҳор. Ин вақте аст, ки шумо мебинед, ки ҳама чиз кор мекунад, аммо шумо тахминан ҳисоб мекунед, ки ҳама чиз дар он ҷо чӣ қадар бояд кор кунад ва он ҷо чӣ гуна кор кунад - пас ба назар чунин менамояд, ки ҳамаи ин ба шарофати ягон ҷодугарӣ рӯй медиҳад)) Ин осонтар аст онро ҳама ҷодугарӣ меноманд, на кӯшиш кунед, ки фаҳмонед, ки чӣ тавр ҳама он ҷо бо ҳам алоқаманд аст. табассум data_ web-mvc_ security_ факат асосхо.

DI/IoC

Агар шумо кӯшиш карда бошед, ки дар фасли баҳор чизе бихонед, пас аввалин чизе, ки шумо дучор шудед, эҳтимол ин ҳарфҳо буданд: DI/IoC . Ҳоло ман ба шумо тавсия медиҳам, ки аз ин мақола танаффус гиред ва ин мақоларо дар Habré хонед ! IoC (Inversion of Control) - инversionи назорат. Ман инро дар гузашта зикр кардам, вақте ки ман навиштам, ки ҳангоми истифодаи китобхона, шумо худатон дар codeи худ менависед, ки кадом усули кадом an objectро даъват кардан лозим аст ва дар сурати чаҳорчӯба, аксар вақт чаҳорчӯба codeеро, ки шумо дар тарафи рост навиштаед, даъват мекунад. лаҳза. Яъне, дар ин ҷо шумо дигар раванди иҷрои code/барномаро назорат намекунед, аммо чаҳорчӯба онро барои шумо иҷро мекунад. Шумо назоратро ба ӯ интиқол додед (инversionи назорат). DI ҳамчун ё инversionи вобастагӣ (инversionи вобастагӣ, яъне кӯшиши бастани робитаҳои сахт байни модулҳо/синфҳои шумо, ки дар он як синф мустақиман ба дигараш пайваст аст) ё тазриқи вобастагӣ (тазриқи вобастагӣ, ин вақтест, ки an objectҳои гурба нестанд) фаҳмида мешавад. аз ҷониби шумо дар асоси он офарида шудааст ва баъд шумо онҳоро ба усулҳои худ мегузаред ва Баҳор онҳоро барои шумо эҷод мекунад ва шумо танҳо ба ӯ чизе мегӯед, ки "ман мехоҳам дар ин ҷо гурба гирам" ва ӯ онро дар усули худ ба шумо медиҳад). Мо дар мақолаҳои минбаъда бештар бо дуюм дучор мешавем.

Лӯбиё ва контекст

Яке аз мафҳумҳои асосӣ дар фасли баҳор лӯбиё аст . Дар асл, он танҳо як an objectи ягон синф аст. Фарз мекунем, ки барои барномаи мо мо бояд 3 an objectро истифода барем: гурба, саг ва тӯтиӣ. Ва мо як даста дарсҳо дорем бо як қатор усулҳо, ки баъзан ба мо як гурба барои усул ва саг барои усули дигар лозим аст ва баъзан мо усулҳое дорем, ки гурба ва тӯтӣ лозим аст (масалан, усул барои таъом додани гурба, хехе) ва дар баъзе усулхо хар се an object лозим мешавад. Бале, мо метавонем аввал ин се an objectро дар асосӣ созем ва сипас онҳоро ба синфҳои худ ва аз дохor синфҳо ба усулҳои зарурии мо гузаронем... Ва ғайра дар тамоми барнома. Ва агар мо инчунин тасаввур кунем, ки мо давра ба давра мехоҳем рӯйхати параметрҳои қабулшударо барои усулҳои худ тағир диҳем (хуб, мо тасмим гирифтем, ки чизеро аз нав нависем ё функсия илова кунем) - пас ба мо лозим меояд, ки ба code бисёр таҳрирҳо ворид кунем, агар ба мо лозим ояд. чизеро тағир диҳед. Акнун, агар тасаввур кунем, ки мо 3 не, балки 300 хамин гуна an object дорем? Варианти алтернативӣ ин аст, ки ҳамаи ин гуна an objectҳои моро дар як рӯйхати умумии an objectҳо ( List<Object> ) ҷамъоварӣ намуда, ба ҳамаи усулҳо гузаронем ва аз дохor усулҳо ин ё он an objectи ба мо лозимиро ба даст орем. Аммо чӣ мешавад, агар мо тасаввур кунем, ки бо пешрафти барнома ягон an object метавонад ба ин рӯйхат илова карда шавад ё (чӣ бадтар аст) нест карда шавад? Он гоҳ дар ҳама усулҳое, ки мо an objectҳоро аз рӯйхат аз рӯи индексашон мегирем, ҳама чиз метавонад вайрон шавад. Он гоҳ мо қарор медиҳем, ки на рӯйхат, балки харитаеро нигоҳ дорем, ки дар он калид номи an objectи ба мо лозим аст ва арзиш худи an object хоҳад буд ва он гоҳ мо метавонем an objectҳои ба мо лозимиро аз он танҳо бо номи онҳо ба даст орем. : get("tutu") ва дар посух мо як тӯтӣ an object гирифтем Ё, масалан, калид синфи an object аст ва арзиш худи an object аст, пас мо дигар наметавонем номи an objectро нишон диҳем, балки танҳо синфи an objectи ба мо лозимиро нишон диҳем, ки ин ҳам қулай аст. Ё ҳатто дар болои харита ягон намуди печанда нависед, ки дар он шумо метавонед усулҳоро созед, то дар баъзе мавридҳо шумо an objectҳоро бо номи онҳо ва дар дигар ҳолатҳо аз рӯи синф дарёфт кунед. Ин аст он чизе ки мо аз контексти барномаи баҳорӣ мегирем . Контекст маҷмӯи лӯбиёҳо (an objectҳо) мебошад. Ба контекст рӯ оварда, мо метавонем лӯбиёи (an objectи) ба мо лозимро аз рӯи номаш, масалан, аз рӯи намудаш ё чизи дигар гирем. Илова бар ин, мо метавонем аз Баҳор хоҳиш кунем, ки лӯбиёеро, ки ба мо лозим аст, ҷустуҷӯ кунад ва онро ба усули мо гузаронад. Масалан, агар мо чунин усул дошта бошем:
public void doSomething(Cat cat) {
    ...
}
Вақте ки Баҳор ин усулро барои мо номид, вай an objectи гурбаи моро аз контексти худ ба он гузаронд. Акнун мо карор додем, ки усули мо ба гайр аз як гурба, инчунин як тути лозим аст. Истифодаи баҳор - ҳеҷ чиз барои мо осонтар нест! Мо танҳо менависем:
public void doSomething(Cat cat, Parrot parrot) {
    ...
}
ва Баҳор, вақте ки ин усули моро мехонад, дарк хоҳад кард, ки мо бояд як гурба ва тӯтиро дар ин ҷо гузаронем, ба контексти он биравем, ин ду ашёро гирифта, ба усули мо гузаронем. Мо зимоми барномаи худро ба Баҳор дода, масъулияти эҷоди an objectҳо ва ба усулҳои мо гузаштани онҳоро низ ба зиммаи ӯ додем, ки ӯ онро даъват мекунад. Саволе ба миён меояд: Баҳор аз куҷо медонад, ки кадом an objectҳоро (бинҳоро) сохтан лозим аст?

Усулҳои конфигуратсияи барнома

Се роҳи асосии конфигуратсияи барнома вуҷуд дорад (яъне ба Spring бигӯед, ки мо бояд кадом an objectҳоро кор кунем):
  1. бо истифода аз файлҳои xml/configs;
  2. бо истифода аз конфигуратсияҳои java;
  3. конфигуратсияи автоматӣ.
Таҳиягарони баҳор онҳоро бо ин тартиби афзалиятнок ҷойгир мекунанд:
  • усули афзалиятнок, ки бояд афзалият дода шавад, конфигуратсияи автоматӣ мебошад;
  • агар бо истифода аз конфигуратсияи автоматӣ дуруст танзим кардани ҳамаи лӯбиёҳои имконпазир ғайриимкон бошад, конфигуратсияи Java-ро истифода баред (сохтани an objectҳо бо рамзи Java);
  • Хуб, роҳи афзалиятноки пасттарин роҳи кӯҳна бо истифода аз конфигуратсияҳои xml мебошад.
Илова бар ин, Баҳор ба шумо имкон медиҳад, ки ин усулҳоро якҷоя кунед. Масалан, бигзор Spring ҳама чизеро, ки ба таври худкор танзим кардан мумкин аст, иҷро кунад; дар он ҷое, ки шумо бояд баъзе параметрҳои махсусро муайян кунед, онро бо истифода аз конфигуратсияҳои Java иҷро кунед ва илова бар ин, шумо метавонед баъзе конфигуратсияҳои кӯҳнаро дар формати xml пайваст кунед. Умуман, ҳамаи ин метавонад хеле чандир анҷом дода шавад. Аммо ба ҳар ҳол, агар ҳама чиз бо истифода аз танзимоти худкор анҷом дода шавад, онро истифода баред. Ман танҳо конфигуратсияи автоматӣ ва конфигуратсияҳои Java-ро баррасӣ хоҳам кард; конфигуратсияҳои xml аллакай қариб дар ҳар як мисоли баҳор дар Интернет истифода мешаванд ва вақте ки шумо фаҳмед, ки конфигуратсияи Java чӣ гуна кор мекунад, дар "хондан" файли xml, ки ҳамон корро мекунад, ҳеҷ мушкиле вуҷуд надорад. Конфигуратсияи худкор вақте истифода мешавад, ки an objectҳое, ки ба мо барои кор лозиманд, an objectҳои синфҳои навиштаамон мебошанд . Агар барои сохтани an objectи синфи мо мантиқи хеле мушаххас лозим бошад ё агар мо имкон надорем, ки баъзе синфҳоро бо эзоҳоти лозима, ки тавассути конфигуратсияи автоматӣ гирифта мешавад, қайд кунем, ин корро дар конфигуратсияҳои Java иҷро кардан мумкин аст. . Дар қисми оянда , мо як лоиҳаи maven эҷод мекунем, якчанд модули марказии баҳорро ба он пайваст мекунем ва лӯбиёи аввалини худро эҷод мекунем.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION