Ing artikel sadurunge , aku nerangake kanthi ringkes apa Spring lan apa kacang buncis lan konteks. Saiki wektune kanggo nyoba. Aku bakal nindakake nggunakake IntelliJ IDEA Enterprise Edition. Nanging kabeh conto uga kudu bisa digunakake ing IntelliJ IDEA Community Edition gratis. Ing gambar, yen sampeyan ndeleng aku duwe sawetara jendhela sing ora duwe, aja padha sumelang - iku ora penting kanggo project iki :)
First, nggawe proyek Maven kosong. Aku nuduhake carane nindakake iki ing artikel ing link iki . Waca nganti tembung " Wektu kanggo ngowahi proyek Maven dadi proyek web. " - sawise iku, artikel kasebut nuduhake carane nggawe proyek web, nanging saiki ora perlu. Ing src/main/javafolder, nggawe paket (ing cilik, aku disebut "
Ing jendhela ing sisih kiwa, sampeyan bisa ndeleng struktur project karo paket lan kelas

en.codegym.info.fatfaggy.animals
. Sampeyan bisa nelpon apa wae sing dikarepake. Cukup aja lali kanggo ngganti jeneng paket karo jeneng paket ing kabeh panggonan tengen. Saiki nggawe kelas Main
lan nambah a cara
public static void main(String[] args) {
...
}
Sawise iku, bukak file pom.xml lan tambahake dependencies
bagean kasebut. Saiki pindhah menyang repositori Maven lan temokake konteks Spring kanggo versi stabil paling anyar. Sijine apa kita temokake menyang dependencies
bagean. Aku njlèntrèhaké proses iki kanthi luwih rinci ing artikel CodeGym liyane (ndeleng bagean kanthi judhul " Nyambungake dependensi ing Maven "). Banjur Maven dhewe bakal nemokake lan ngundhuh dependensi sing dibutuhake. Ing pungkasan, sampeyan kudu njaluk kaya iki: 
Main
. Jendhela tengah nuduhake carane pom.xml katon kanggo kula. Aku uga nambah propertibagean kasebut. Bagian iki ngandhani Maven versi Java sing digunakake ing file sumber lan versi sing bakal dikompilasi. Iki mung supaya IDEA ora ngelingake yen aku nggunakake versi Jawa lawas. Iki opsional :) Jendhela tengen ndadekake cetha yen kita mung nyambungake modul spring-konteks, kanthi otomatis ditarik ing spring-inti, spring-kacang buncis, spring-aop lan spring-expression modul. Kita bisa nyambung saben modul kanthi kapisah, nulis dependensi kanggo saben modul kanthi versi eksplisit ing file pom.xml, nanging saiki kita seneng karo apa wae. Saiki nggawe entities
paket lan nggawe 3 kelas ing: Cat
, Dog
, Parrot
. Ayo menehi jeneng saben kewan (private String name
- sampeyan bisa hardcode sawetara nilai ana). Sing getter / setter umum. Saiki kita pindhah menyang Main
kelas lan main()
metode, lan kita nulis kaya iki:
public static void main(String[] args) {
// Create an empty Spring context that will look for its own beans based on the annotations in the specified package
ApplicationContext context =
new AnnotationConfigApplicationContext("en.codegym.info.fatfaggy.animals.entities");
Cat cat = context.getBean(Cat.class);
Dog dog = (Dog) context.getBean("dog");
Parrot parrot = context.getBean("parrot-polly", Parrot.class);
System.out.println(cat.getName());
System.out.println(dog.getName());
System.out.println(parrot.getName());
}
Pisanan, kita nggawe obyek konteks, ngandhani konstruktor paket sing kudu dideleng kanggo golek kacang. Ing tembung liyane, Spring bakal ngliwati paket iki lan nyoba golek kelas sing ditandhani karo anotasi khusus sing nuduhake yen kacang buncis. Banjur nggawe obyek saka kelas kasebut lan dilebokake ing konteks. Sawise iku, kita entuk kucing saka konteks iki. Kita nelpon obyek konteks kanggo menehi kita kacang (obyek), nuduhake kelas obyek sing dikarepake (kanthi cara, kita uga bisa nemtokake antarmuka, ora mung kelas). Sawise iku, Spring ngasilake obyek saka kelas sing dijaluk, sing banjur disimpen ing variabel. Sabanjure, kita takon Spring kanggo njaluk kita kacang disebut "asu". Nalika Spring nggawe aDog
obyek, menehi obyek jeneng standar (kajaba kacang digawe wis tegas diutus jeneng), kang jeneng kelas nanging karo huruf cilik dhisikan. Ing kasus iki, kelas kita diarani Dog
, mula kacang kasebut diarani "asu". Yen kita butuh BufferedReader
obyek ing kana, Spring bakal menehi jeneng "bufferedReader". Lan amarga Jawa ora bisa 100% tartamtu kelas apa sing dikarepake, iku bakal ngasilake obyek Object
, sing banjur dibuwang kanthi manual menyang jinis sing dikarepake, yaikuDog
. Opsi ing ngendi kelas kasebut dituduhake kanthi jelas luwih trep. Opsi kaping telu yaiku njupuk kacang miturut jeneng kelas lan jeneng kacang. Bisa uga konteks kasebut duwe sawetara kacang saka kelas siji. Kanggo nunjukake kacang tartamtu sing kita butuhake, kita nuduhake jenenge. Amarga kita uga tegas nuduhake kelas kene, kita ora maneh kudu nindakake cast. PENTING!Yen Spring nemokake sawetara kacang buncis sing cocog karo syarat kita, mula ora bisa nemtokake kacang sing bakal diwenehake, mula bakal mbuwang pengecualian. Mulane, kanggo ngindhari kahanan iki, sampeyan kudu nyoba dadi spesifik sabisa kanggo ngandhani Spring kacang sing sampeyan butuhake. Yen Spring nggoleki konteks lan gagal nemokake kacang buncis sing cocog karo syarat kita, mula uga bakal mbuwang pengecualian. Pungkasan, kita mung nampilake jeneng kewan kita kanggo verifikasi manawa kita entuk barang sing dibutuhake. Nanging yen kita mbukak program saiki, kita bakal weruh sing Spring ora seneng - iku ora bisa nemokake kewan kita perlu ing konteks sawijining. Iki amarga durung nggawe kacang buncis iki. Kaya sing dakkandhakake sadurunge, nalika Spring mindai kelas, katon anotasi Spring dhewe. Lan yen Spring ora nemokake anotasi kasebut, mula ora t mikir sing kelas iki cocog karo kacang buncis sing perlu kanggo nggawe. Ndandani iki mung mbutuhake nambah@Component
anotasi ing ngarep saben kelas kewan kita.
@Component
public class Cat {
private String name = "Oscar";
...
}
Nanging ana liyane. Yen kita kudu tegas marang Spring sing buncis kanggo kelas iki kudu jeneng tartamtu, kita nunjukaké jeneng ing kurung sawise anotasi. Contone, kanggo ngandhani Spring supaya menehi jeneng " parrot-polly
" kanggo kacang parrot, yaiku jeneng sing bakal digunakake kanggo njaluk manuk beo iki ing main
metode kasebut, kita kudu nindakake kaya iki:
@Component("parrot-polly")
public class Parrot {
private String name = "Polly";
...
}
Iki minangka titik kabeh konfigurasi otomatis . Sampeyan nulis kelas, menehi tandha karo anotasi sing dibutuhake, lan ngandhani Spring paket sing duwe kelas sampeyan. Iki minangka paket sing bakal ditindakake kerangka kanggo nemokake anotasi lan nggawe obyek saka kelas kasebut. Miturut cara, Spring ora mung nggoleki @Component
anotasi, nanging uga kabeh anotasi liyane sing duwe warisan iki. Contone, @Controller
, @RestController
, @Service
, @Repository
, lan liyane, sing bakal kita kenal ing artikel sabanjure. Saiki kita bakal nyoba nindakake perkara sing padha nggunakake konfigurasi basis Java . Kanggo miwiti, mbusak@Component
anotasi saka kelas kita. Kanggo nggawe luwih tantangan, bayangake yen kita ora nulis kelas kasebut, mula kita ora bisa ngowahi kanthi gampang, tegese ora bisa nambah anotasi. Kayane kelas kasebut dikemas ing sawetara perpustakaan. Ing kasus iki, ora ana cara kanggo ngowahi kelas kasebut supaya bisa diakoni dening Spring. Nanging kita butuh obyek saka kelas kasebut! Ing kene kita butuh konfigurasi basis Java kanggo nggawe obyek kasebut. Kanggo miwiti, gawe paket kanthi jeneng kaya configs
. Ing paket iki, gawe kelas Jawa biasa, kaya MyConfig
, lan tandhani nganggo @Configuration
anotasi.
@Configuration
public class MyConfig {
}
Saiki kita kudu ngapiki main()
cara, ngganti cara nggawe konteks. Kita bisa kanthi jelas nuduhake kelas sing duwe konfigurasi kita:
ApplicationContext context =
new AnnotationConfigApplicationContext(MyConfig.class);
Yen kita duwe sawetara macem-macem kelas sing nggawe kacang buncis lan kita pengin nyambungake sawetara bebarengan, kita mung nuduhake kabeh ana, dipisahake karo koma:
ApplicationContext context =
new AnnotationConfigApplicationContext(MyConfig.class, MyAnotherConfig.class);
Lan yen kita duwe akeh banget lan kita pengin nyambungake kabeh bebarengan, kita mung nuduhake jeneng paket sing ana ing:
ApplicationContext context =
new AnnotationConfigApplicationContext("en.codegym.info.fatfaggy.animals.configs");
Ing kasus iki, Spring bakal mbukak paket lan nemokake kabeh kelas sing ditandhani karo anotasi @Configuration
. Ya, lan yen kita duwe program sing gedhe banget ing ngendi konfigurasi dipérang dadi paket sing beda-beda, mula kita mung nuduhake dhaptar jeneng paket sing dipisahake koma sing ngemot konfigurasi:
ApplicationContext context =
new AnnotationConfigApplicationContext("en.codegym.info.fatfaggy.animals.database.configs",
"en.codegym.info.fatfaggy.animals.root.configs",
"en.codegym.info.fatfaggy.animals.web.configs");
Utawa jeneng paket sing umum kanggo kabeh:
ApplicationContext context =
new AnnotationConfigApplicationContext("en.codegym.info.fatfaggy.animals");
Sampeyan bisa nindakake iku Nanging pengin, nanging misale jek kula sing pilihan banget pisanan, kang mung nuduhake kelas karo konfigurasi, bakal cocog program kita paling. Nalika nggawe konteks, Spring nggoleki kelas sing ditandhani karo @Configuration
anotasi lan bakal nggawe obyek dhewe saka kelas kasebut. Iku nyoba nelpon cara ditandhani karo @Bean
anotasi, kang tegese cara iki bali kacang buncis (obyek) sing Spring bakal nambah konteks. Lan saiki kita bakal nggawe kacang buncis kanggo kucing, asu, lan manuk beo ing kelas kita kanthi konfigurasi basis Jawa. Iki cukup prasaja kanggo nindakake:
@Bean
public Cat getCat() {
return new Cat();
}
Ing kene kita nggawe kucing kanthi manual lan nyerahake menyang Spring, sing banjur nahan obyek ing konteks. Amarga kita ora kanthi tegas menehi jeneng kanggo kacang kita, Spring bakal menehi jeneng sing padha karo jeneng metode kasebut. Ing kasus kita, kacang kucing bakal diarani " getCat
". Nanging amarga kita nggunakake kelas, dudu jeneng, kanggo njaluk kacang kucing ing main
cara, jeneng kacang iku ora penting kanggo kita. Kajaba iku, nggawe kacang asu, elinga yen Spring bakal menehi jeneng metode kanggo kacang. Kanggo kanthi jelas menehi jeneng kacang parrot, kita mung nuduhake jeneng kasebut ing kurung sawise @Bean
anotasi:
@Bean("parrot-polly")
public Object weNeedMoreParrots() {
return new Parrot();
}
Kaya sing sampeyan ngerteni, ing kene aku nuduhake Object
jinis bali lan menehi jeneng kanthi sewenang-wenang. Iki ora mengaruhi jeneng kacang, amarga kita nemtokake jeneng kasebut kanthi jelas ing kene. Nanging, luwih apik kanggo nunjukake nilai bali lan jeneng metode sing luwih utawa kurang migunani. Tindakake iki yen ora ana alesan liyane kajaba kanggo nindakake dhewe nalika sampeyan mbukak proyek maneh sajrone setaun. :) Saiki nimbang kahanan nalika kita butuh kacang siji kanggo nggawe kacang liyane . Contone, umpamane kita pengin jeneng kucing ing kacang kucing dadi jeneng manuk beo ditambah string "-killer". Ora masalah!
@Bean
public Cat getCat(Parrot parrot) {
Cat cat = new Cat();
cat.setName(parrot.getName() + "-killer");
return cat;
}
Ing kene Spring bakal weruh yen kanggo nggawe kacang iki, kerangka kudu ngliwati kacang parrot sing digawe sadurunge. Patut, iku bakal ngatur chain perlu saka cara telpon: pisanan, cara nggawe manuk beo disebut lan banjur framework liwat parrot anyar kanggo cara cat-nggawe. Mangkene injeksi ketergantungan : Spring dhewe ngliwati kacang nuri sing dibutuhake kanggo metode kita. Yen IDEA nesu babagan parrot
variabel kasebut, aja lali ngganti jinis bali cara nggawe parrot saka Object
menyang Parrot
. Kajaba iku, konfigurasi basis Java ngidini sampeyan mbukak kode Java apa waeing cara nggawe kacang sampeyan. Sampeyan pancene bisa nindakake apa wae: nggawe obyek tambahan liyane, nelpon cara liya, sanajan sing ora ditandhani karo anotasi Spring, nggawe puteran, kahanan Boolean - apa wae sing dipikirake! Iki ora kabeh bisa karo konfigurasi otomatis, lan malah kurang karo konfigurasi XML. Saiki ayo nimbang masalah sing rada nyenengake. Polimorfisme lan antarmuka :) Kita bakal nggawe WeekDay
antarmuka lan nggawe 7 kelas sing ngleksanakake antarmuka iki: Monday
, Tuesday
, Wednesday
, Thursday
, Friday
, Saturday
, Sunday
. Kita bakal menehi antarmuka String getWeekDayName()
cara, sing bakal ngasilake jeneng dina minggu kanggo kelas sing cocog. Ing tembung liyane, Monday
kelas bakal bali "Monday
", etc. Sawise miwiti aplikasi, umpamane tugas kita yaiku nyelehake kacang sing cocog karo dina minggu iki menyang konteks. Ora kacang buncis kanggo kabeh kelas sing ngetrapake antarmuka - mung siji kacang sing kita butuhake. Sampeyan WeekDay
bisa nglakoni kaya mangkene:
@Bean
public WeekDay getDay() {
DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();
switch (dayOfWeek) {
case MONDAY: return new Monday();
case TUESDAY: return new Tuesday();
case WEDNESDAY: return new Wednesday();
case THURSDAY: return new Thursday();
case FRIDAY: return new Friday();
case SATURDAY: return new Saturday();
default: return new Sunday();
}
}
Ing kene jinis bali yaiku antarmuka kita. Cara ngasilake obyek bona fide salah siji saka kelas sing ngleksanakake antarmuka, gumantung ing dina saiki minggu. Saiki kita bisa nindakake ing ngisor iki ing main()
cara:
WeekDay weekDay = context.getBean(WeekDay.class);
System.out.println("Today is " + weekDay.getWeekDayName() + "!");
Kanggo kula, program ngandhani yen Minggu :) Aku yakin yen aku mbukak program sesuk, konteks bakal ngemot obyek sing beda. Elinga yen kita entuk kacang buncis mung nggunakake antarmuka: context.getBean(WeekDay.class)
. Spring bakal nggoleki konteks kanggo kacang sing ngetrapake antarmuka, lan bakal ngasilake. Banjur dadi metu sing kita WeekDay
variabel ends munggah karo obyek Sunday, lan konsep menowo polymorphism ditrapake nalika kita bisa karo variabel iki. :) Saiki sawetara tembung babagan pendekatan gabungan , sing sawetara kacang digawe kanthi otomatis dening Spring, sawetara kanthi mindhai paket kanggo kelas kanthi anotasi @Component
, lan liya-liyane kanthi konfigurasi basis Jawa. Nalika kita nimbang iki, kita bakal bali menyang versi asli, ngendi Cat
, Dog
, lanParrot
kelas ditandhani karo @Component
anotasi. Upaminipun kita pengin nggawe kacang buncis kanggo kewan kita kanthi Spring otomatis mindai paket entities
, nanging kita uga pengin nggawe buncis karo dina minggu, kaya kita mung nindakake. Sampeyan mung kudu nambah @ComponentScan
anotasi ing tingkat kelas MyConfig
, sing dituduhake nalika nggawe konteks ing main()
, lan nuduhake ing kurung paket sing kudu dipindai lan nggawe kacang buncis saka kelas sing perlu kanthi otomatis:
@Configuration
@ComponentScan("en.codegym.info.fatfaggy.animals.entities")
public class MyConfig {
@Bean
public WeekDay getDay() {
DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();
switch (dayOfWeek) {
case MONDAY: return new Monday();
case TUESDAY: return new Tuesday();
case WEDNESDAY: return new Wednesday();
case THURSDAY: return new Thursday();
case FRIDAY: return new Friday();
case SATURDAY: return new Saturday();
default: return new Sunday();
}
}
}
Nalika nggawe konteks, Spring weruh yen perlu ngolah MyConfig
kelas. Iku lumebu ing kelas lan weruh sing perlu mindhai en.codegym.info.fatfaggy.animals.entities
paket " " lan nggawe kacang buncis kelas sing, sawise kang executes cara MyConfig
kelas getDay()
lan nambah WeekDay
kacang kanggo konteks. Ing main()
metode kasebut, saiki kita duwe akses menyang kabeh kacang buncis sing kita butuhake: obyek kewan lan kacang karo dina minggu. Yen sampeyan kudu nggawe Spring uga njupuk sawetara file konfigurasi XML, sampeyan bisa nindakake panelusuran web dhewe kanggo nemokake panjelasan :) Ringkesan:
- Coba gunakake konfigurasi otomatis
- Sajrone konfigurasi otomatis, nunjukake jeneng paket sing ngemot kelas sing kudu digawe kacang buncis
- Kelas kasebut ditandhani karo
@Component
anotasi - Spring mlaku liwat kabeh kelas iki, nggawe obyek, lan sijine ing konteks;
- Yen konfigurasi otomatis ora cocog kanggo sawetara alasan, kita nggunakake konfigurasi basis Java
- Ing kasus iki, kita nggawe kelas Jawa biasa sing cara ngasilake obyek sing dibutuhake. Kita menehi tandha kelas iki kanthi
@Configuration
anotasi yen kita bakal mindai kabeh paket tinimbang nuduhake kelas tartamtu kanthi konfigurasi nalika nggawe konteks - Cara kelas iki sing ngasilake kacang ditandhani karo
@Bean
anotasi
@ComponentScan
.
GO TO FULL VERSION