CodeGym /Blog Jawa /Acak /Spring kanggo wong kesed Foundation, konsep dhasar, lan c...
John Squirrels
tingkat
San Francisco

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

Diterbitake ing grup
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 :) Spring kanggo wong kesed Foundation, konsep dhasar, lan conto karo kode.  Bagean 2 - 1First, 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 " 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 Mainlan nambah a cara

public static void main(String[] args) {
    ...
}
Sawise iku, bukak file pom.xml lan tambahake dependenciesbagean kasebut. Saiki pindhah menyang repositori Maven lan temokake konteks Spring kanggo versi stabil paling anyar. Sijine apa kita temokake menyang dependenciesbagean. 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: Spring kanggo wong kesed Foundation, konsep dhasar, lan conto karo kode.  Bagean 2 - 2Ing jendhela ing sisih kiwa, sampeyan bisa ndeleng struktur project karo paket lan kelas 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 entitiespaket 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 Mainkelas 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 aDogobyek, 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 BufferedReaderobyek 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@Componentanotasi 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 mainmetode 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 @Componentanotasi, 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@Componentanotasi 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 @Configurationanotasi.

@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 @Configurationanotasi lan bakal nggawe obyek dhewe saka kelas kasebut. Iku nyoba nelpon cara ditandhani karo @Beananotasi, 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 maincara, 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 @Beananotasi:

@Bean("parrot-polly")
public Object weNeedMoreParrots() {
	return new Parrot();
}
Kaya sing sampeyan ngerteni, ing kene aku nuduhake Objectjinis 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 parrotvariabel kasebut, aja lali ngganti jinis bali cara nggawe parrot saka Objectmenyang 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 WeekDayantarmuka 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, Mondaykelas 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 WeekDaybisa 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 WeekDayvariabel 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, lanParrotkelas ditandhani karo @Componentanotasi. 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 @ComponentScananotasi 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 MyConfigkelas. Iku lumebu ing kelas lan weruh sing perlu mindhai en.codegym.info.fatfaggy.animals.entitiespaket " " lan nggawe kacang buncis kelas sing, sawise kang executes cara MyConfigkelas getDay()lan nambah WeekDaykacang 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 @Componentanotasi
  • 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 @Configurationanotasi yen kita bakal mindai kabeh paket tinimbang nuduhake kelas tartamtu kanthi konfigurasi nalika nggawe konteks
  • Cara kelas iki sing ngasilake kacang ditandhani karo @Beananotasi
  • Yen kita pengin ngaktifake mindhai otomatis nalika nggunakake konfigurasi basis Jawa, kita nggunakake anotasi @ComponentScan.
Yen artikel iki pancen mbingungake, banjur coba maca ing sawetara dina. Utawa yen sampeyan ana ing salah siji saka tingkat awal CodeGym, bisa uga rada awal kanggo sampeyan sinau Spring. Sampeyan bisa tansah bali menyang artikel iki mengko yen sampeyan aran luwih manteb ing ati ing skills program Java. Yen kabeh wis jelas, mula sampeyan bisa nyoba ngowahi sawetara proyek pet sampeyan dadi Spring :) Yen ana sawetara perkara sing jelas nanging liyane ora jelas, banjur tinggalake komentar :) Ayo kula ngerti saran lan kritik sampeyan, yen aku salah nang endi wae utawa nulis sawetara omong kosong :) Ing artikel sabanjure, kita bakal nyilem kanthi cepet menyang spring-web-mvc lan nggawe aplikasi web sing prasaja nggunakake Spring.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION