JavaRush /Блоги Java /Random-TG /Чаҳорчӯбаи баҳорӣ. Муқаддима
Marchello
Сатҳи
Санкт-Петербург

Чаҳорчӯбаи баҳорӣ. Муқаддима

Дар гурӯҳ нашр шудааст
Салом! Ҳангоме ки маъмурияти JavaRush дар сатҳҳои нав кор мекунад, ман мехоҳам як силсила мақолаҳои омӯзишӣ дар чаҳорчӯбаи баҳорро оғоз кунам. Бале, ман медонам, ки дар Интернет аллакай маводи зиёде дар ин мавзӯъ мавҷуд аст, аммо, тавре ки таҷриба нишон медиҳад, онҳо ҳама дар сатҳи Hello World мебошанд. Ман мехоҳам на дар бораи чӣ гуна дуруст ҷойгир кардани эзоҳҳо, балки дар бораи он ки чӣ тавр ҳама "дар зери сарпӯш" кор мекунанд, гап занам. Мақола барои онҳое пешбинӣ шудааст, ки аллакай бо ин чаҳорчӯба бо ин ё он роҳ кор кардаанд ва бо мафҳумҳои асосӣ шиносанд. Чаҳорчӯбаи баҳорӣ.  Муқаддима - 1

Оғоз кардани контекст.

Пас, биёед бо асосҳо оғоз кунем. Ба андешаи ман, яке аз нуктаҳои муҳимтарин фаҳмидани он аст, ки контекст чӣ гуна танзим карда мешавад ва лӯбиёҳо оғоз карда мешаванд. Тавре ки шумо медонед, пеш аз он ки Баҳор ба кор шурӯъ кунад, он бояд танзим карда шавад. Дар замонҳои қадим, ин бо истифода аз файлҳои xml анҷом дода мешуд (дар баъзе лоиҳаҳо, асосан лоиҳаҳои кӯҳна, онҳо ин корро то имрӯз идома медиҳанд). Ин аст як мисоли хурди чунин файли конфигуратсия:
<?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>
Умуман, ин барои эҷоди як ҷуфт контроллер ва оғоз кардани стартап кифоя аст (ки ба кор намебарояд). Аммо ин конфигуратсия баҳорро чӣ гуна кор хоҳад кард? Ва дар ин ҷо чизҳо ҷолиб мешаванд. Барои он ки конфигуратсияи моро баҳор фаҳмад, як XmlBeanDefinitionReader. Ин як ҷузъи дохorи Spring аст, ки xml-ро скан мекунад (таҳлил мекунад) ва дар асоси он чизе ки мо дар он навишта будем, BeanDefinitionэҷод мекунад. BeanDefinitionan objectест, ки маълумотро дар бораи лубиё нигоҳ медорад. Ин дар бар мегирад: аз кадом синф он (лубиё) бояд офарида шавад; доираи; оё оғози танбал насб шудааст; Оё пеш аз ин лӯбиё дигар ва дигар хосиятҳоеро, ки дар xml тавсиф шудаанд, оғоз кардан лозим аст. Ҳама гирифташудаҳо BeanDefinitionба , илова карда мешаванд HashMap, ки дар он идентификатор номи лӯбиё (аз ҷониби шумо муқаррар карда ё Баҳор таъин кардааст) ва BeanDefinitionхуди an object мебошад. Пас аз он ки ҳама чиз BeanDefinitionофарида шудааст, дар саҳна қаҳрамони нав пайдо мешавад - BeanFactory. Ин an object зиёда аз HashMap’es такрор мекунад BeanDefinition, дар асоси онҳо лӯбиёҳо эҷод мекунад ва онҳоро ба контейнери IoC мегузорад. Дар ин ҷо як нозуки вуҷуд дорад, дар асл, вақте ки барнома оғоз меёбад, контейнери IoC лӯбиёҳоеро дар бар мегирад, ки миқёси Singleton доранд (бо нобаёнӣ муқаррар карда шудааст), дар ҳоле ки боқимонда ҳангоми зарурат сохта мешаванд (прототип, дархост, сессия). Ва ҳоло як дурнамои хурд, биёед бо як қаҳрамони дигар шинос шавем.

Бо BeanPostProcessor вохӯред. (BPP)

протсессори пости лӯбиёДалели он аст, ки лӯбиё ҳатман як синфи мантиқи тиҷорат барои барномаи шумо нест. Лӯбиёро инчунин лӯбиёи инфрасохторӣ меноманд. Хулоса, лӯбиёи инфрасохторӣ синфест, ки лӯбиёи мантиқии тиҷорати шуморо танзим мекунад (бале, лӯбиёи аз ҳад зиёд). Ман ба шумо дар бораи он дар зер бештар нақл мекунам, аммо барои каме равшантар кардани он, ки маҳз BPP чӣ конфигуратсия мекунад, ман як мисол меорам. Оё ҳама бо хулоса шиносанд @Autowired? Ҳамин тавр, шумо AutowiredAnnotationBeanPostProcessorмасъул ҳастед, ки ҳамаи синфҳои шумо дар ҳамдигар ҷойгир карда шаванд. бехабар

Биёед ба BeanFactory баргардем

Ҳоло дар бораи BPP донист, бояд фаҳмонем, ки ҳангоми такрор кардани HashMap'ҳо, BeanDefinitionҳама 'ҳо аввал алоҳида сохта ва ҷойгир карда мешаванд (на дар контейнери IoC) BeanPostProcessor. Пас аз ин, лӯбиёҳои муқаррарии мантиқи тиҷории мо сохта мешаванд, ба контейнери IoC гузошта мешаванд ва конфигуратсияи онҳо бо истифода аз BPP-ҳои алоҳида ба таъхир гузошташуда оғоз меёбад. Ва ин тавр мешавад, ҳар як BPP 2 усул дорад:
postProcessorBeforeInitialization(Object bean, String beanName);
postProcessorAfterInitialization(Object bean, String beanName);
Аз қуттиҳои мо ду маротиба такрор мекунад. Дафъаи аввал усули ном дорад postProcessorBeforeInitializationва дафъаи дуюм усул номида мешавад postProcessorAfterInitialization. Албатта саволе ба миён омад, ки чаро ду усул лозим аст, биёед шарҳ диҳам. Гап дар он аст, ки барои коркарди баъзе эзоҳҳо (масалан @Transactional, ), лӯбиёи мо бо синфи прокси иваз карда мешавад. Барои фаҳмидани он ки чаро ин кор карда мешавад, шумо бояд бидонед, ки он чӣ гуна кор мекунад @Transactionalва ин чӣ гуна кор мекунад. Ба шумо лозим аст, ки чанд сатри дигари codeро ба усули бо ин эзоҳ дар парвоз қайдшуда илова кунед. Чӣ тавр бояд кард? Дуруст аст, ки тавассути сохтани синфи прокси, ки дар дохor он ба усули зарурӣ рамзи зарурӣ илова карда мешавад. Акнун ин вазъиятро тасаввур кунед, мо синф дорем:
class A {
    @Autowired
    private SomeClass someClass;

    @Transactional
    public void method() {
        // модификатор доступа обязательно public
    }
}
Ин синф дорои 2 тафсир @Autowiredва @Transactional. Ҳарду эзоҳҳо аз ҷониби BPP-ҳои гуногун коркард карда мешаванд. Агар он аввал кор кунад AutowiredBPP, ҳама чиз хуб мешавад, аммо агар не, мо ба ин мушкилот дучор хоҳем шуд. Далели он аст, ки вақте ки синфи прокси сохта мешавад, ҳама маълумоти мета гум мешаванд. Ба ибораи дигар, дар синфи прокси маълумот дар бораи эзоҳ мавҷуд нахоҳад буд @Autowiredва аз ин рӯ AutowiredBPPон кор намекунад, яъне майдони мо someClassдорои арзиши null, ки эҳтимолан ба NPE оварда мерасонад. Инчунин донистан лозим аст, ки дар байни зангҳои методӣ -метод , агар мавҷуд бошад, номида мешавад postProcessorBeforeInitialization. Ин асосан конструктори дуюм аст, аммо фарқият дар он аст, ки дар айни замон ҳамаи вобастагии мо аллакай дар синф ҷойгир карда шудаанд ва мо метавонем ба онҳо аз усули -метод дастрасӣ пайдо кунем. Ҳамин тавр, бори дигар алгоритми оғозкунии контекст: postProcessorAfterInitializationinitinit
  1. XmlBeanDefinitionReaderфайли конфигуратсияи xml-и моро скан мекунад.
  2. Эҷод мекунад BeanDefinitionва онҳоро дар дохor он мегузорад HashMap.
  3. Меояд BeanFactoryва аз ин HashMapалоҳида ҳама 'ҳоро ҷамъ мекунад BeanPostProcessor.
  4. Лӯбиёҳоро аз 'ҳо месозад BeanDefinitionва онҳоро дар як контейнери IoC ҷойгир мекунад.
  5. Дар ин ҷо BPPҳо меоянд ва ин лӯбиёҳоро бо 2 усул танзим мекунанд.
  6. Тайёр.
Дар асл, ин ҳама аст, нависед, ки агар ба шумо мақола маъқул бошад ва оё идома додани навиштани чунин дарсҳо меарзад.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION