Salam! JavaRush administrasiýasy täze derejeleriň üstünde işleýärkä, Bahar çarçuwasy boýunça birnäçe okuw makalalaryna başlamak isleýärin. Hawa, internetde bu mowzukda eýýäm köp materialyň bardygyny bilýärin, ýöne amaly görkezişi ýaly, olaryň hemmesi “Salam World” derejesinde. Annotasiýalary nädip dogry ýerleşdirmelidigi barada däl-de, hemmesiniň “kapotyň aşagynda” nähili işleýändigi barada gürleşmek isleýärin. Makala bu çarçuwany eýýäm bir ýa-da beýleki görnüşde işlän we esasy düşünjeler bilen tanyş bolanlar üçin niýetlenendir.
Kontekstiň başlangyjy.
Geliň, esaslardan başlalyň. Meniň pikirimçe, iň möhüm nokatlaryň biri kontekstiň gurulmagyna we noýba başlangyçlaryna düşünmekdir. Bilşiňiz ýaly, Bahar işe başlamazdan ozal düzülmeli. Öňünden gelýän döwürde bu xml faýllary bilen amala aşyryldy (käbir taslamalarda, esasanam köne taslamalarda, olar şu güne çenli dowam edýärler). Ine, şeýle konfigurasiýa faýlynyň kiçijik mysaly:<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="helloWorld" class="ru.javarush.HelloWorld">
<property name="message" value="Hello World!"/>
</bean>
</beans>
Umuman aýdanyňda, bu bir-iki sany dolandyryjy döretmek we başlangyç açmak üçin ýeterlikdir (bu çykmaz). Thisöne bu konfigurasiýa Bahary nädip işlär? Ine, zatlar gyzykly bolýar. Konfigurasiýamyza Bahar tarapyndan düşünilmegi üçin a XmlBeanDefinitionReader
. Bu xml-i gözden geçirýän we şol ýerde ýazan zatlarymyza esaslanýan BeanDefinition
içerki Bahar komponentidir. BeanDefinition
noýba hakda maglumatlary saklaýan obýektdir. Bu öz içine alýar: haýsy synpdan (noýba) döredilmeli; gerimi; ýalta başlangyç gurnalanmy; Bu noýbadan öň xml-de beýan edilen başga we beýleki häsiýetleri başlamalymy? Alnanlaryň hemmesi , kesgitleýjiniň noýbanyň ady (siz tarapyndan bellenen ýa-da Bahar tarapyndan bellenen) we obýektiň özi BeanDefinition
goşulýar . Hemme zat döredilenden soň sahnada täze gahryman peýda bolýar - . Bu obýekt s -den gaýtalanýar , şoňa esaslanýan noýba döredýär we IoC konteýnerine salýar. Bu ýerde bir nuans bar, aslynda, programma başlanda, IoC konteýnerinde Singleton çäkli (deslapky tertipde) noýba bolar, galanlary zerur bolanda dörediler (prototip, haýyş, sessiýa). Indi bolsa kiçijik bir üýtgeşiklik, geliň başga bir häsiýet bilen tanyşalyň. HashMap
BeanDefinition
BeanDefinition
BeanFactory
HashMap’e
BeanDefinition
BeanPostProcessor bilen tanyşyň. (BPP)
Hakykat, noýba siziň amaly programmaňyz üçin işewürlik logikasy hökman däl. Fasulye infrastruktura noýbasy hem diýilýär. Gysgaça aýdylanda, infrastruktura noýbasy, iş logika noýbasyny (hawa, gaty köp noýba) düzýän synpdyr. Aşakda size bu barada has giňişleýin maglumat bererin, ýöne BPP-iň takyk düzýänini birneme düşnükli etmek üçin bir mysal bererin. Gysgaça mazmun bilen hemmeler tanyşmy@Autowired
? Şeýlelik bilen, AutowiredAnnotationBeanPostProcessor
ähli synplaryňyzyň biri-birine ornaşdyrylmagyny üpjün etmeli.
BeanFactory-a gaýdyp geleliň
HashMap
BPP hakda indi bilmek bilen, gaýtalananda BeanDefinition
hemme zadyň ilki döredilendigini we aýratyn ýerleşdirilendigini (IoC konteýnerinde däl) anyklamaly BeanPostProcessor
. Ondan soň, iş logikamyzyň yzygiderli noýbalary döredilýär, IoC konteýnerine salynýar we konfigurasiýasy aýratyn yza süýşürilen BPP-leri ulanyp başlaýar. Ine, şeýle bolýar, her BPP-de 2 usul bar:
postProcessorBeforeInitialization(Object bean, String beanName);
postProcessorAfterInitialization(Object bean, String beanName);
Iki gezek gaplarymyzdan geçýär. Usul birinji gezek postProcessorBeforeInitialization
, ikinji gezek usul diýilýär postProcessorAfterInitialization
. Elbetde, iki usulyň näme üçin zerurdygy barada sorag ýüze çykdy, düşündiriň. Hakykat, käbir bellikleri gaýtadan işlemek üçin (mysal üçin @Transactional
), noýba proksi synpy bilen çalşylýar. Munuň näme üçin edilýändigine düşünmek üçin onuň nähili işleýändigini bilmeli @Transactional
we bu nähili işleýär. Uçuşda bu bellik bilen bellenen usula ýene birnäçe setir kod goşmaly. Muny nädip etmeli? Dogry, proksi synpyny döretmek arkaly, zerur usula zerur kod goşular. Indi bu ýagdaýy göz öňüne getiriň, biziň synpymyz bar:
class A {
@Autowired
private SomeClass someClass;
@Transactional
public void method() {
// модификатор доступа обязательно public
}
}
Bu synpda 2 düşündiriş bar @Autowired
we @Transactional
. Iki düşündiriş hem dürli BPP-ler tarapyndan işlenýär. Ilki işleýän bolsa AutowiredBPP
, hemme zat gowy bolar, ýöne ýok bolsa, bu meselä duşarys. Hakykat, proksi synpy döredilende ähli meta maglumatlary ýitýär. @Autowired
Başga bir söz bilen aýdylanda, proksi synpynda düşündiriş hakda maglumat bolmaz we şonuň üçin AutowiredBPP
ol işlemez, bu biziň meýdançamyzyň NPE-e sebäp boljak someClass
gymmaty bolar diýmekdir. Şeýle hem , usul jaňlarynyň arasynda, eger bar bolsa, metod diýilýändigini null
bilmelidiris . Bu, esasan, ikinji konstruktor, ýöne tapawudy, häzirki wagtda ähli garaşlylyklarymyz eýýäm klasa ornaşdyryldy we olara -metoddan girip bileris . Şeýlelik bilen, kontekstiň başlangyç algoritmi ýene bir gezek: postProcessorBeforeInitialization
postProcessorAfterInitialization
init
init
XmlBeanDefinitionReader
xml konfigurasiýa faýlymyzy gözden geçirýär.- Lary döredýär
BeanDefinition
we goýýarHashMap
. - Gelýär
BeanFactory
we bulardanHashMap
aýratynlykda ähli zatlary goşýarBeanPostProcessor
. BeanDefinition
Fasuly döredýär we IoC konteýnerine ýerleşdirýär.- Bu ýerde BPP-ler gelip, bu noýbalary 2 usuldan düzýärler.
- Taýýar.
GO TO FULL VERSION