Салом! Ҳангоме ки маъмурияти JavaRush дар сатҳҳои нав кор мекунад, ман мехоҳам як силсила мақолаҳои омӯзишӣ дар чаҳорчӯбаи баҳорро оғоз кунам. Бале, ман медонам, ки дар Интернет аллакай маводи зиёде дар ин мавзӯъ мавҷуд аст, аммо, тавре ки таҷриба нишон медиҳад, онҳо ҳама дар сатҳи Hello World мебошанд. Ман мехоҳам на дар бораи чӣ гуна дуруст ҷойгир кардани эзоҳҳо, балки дар бораи он ки чӣ тавр ҳама "дар зери сарпӯш" кор мекунанд, гап занам. Мақола барои онҳое пешбинӣ шудааст, ки аллакай бо ин чаҳорчӯба бо ин ё он роҳ кор кардаанд ва бо мафҳумҳои асосӣ шиносанд.
Оғоз кардани контекст.
Пас, биёед бо асосҳо оғоз кунем. Ба андешаи ман, яке аз нуктаҳои муҳимтарин фаҳмидани он аст, ки контекст чӣ гуна танзим карда мешавад ва лӯбиёҳо оғоз карда мешаванд. Тавре ки шумо медонед, пеш аз он ки Баҳор ба кор шурӯъ кунад, он бояд танзим карда шавад. Дар замонҳои қадим, ин бо истифода аз файлҳои 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
эҷод мекунад. BeanDefinition
an objectест, ки маълумотро дар бораи лубиё нигоҳ медорад. Ин дар бар мегирад: аз кадом синф он (лубиё) бояд офарида шавад; доираи; оё оғози танбал насб шудааст; Оё пеш аз ин лӯбиё дигар ва дигар хосиятҳоеро, ки дар xml тавсиф шудаанд, оғоз кардан лозим аст. Ҳама гирифташудаҳо BeanDefinition
ба , илова карда мешаванд HashMap
, ки дар он идентификатор номи лӯбиё (аз ҷониби шумо муқаррар карда ё Баҳор таъин кардааст) ва BeanDefinition
худи an object мебошад. Пас аз он ки ҳама чиз BeanDefinition
офарида шудааст, дар саҳна қаҳрамони нав пайдо мешавад - BeanFactory
. Ин an object зиёда аз HashMap’e
s такрор мекунад 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
. Ин асосан конструктори дуюм аст, аммо фарқият дар он аст, ки дар айни замон ҳамаи вобастагии мо аллакай дар синф ҷойгир карда шудаанд ва мо метавонем ба онҳо аз усули -метод дастрасӣ пайдо кунем. Ҳамин тавр, бори дигар алгоритми оғозкунии контекст: postProcessorAfterInitialization
init
init
XmlBeanDefinitionReader
файли конфигуратсияи xml-и моро скан мекунад.- Эҷод мекунад
BeanDefinition
ва онҳоро дар дохor он мегузорадHashMap
. - Меояд
BeanFactory
ва аз инHashMap
алоҳида ҳама 'ҳоро ҷамъ мекунадBeanPostProcessor
. - Лӯбиёҳоро аз 'ҳо месозад
BeanDefinition
ва онҳоро дар як контейнери IoC ҷойгир мекунад. - Дар ин ҷо BPPҳо меоянд ва ин лӯбиёҳоро бо 2 усул танзим мекунанд.
- Тайёр.
GO TO FULL VERSION