JavaRush /Blog Jawa /Random-JV /Spring kanggo wong kesed. Fundamentals, konsep dhasar lan...

Spring kanggo wong kesed. Fundamentals, konsep dhasar lan conto karo kode. Bagean 2

Diterbitake ing grup
Ing artikel pungkasan , aku nerangake kanthi ringkes apa spring, apa tong sampah lan konteks. Saiki wektune kanggo nyoba cara kerjane. Spring kanggo wong kesed.  Fundamentals, konsep dhasar lan conto karo kode.  Bagean 2 - 1Aku bakal nindakake dhewe ing Intellij Idea Enterprise Edition. Nanging kabeh conto uga kudu bisa digunakake ing Intellij Idea Community Edition gratis. Mung yen sampeyan ndeleng ing gambar sing aku duwe sawetara jenis jendhela sing ora duwe, aja padha sumelang, iku ora kritis kanggo project iki :) Pisanan, ayo kang nggawe proyek Maven kosong. Aku nuduhake carane nindakake iki ing artikel (waca nganti tembung " Wektu kanggo ngowahi proyek maven kita dadi proyek web . Ayo nggawe ing src / folder utama / java sawetara paket (ing cilik aku disebut " ru.javarush.info.fatfaggy.animals", sampeyan bisa jeneng apa wae sing pengin, mung aja lali kanggo ngganti jeneng ing panggonan tengen). Lan ayo nggawe kelas Mainsing bakal nggawe metode
public static void main(String[] args) {
    ...
}
Banjur bukak file pom.xml lan tambahake bagean ing kana dependencies. Saiki kita pindhah menyang gudang Maven lan goleki konteks musim semi saka versi stabil paling anyar ing kana, lan tempel apa sing ana ing bagean kasebut dependencies. Aku njlèntrèhaké proses iki ing sethitik liyane rinci ing artikel iki (ndeleng bagean " Nyambungake dependensi ing Maven "). Banjur Maven dhewe bakal nemokake lan ndownload dependensi sing dibutuhake, lan ing pungkasan sampeyan kudu entuk kaya iki:
Spring kanggo wong kesed.  Fundamentals, konsep dhasar lan conto karo kode.  Bagean 2 - 2
Ing jendhela kiwa sampeyan bisa ndeleng struktur project karo paket lan kelas Main. Jendhela tengah nuduhake kaya pom.xmlku. Aku uga nambah bagean properti ana , ing ngendi aku nuduhake Maven versi Java sing digunakake ing kode sumber lan versi sing bakal dikompilasi. Iki mung supaya aku ora ngerti bebaya nalika miwiti yen versi Jawa lawas digunakake. Sampeyan bisa nindakake iku, sampeyan ora bisa) Ing jendhela tengen - sampeyan bisa ndeleng sing sanajan kita disambungake mung konteks spring - kanthi otomatis ditambahake inti, kacang buncis, aop lan expression. Sampeyan bisa nyambung saben modul kanthi kapisah, ndhaptar dependensi kanggo saben memori kanthi indikasi versi sing jelas, nanging saiki kita seneng karo pilihan kaya saiki. Saiki ayo nggawe paket entities(entitas) lan nggawe 3 kelas ing: Cat, Dog, Parrot. Ayo saben kewan duwe jeneng ( private String name, sampeyan bisa hardcode sawetara nilai ana), lan getter / setter umum. Saiki pindhah menyang kelas Mainlan main()nulis kaya iki ing metode:
public static void main(String[] args) {
	// create an empty spring context that will search for its beans by annotations in the specified package
	ApplicationContext context =
		new AnnotationConfigApplicationContext("ru.javarush.info.fatfaggy.animals.entities");

	Cat cat = context.getBean(Cat.class);
	Dog dog = (Dog) context.getBean("dog");
	Parrot parrot = context.getBean("parrot-kesha", Parrot.class);

	System.out.println(cat.getName());
	System.out.println(dog.getName());
	System.out.println(parrot.getName());
}
Kaping pisanan, kita nggawe obyek konteks, lan ing konstruktor kita menehi jeneng paket sing kudu dipindai kanggo anané kacang buncis. Yaiku, Spring bakal ngliwati paket iki lan nyoba golek kelas sing ditandhani karo anotasi khusus sing ngidini Spring ngerti yen iki kacang. Sawise nggawe obyek saka kelas kasebut lan nyelehake ing konteks. Sawise kita entuk kucing saka konteks iki. Nalika ngarahake obyek konteks, kita takon kanggo menehi kita kacang (obyek), lan nuduhake apa kelas obyek kita kudu (kene, dening cara, sampeyan bisa nemtokake ora mung kelas, nanging uga antarmuka). Sawisé iku Spring ngasilake obyek saka kelas iki kanggo kita, kang disimpen menyang variabel. Sabanjure, kita takon Spring kanggo njaluk kita kacang disebut "asu". Nalika Spring nggawe obyek kelas, Dogiku bakal menehi jeneng standar (yen jeneng kacang digawe ora tegas kasebut), kang jeneng kelas obyek, mung karo huruf cilik. Mulane, amarga kelas kita diarani Dog, jeneng kacang kasebut bakal dadi "asu". Yen kita duwe obyek ing kana BufferedReader, Spring bakal menehi jeneng standar "bufferedReader". Lan amarga ing kasus iki (ing Jawa) ora ana kepastian sing tepat babagan kelas apa obyek kasebut, mung ngasilake sing tartamtu Object, sing banjur dibuwang kanthi manual menyang jinis sing dibutuhake Dog. Opsi kanthi indikasi eksplisit kelas luwih trep. Inggih, ing kasus katelu, kita entuk kacang miturut kelas lan jeneng. Bisa uga ana kahanan sing ing konteks bakal ana sawetara kacang saka siji kelas, lan kanggo nunjukake kacang tartamtu sing kita butuhake, kita nuduhake jenenge. Awit kita uga cetha nuduhake kelas kene, kita ora maneh kudu cast. Penting!Yen ternyata Spring nemokake sawetara kacang buncis miturut syarat sing wis ditemtokake, mula ora bakal bisa nemtokake kacang sing bakal menehi kita lan bakal mbuwang pengecualian. Mulane, nyoba kanggo nunjukaké marang sakbenere sabisa sing bin sampeyan kudu, supaya kahanan kuwi ora njedhul. Yen Spring ora nemokake kacang buncis siji ing konteks miturut kahanan sampeyan, uga bakal mbuwang pengecualian. Ya, banjur kita mung nampilake jeneng kewan kita ing layar kanggo mesthekake yen iki bener-bener obyek sing kita butuhake. Nanging yen kita mbukak program saiki, kita bakal weruh sing Spring sumpah sing ora bisa nemokake kewan kita perlu ing konteks sawijining. Iki kedadeyan amarga dheweke ora nggawe kacang iki. Kaya sing wis dakkandhakake, nalika Spring mindai kelas, katon ana anotasi Spring "sawijining". Lan yen ora nemokake, banjur ora ngerteni kelas kaya sing kacang buncis kudu digawe. Kanggo ndandani iki, cukup nambah anotasi @Componenting ngarep kelas ing kelas kewan kita.
@Component
public class Cat {
	private String name = "Barsik";
	...
}
Nanging ora mung kuwi. Yen kita kudu tegas nuduhake Spring sing kacang buncis kanggo kelas iki kudu jeneng tartamtu, jeneng iki bisa dituduhake ing kurung sawise anotasi. Contone, supaya Spring menehi jeneng sing kita butuhake kanggo parrot-keshakacang beo, saka ngendi kita mainbakal nampa parrot iki, kita kudu nindakake kaya iki:
@Component("parrot-kesha")
public class Parrot {
	private String name = "Kesha";
	...
}
Iki minangka titik kabeh konfigurasi otomatis . Sampeyan nulis kelas, menehi tandha karo annotations perlu, lan nunjukaké Spring paket karo kelas, liwat kang dadi, katon kanggo anotasi lan nggawe obyek saka kelas kuwi. Miturut cara, Spring bakal nggoleki ora mung anotasi @Component, nanging uga kabeh anotasi liyane sing diwarisake saka siji iki. Contone, @Controller, @RestController, @Service, @Repositorylan liya-liyane, sing bakal ditemokake ing artikel liyane. Saiki ayo nyoba nglakoni sing padha, nanging nggunakake konfigurasi java . Pisanan, ayo mbusak anotasi @Componentsaka kelas kita. Kanggo complicate tugas, ayo kang mbayangno sing iki dudu kelas kita dhewe-ditulis, kang bisa gampang ngowahi, nambah soko, kalebu anotasi. Kaya-kaya kelas-kelas iki dikemas ing sawetara perpustakaan. Ing kasus iki, kita ora bisa ngowahi kelas kasebut kanthi cara apa wae supaya bisa ditampa ing musim semi. Nanging kita butuh obyek saka kelas kasebut! Ing kene kita butuh konfigurasi java kanggo nggawe obyek kasebut. Kanggo miwiti, ayo nggawe paket, contone configs, lan ing - kelas Jawa biasa, contone, MyConfiglan tandhani kanthi anotasi.@Configuration
@Configuration
public class MyConfig {
}
Saiki kita kudu rada ngapiki main()cara nggawe konteks ing metode kasebut. Kita bisa langsung nemtokake kelas kita kanthi konfigurasi ing kana:
ApplicationContext context =
	new AnnotationConfigApplicationContext(MyConfig.class);
Yen kita duwe sawetara kelas sing beda-beda ing ngendi kita nggawe kacang buncis lan kita pengin nyambungake sawetara bebarengan, kita mung nuduhake ing kono sing dipisahake karo koma:
ApplicationContext context =
	new AnnotationConfigApplicationContext(MyConfig.class, MyAnotherConfig.class);
Ya, yen kita duwe akeh banget, lan kita pengin nyambungake kabeh bebarengan, kita mung nuduhake ing kene jeneng paket sing kita duwe:
ApplicationContext context =
	new AnnotationConfigApplicationContext("ru.javarush.info.fatfaggy.animals.configs");
Ing kasus iki, Spring bakal mbukak paket iki lan nemokake kabeh kelas sing ditandhani karo anotasi @Configuration. Ya, yen kita duwe program sing gedhe banget ing ngendi konfigurasi dibagi dadi paket sing beda-beda, kita mung nuduhake jeneng paket kanthi konfigurasi sing dipisahake karo koma:
ApplicationContext context =
	new AnnotationConfigApplicationContext("ru.javarush.info.fatfaggy.animals.database.configs",
		"ru.javarush.info.fatfaggy.animals.root.configs",
		"ru.javarush.info.fatfaggy.animals.web.configs");
Ya, utawa jeneng paket sing luwih umum kanggo kabeh:
ApplicationContext context =
	new AnnotationConfigApplicationContext("ru.javarush.info.fatfaggy.animals");
Sampeyan bisa nindakake iku kaya sing dikarepake, nanging misale jek kula sing pilihan banget pisanan, ngendi sampeyan mung nemtokake kelas karo configs, bakal cocog program kita paling. Nalika nggawe konteks, Spring bakal nggoleki kelas sing ditandhani karo anotasi @Configurationlan nggawe obyek kelas kasebut dhewe. Sawise iku bakal nyoba nelpon metode ing kelas kasebut sing ditandhani karo anotasi @Bean, sing tegese cara kasebut bakal ngasilake kacang (obyek) sing wis diselehake ing konteks. Nah, saiki ayo nggawe kacang kucing, asu lan beo ing kelas kita kanthi konfigurasi java. Iki ditindakake kanthi prasaja:
@Bean
public Cat getCat() {
	return new Cat();
}
Pranyata kita nggawe kucing dhewe kanthi manual lan menehi menyang Spring, lan dheweke wis nyelehake obyek kasebut ing konteks. Amarga kita ora nemtokake kanthi jelas jeneng kacang, Spring bakal menehi jeneng kacang kanthi jeneng metode kasebut. Ing kasus kita, kacang kucing bakal duwe jeneng " getCat". Nanging wiwit ing main-e kita isih njaluk kucing ora dening jeneng, nanging dening kelas, banjur ing kasus iki jeneng bin iki ora penting kanggo kita. Nggawe kacang karo asu kanthi cara sing padha, nanging elinga yen Spring bakal menehi jeneng kacang kasebut kanthi jeneng metode kasebut. Kanggo kanthi jelas menehi jeneng kacang karo manuk beo, cukup tulisake jenenge ing kurung sawise anotasi @Bean:
@Bean("parrot-kesha")
public Object weNeedMoreParrots() {
	return new Parrot();
}
Nalika sampeyan bisa ndeleng, kene aku dituduhake jinis Nilai bali Object, lan disebut cara apa wae. Iki ora mengaruhi jeneng kacang kanthi cara apa wae amarga kita nyetel kanthi jelas ing kene. Nanging luwih apik kanggo nunjukake jinis nilai bali lan jeneng metode ora metu saka biru, nanging luwih utawa kurang cetha. Cukup kanggo sampeyan dhewe, nalika sampeyan mbukak proyek iki ing setahun. :) Saiki ayo dipikirake kahanan nalika nggawe kacang siji kudu nggunakake kacang liyane . Contone, kita pengin jeneng kucing ing kacang kucing kalebu jeneng manuk beo lan senar "-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 sadurunge nggawe kacang iki, dheweke kudu nransfer kacang nuri sing wis digawe ing kene. Mulane, dheweke bakal mbangun rantai telpon kanggo metode kita supaya metode nggawe manuk beo diarani pisanan, banjur ngliwati manuk beo iki menyang metode nggawe kucing. Iki ngendi bab sing disebut injeksi dependensi makarya : Spring dhewe liwati dibutuhake parrot buncis kanggo cara kita. Yen idea complains babagan variabel parrot, aja lali kanggo ngganti jinis bali ing cara kanggo nggawe parrot saka Objectkanggo Parrot. Kajaba iku, konfigurasi Jawa ngidini sampeyan nglakokake kode Jawa kanthi cara nggawe kacang buncis. Sampeyan pancene bisa nindakake apa wae: nggawe obyek tambahan liyane, nelpon cara liya, sanajan sing ora ditandhani karo anotasi musim semi, nggawe puteran, kahanan - apa wae sing dipikirake! Kabeh iki ora bisa ditindakake kanthi nggunakake konfigurasi otomatis, luwih sithik nggunakake konfigurasi xml. Saiki ayo ndelok masalah sing luwih nyenengake. Kanthi polimorfisme lan antarmuka :) Ayo nggawe antarmuka WeekDaylan nggawe 7 kelas sing bakal ngleksanakake antarmuka iki: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday. Ayo nggawe cara ing antarmuka String getWeekDayName()sing bakal ngasilake jeneng dina minggu kelas sing cocog. Sing, kelas Mondaybakal bali " monday", etc. Ngomongake tugas nalika ngluncurake aplikasi kita yaiku nyelehake kacang ing konteks sing cocog karo dina minggu saiki. Ora kabeh kacang buncis kabeh kelas sing ngleksanakake WeekDayantarmuka, nanging mung siji kita kudu. Bisa ditindakake 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();
	}
}
Kene jinis Nilai bali antarmuka kita, lan cara ngasilake obyek nyata saka kelas implementasine antarmuka gumantung ing dina saiki minggu. Saiki ing cara main()kita bisa nindakake iki:
WeekDay weekDay = context.getBean(WeekDay.class);
System.out.println("It's " + weekDay.getWeekDayName() + " today!");
Iku marang kula sing dina iki ana :) Aku yakin yen aku mbukak program sesuk, obyek temen beda bakal katon ing konteks. Wigati dimangerteni manawa ing kene kita entuk kacang kanthi antarmuka: context.getBean(WeekDay.class). Spring bakal katon ing konteks kanggo ndeleng endi saka kacang buncis sing ngetrapake antarmuka kasebut lan bakal ngasilake. Inggih, banjur ternyata WeekDayana obyek jinis ing variabel jinis Sunday, lan polimorfisme, sing wis akrab karo kita kabeh, diwiwiti nalika nggarap variabel iki. :) Lan sawetara tembung babagan pendekatan gabungan , ing ngendi sawetara kacang digawe dening Spring dhewe, nggunakake mindhai paket kanggo ngarsane kelas kanthi anotasi @Component, lan sawetara kacang buncis liyane digawe nggunakake konfigurasi java. Kanggo nindakake iki, ayo bali menyang versi asli, nalika kelas Cat, Doglan Parrotditandhani karo anotasi @Component. Ayo kita ngomong kita pengin nggawe tong sampah kanggo kewan kita nggunakake mindhai otomatis paket entitiesdening spring, nanging nggawe tong sampah karo dina minggu kaya kita mung nindakake. Sampeyan mung kudu nambah ing tingkat kelas MyConfig, sing kita nemtokake nalika nggawe konteks ing main-th anotasi @ComponentScan, lan nunjukake ing kurung paket sing kudu dipindai lan kacang-kacangan saka kelas sing perlu digawe kanthi otomatis:
@Configuration
@ComponentScan("ru.javarush.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();
		}
	}
}
Pranyata nalika nggawe konteks, Spring weruh yen perlu ngolah kelas MyConfig. Dheweke mlebu lan weruh yen dheweke kudu mindhai paket " ru.javarush.info.fatfaggy.animals.entities" lan nggawe kacang-kacangan saka kelas kasebut, sawise dheweke nindakake metode getDay()saka kelas MyConfiglan nambahake jinis kacang WeekDaying konteks. Ing cara, main()kita saiki duwe akses kanggo kabeh kacang buncis kita kudu: loro obyek kewan lan dina minggu buncis. Carane nggawe manawa Spring uga njupuk sawetara konfigurasi xml - google ing Internet dhewe yen sampeyan butuh :) Ringkesan:
  • nyoba nggunakake konfigurasi otomatis;
  • sajrone konfigurasi otomatis, kita nunjukake jeneng paket sing ngemot kelas sing kacang buncis kudu digawe;
  • kelas kuwi ditandhani karo anotasi@Component;
  • musim semi ngliwati kabeh kelas kasebut lan nggawe obyek lan nyelehake ing konteks;
  • yen konfigurasi otomatis ora cocog karo kita sakperangan alesan, kita nggunakake konfigurasi java;
  • ing kasus iki, kita nggawe kelas Jawa biasa kang cara bakal bali obyek kita kudu, lan menehi tandha kelas kuwi karo anotasi @Configurationing kasus kita mindai kabeh paket tinimbang nemtokake kelas tartamtu karo konfigurasi nalika nggawe konteks;
  • cara kelas iki sing bali kacang ditandhani karo anotasi @Bean;
  • yen kita pengin ngaktifake mindhai otomatis nalika nggunakake konfigurasi java, kita nggunakake anotasi @ComponentScan.
Yen ora ana sing jelas, coba maca artikel iki sajrone sawetara dina. Inggih, utawa yen sampeyan lagi ing tingkat awal Javarash, banjur mbok menawa iku sethitik awal kanggo sampeyan sinau spring. Sampeyan bisa tansah bali menyang artikel iki mengko, yen sampeyan aran luwih manteb ing ati ing program ing Jawa. Yen kabeh wis jelas, sampeyan bisa nyoba nransfer sawetara proyek pet menyang Spring :) Yen ana sing jelas, nanging ana sing ora akeh, komentar :) Ana uga saran lan komentar yen aku mlaku ing endi wae utawa aku nulis sing bodho. ) Ing artikel sabanjure kita bakal nyilem jero menyang spring-web-mvc lan nggawe aplikasi web prasaja nggunakake spring.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION