JavaRush /Java Blog /Random-TK /Bahar çarçuwasy. Giriş
Marchello
Dereje
Санкт-Петербург

Bahar çarçuwasy. Giriş

Toparda çap edildi
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. Bahar çarçuwasy.  Giriş - 1

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 BeanDefinitioniçerki Bahar komponentidir. BeanDefinitionnoý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 BeanDefinitiongoş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ň. HashMapBeanDefinitionBeanDefinitionBeanFactoryHashMap’eBeanDefinition

BeanPostProcessor bilen tanyşyň. (BPP)

noýba post prosessorHakykat, 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. uknowimean

BeanFactory-a gaýdyp geleliň

HashMapBPP hakda indi bilmek bilen, gaýtalananda BeanDefinitionhemme 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 @Transactionalwe 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 @Autowiredwe @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. @AutowiredBaşga bir söz bilen aýdylanda, proksi synpynda düşündiriş hakda maglumat bolmaz we şonuň üçin AutowiredBPPol işlemez, bu biziň meýdançamyzyň NPE-e sebäp boljak someClassgymmaty bolar diýmekdir. Şeýle hem , usul jaňlarynyň arasynda, eger bar bolsa, metod diýilýändigini nullbilmelidiris . 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: postProcessorBeforeInitializationpostProcessorAfterInitializationinitinit
  1. XmlBeanDefinitionReaderxml konfigurasiýa faýlymyzy gözden geçirýär.
  2. Lary döredýär BeanDefinitionwe goýýar HashMap.
  3. Gelýär BeanFactorywe bulardan HashMapaýratynlykda ähli zatlary goşýar BeanPostProcessor.
  4. BeanDefinitionFasuly döredýär we IoC konteýnerine ýerleşdirýär.
  5. Bu ýerde BPP-ler gelip, bu noýbalary 2 usuldan düzýärler.
  6. Taýýar.
Aslynda, bularyň hemmesi, makalany halasaňyz we şeýle gollanmalary ýazmagy dowam etdirmegiň ähmiýetini ýazyň.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION