Hello! Nalika administrasi JavaRush nggarap level anyar, aku pengin miwiti seri artikel latihan babagan Spring Framework. Ya, aku ngerti manawa ana akeh materi babagan topik iki ing Internet, nanging, minangka praktik nuduhake, kabeh ana ing tingkat Hello World. Aku ora pengin ngomong babagan cara nempatake anotasi kanthi bener, nanging babagan cara kerjane "ing hood". Artikel kasebut ditujokake kanggo wong-wong sing wis nggarap kerangka iki kanthi cara siji utawa liyane lan ngerti konsep dhasar.
Initializing konteks.
Dadi ayo miwiti kanthi dhasar. Ing mratelakake panemume, salah siji saka TCTerms paling penting kanggo ngerti carane konteks diatur lan buncis diinisialisasi. Kaya sing sampeyan ngerteni, sadurunge Spring wiwit digunakake, kudu dikonfigurasi. Ing jaman kuno, iki ditindakake kanthi nggunakake file xml (ing sawetara proyek, utamane sing lawas, terus ditindakake nganti saiki). Iki minangka conto cilik saka file konfigurasi kasebut:<?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>
Umumé, iki cukup kanggo nggawe sawetara pengontrol lan miwiti wiwitan (sing ora bakal mandheg). Nanging kepiye konfigurasi iki bakal nggawe Spring bisa digunakake? Lan ing kene dadi menarik. Supaya konfigurasi kita bisa dingerteni dening Spring, ana XmlBeanDefinitionReader
. BeanDefinition
Iki minangka komponen Spring internal sing mindai (ngurai) xml lan nggawe 's adhedhasar apa kita wrote ana . BeanDefinition
minangka obyek sing nyimpen informasi babagan kacang. Iki kalebu: saka kelas endi (kacang) kudu digawe; ruang lingkup; apa initialization puguh wis diinstal; Apa perlu kanggo initialize sadurunge kacang iki liyane lan sifat liyane sing diterangake ing xml. Kabeh ditampa BeanDefinition
's ditambahake menyang HashMap
, kang pengenal jeneng kacang (nyetel dening sampeyan utawa diutus dening Spring) lan BeanDefinition
obyek dhewe. Sawise kabeh BeanDefinition
digawe, pahlawan anyar katon ing panggung - BeanFactory
. Obyek iki iterates liwat HashMap’e
s BeanDefinition
, nggawe kacang buncis adhedhasar mau lan sijine menyang wadhah IoC. Ana nuansa ing kene, nyatane, nalika aplikasi diwiwiti, wadah IoC bakal ngemot kacang buncis sing duwe ruang lingkup Singleton (diset kanthi gawan), dene liyane digawe nalika dibutuhake (prototipe, panyuwunan, sesi). Lan saiki digression cilik, ayo kenalan karo karakter liyane.
Ketemu BeanPostProcessor. (BPP)
Kasunyatane yen kacang ora mesthi dadi kelas logika bisnis kanggo aplikasi sampeyan. Kacang buncis uga disebut kacang infrastruktur. Ing cendhak, kacang infrastruktur minangka kelas sing ngatur kacang logika bisnis sampeyan (ya, akeh banget kacang). Aku bakal pitutur marang kowe liyane babagan ing ngisor iki, nanging kanggo nggawe iku sethitik luwih cetha apa persis BPP configures, Aku bakal menehi conto. Apa kabeh wong ngerti ringkesan kasebut@Autowired
? Dadi, sampeyan AutowiredAnnotationBeanPostProcessor
tanggung jawab kanggo mesthekake yen kabeh kelas wis dipasang ing saben liyane.
Ayo bali menyang BeanFactory
Ngerti saiki babagan BPP, sampeyan kudu njlentrehake yen nalika ngulangHashMap
's, BeanDefinition
kabeh pisanan digawe lan diselehake kanthi kapisah (ora ing wadhah IoC) BeanPostProcessor
. Sawise iki, kacang buncis biasa saka logika bisnis digawe, dilebokake ing wadhah IoC, lan konfigurasi kasebut wiwit nggunakake BPP sing ditundha kanthi kapisah. Lan iki kedadeyane, saben BPP duwe 2 cara:
postProcessorBeforeInitialization(Object bean, String beanName);
postProcessorAfterInitialization(Object bean, String beanName);
Iterates liwat tong sampah kita kaping pindho. Kaping pisanan cara disebut postProcessorBeforeInitialization
, lan kaping pindho cara disebut postProcessorAfterInitialization
. Mesthine wis muncul pitakonan kenapa rong cara dibutuhake, aku bakal nerangake. Kasunyatane yaiku kanggo ngolah sawetara anotasi (kayata @Transactional
, contone), kacang kita diganti karo kelas proxy. Kanggo ngerti apa iki rampung, sampeyan kudu ngerti cara kerjane @Transactional
, lan iki cara kerjane. Sampeyan kudu nambahake sawetara baris kode menyang cara sing ditandhani karo anotasi iki kanthi cepet. Carane nindakake? Bener, kanthi nggawe kelas proxy, ing njero kode sing dibutuhake bakal ditambahake menyang metode sing dibutuhake. Saiki bayangake kahanan iki, kita duwe kelas:
class A {
@Autowired
private SomeClass someClass;
@Transactional
public void method() {
// модификатор доступа обязательно public
}
}
Kelas iki nduweni 2 anotasi @Autowired
lan @Transactional
. Loro-lorone anotasi diproses dening BPP sing beda. Yen kerjane luwih dhisik AutowiredBPP
, mula kabeh bakal apik, nanging yen ora, kita bakal nemoni masalah iki. Kasunyatane yaiku nalika kelas proxy digawe, kabeh informasi meta ilang. Ing tembung liyane, ora bakal ana informasi babagan anotasi @Autowired
ing kelas proxy, lan mulane AutowiredBPP
ora bakal bisa digunakake, tegese lapangan kita someClass
bakal duwe nilai null
, sing bakal nyebabake NPE. Sampeyan uga kudu ngerti yen ing antarane metode panggilan, metode - diarani postProcessorBeforeInitialization
, yen ana siji. Iki Sejatine konstruktor kapindho, nanging prabédan iku ing wayahe kabeh dependensi kita wis ditempelake ing kelas lan kita bisa ngakses saka -metode. Dadi, sepisan maneh algoritma initialization konteks: postProcessorAfterInitialization
init
init
XmlBeanDefinitionReader
mindai file konfigurasi xml kita.- Nggawe
BeanDefinition
's lan sijine wong ingHashMap
. - Teka
BeanFactory
lan saka ikiHashMap
kapisah nambah munggah kabehBeanPostProcessor
's. - Nggawe
BeanDefinition
kacang buncis saka 's lan sijine ing wadhah IoC. - Ing kene BPP teka lan ngatur kacang iki nggunakake 2 cara.
- siyap.
GO TO FULL VERSION