JavaRush /Java blogi /Random-UZ /Bahor dangasalar uchun. Kod bilan asoslar, asosiy tushunc...

Bahor dangasalar uchun. Kod bilan asoslar, asosiy tushunchalar va misollar. 2-qism

Guruhda nashr etilgan
Oxirgi maqolada men bahor nima ekanligini, axlat qutilari va kontekstni qisqacha tushuntirdim. Endi hammasi qanday ishlashini sinab ko'rish vaqti keldi. Bahor dangasalar uchun.  Kod bilan asoslar, asosiy tushunchalar va misollar.  2-1-qismMen buni Intellij Idea Enterprise Edition-da o'zim qilaman. Lekin mening barcha misollarim bepul Intellij Idea Community Edition da ishlashi kerak. Agar siz skrinshotlarda menda sizda yo'q qandaydir oyna borligini ko'rsangiz, xavotir olmang, bu loyiha uchun muhim emas :) Birinchidan, bo'sh Maven loyihasini yarataylik. Men buni qanday qilishni maqolada ko'rsatdim (" Maven loyihamizni veb-loyihaga aylantirish vaqti keldi " degan so'zlarni o'qing , shundan so'ng u veb-loyihani qanday yaratishni allaqachon ko'rsatib beradi va bizga hozir kerak emas) Keling, uni src/main papkasida yarataylik /java - bu qandaydir paket (mening holimda men uni “ ru.javarush.info.fatfaggy.animals” deb ataganman, uni xohlagancha nomlashingiz mumkin, faqat kerakli joylarda ismingiz bilan almashtirishni unutmang). Keling, Mainmetod yaratadigan sinf yarataylik
public static void main(String[] args) {
    ...
}
Keyin pom.xml faylini oching va u erda bo'lim qo'shing dependencies. Endi biz Maven omboriga boramiz va u erda eng so'nggi barqaror versiyaning bahor kontekstini qidiramiz va bo'lim ichiga olgan narsalarni joylashtiramiz dependencies. Men ushbu jarayonni ushbu maqolada biroz batafsilroq tasvirlab berdim (" Mavenda bog'liqliklarni ulash " bo'limiga qarang ). Keyin Mavenning o'zi kerakli bog'liqliklarni topadi va yuklab oladi va oxirida siz shunga o'xshash narsani olishingiz kerak:
Bahor dangasalar uchun.  Kod bilan asoslar, asosiy tushunchalar va misollar.  2-2 qism
Chap oynada paket va sinf bilan loyihaning tuzilishini ko'rishingiz mumkin Main. O'rta oyna mening pom.xml nimaga o'xshashligini ko'rsatadi. Men u erda xususiyatlar bo'limini ham qo'shdim , unda Mavenga manba kodida Java-ning qaysi versiyasidan foydalanayotganimni va qaysi versiyani kompilyatsiya qilishni ko'rsatdim. Bu Java-ning eski versiyasidan foydalanilayotganligi to'g'risida ishga tushirishda ogohlantirish haqida tasavvurga ega bo'lmasligim uchun. Siz buni qila olasiz, qila olmaysiz) O'ng oynada - biz faqat bahor kontekstini bog'lagan bo'lsak ham, u avtomatik ravishda yadro, loviya, aop va ifoda qo'shilganligini ko'rishingiz mumkin. Har bir modulni alohida-alohida ulash mumkin edi, ularning har biri uchun versiyani aniq ko'rsatgan holda xotirada bog'liqlikni qayd etish mumkin edi, ammo hozircha biz hozirgi kabi variantdan mamnunmiz. Endi paket (ob'ektlar) yaratamiz entitiesva unda 3 ta sinf yaratamiz: Cat, Dog, Parrot. Har bir hayvon nomiga ega bo'lsin ( private String name, siz u erda ba'zi qiymatlarni qattiq kodlashingiz mumkin) va qabul qiluvchilar/setterlar ommaviydir. Endi sinfga o'ting Mainva main()usulda shunday yozing:
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());
}
Birinchidan, biz kontekst ob'ektini yaratamiz va konstruktorda biz loviya mavjudligi uchun skanerdan o'tkazilishi kerak bo'lgan paket nomini beramiz. Ya'ni, Bahor ushbu paketdan o'tadi va bahorga bu loviya ekanligini bildiradigan maxsus izohlar bilan belgilangan sinflarni topishga harakat qiladi. Shundan so'ng u ushbu sinflarning ob'ektlarini yaratadi va ularni o'z kontekstiga joylashtiradi. Shundan so'ng biz ushbu kontekstdan mushukni olamiz. Kontekst ob'ektiga murojaat qilganda, biz undan loviya (ob'ekt) berishini so'raymiz va bizga qanday ob'ekt sinfi kerakligini ko'rsatamiz (bu erda, aytmoqchi, siz nafaqat sinflarni, balki interfeyslarni ham belgilashingiz mumkin). Shundan so'ng Spring bizga ushbu sinf ob'ektini qaytaradi, biz uni o'zgaruvchiga saqlaymiz. Keyinchalik, biz Bahordan bizga "it" deb nomlangan loviya olishni so'raymiz. Spring sinf ob'ektini yaratganda, Dogunga standart nom beradi (agar yaratilayotgan fasol nomi aniq ko'rsatilmagan bo'lsa), bu ob'ekt sinfining nomi, faqat kichik harf bilan. Shuning uchun, bizning sinfimiz chaqirilganligi sababli Dog, bunday fasolning nomi "it" bo'ladi. Agar u yerda ob'ektimiz bo'lsa BufferedReader, Bahor unga standart "bufferedReader" nomini beradi. Va bu holda (Java-da) bunday ob'ekt qaysi sinf bo'lishiga aniq ishonch yo'qligi sababli, shunchaki ma'lum bir ob'ekt qaytariladi Object, biz uni qo'lda kerakli turga aylantiramiz Dog. Sinfning aniq ko'rsatilgan varianti qulayroqdir. Xo'sh, uchinchi holatda, biz fasolni sinf va nom bilan olamiz. Kontekstda bitta sinfning bir nechta loviyalari bo'lishi mumkin bo'lgan vaziyat bo'lishi mumkin va qaysi fasol kerakligini ko'rsatish uchun biz uning nomini ko'rsatamiz. Biz bu erda sinfni ham aniq ko'rsatganimiz sababli, endi kasting qilishimiz shart emas. Muhim!Agar bahor biz ko'rsatgan talablar bo'yicha bir nechta loviya topib olgani ma'lum bo'lsa, u bizga qaysi loviya berishni aniqlay olmaydi va istisno qiladi. Shuning uchun, bunday vaziyatlar yuzaga kelmasligi uchun unga qaysi axlat qutisi kerakligini iloji boricha aniq ko'rsatishga harakat qiling. Agar Bahor sizning shartlaringiz bo'yicha o'z kontekstida bitta loviya topmasa, u ham istisno qiladi. Xo'sh, bu bizga kerak bo'lgan narsalar ekanligiga ishonch hosil qilish uchun biz shunchaki hayvonlarning ismlarini ekranda ko'rsatamiz. Ammo hozir dasturni ishga tushiradigan bo'lsak, bahor o'z kontekstida bizga kerak bo'lgan hayvonlarni topa olmasligiga qasam ichayotganini ko'ramiz. Bu fasolni yaratmagani uchun sodir bo'ldi. Yuqorida aytib o'tganimdek, Bahor darslarni skanerlaganda, u erda "o'zining" Bahor izohlarini qidiradi. Va agar u uni topa olmasa, u loviya yaratishi kerak bo'lgan sinflarni qabul qilmaydi. @ComponentBuni tuzatish uchun hayvonlar sinfimizdagi sinf oldiga izoh qo'shing .
@Component
public class Cat {
	private String name = "Barsik";
	...
}
Lekin bu hammasi emas. Agar bahorga ushbu sinf uchun loviya ma'lum bir nomga ega bo'lishi kerakligini aniq ko'rsatishimiz kerak bo'lsa, bu nom izohdan keyin qavs ichida ko'rsatilishi mumkin. parrot-keshaMisol uchun, bahor biz to'tiqush fasoliga ism berishimiz uchun , biz mainkeyinchalik bu to'tiqushni olamiz, biz shunday qilishimiz kerak:
@Component("parrot-kesha")
public class Parrot {
	private String name = "Kesha";
	...
}
Bu avtomatik konfiguratsiyaning butun nuqtasidir . Siz o'z sinflaringizni yozasiz, ularni kerakli izohlar bilan belgilaysiz va Spring-ga o'z sinflaringiz bo'lgan paketni ko'rsatasiz, u orqali u o'tadi, izohlarni qidiradi va bunday sinflarning ob'ektlarini yaratadi. Aytgancha, Bahor nafaqat izohlarni @Component, balki undan meros qolgan barcha boshqa izohlarni ham qidiradi. Masalan, @Controller, @RestController, @Service, @Repositoryva boshqalar, ular bilan keyingi maqolalarda tanishamiz. Keling, xuddi shunday qilishga harakat qilaylik, lekin java konfiguratsiyasidan foydalaning . @ComponentBirinchidan, darslarimizdan izohlarni olib tashlaymiz . Vazifani murakkablashtirish uchun, keling, bu bizning o'zimiz yozgan darslarimiz emasligini tasavvur qilaylik, biz ularni osongina o'zgartirishimiz, biror narsa, shu jumladan izohlar qo'shishimiz mumkin. Bu darslar qandaydir kutubxonada to'planganga o'xshaydi. Bunday holda, biz bu sinflarni bahor tomonidan qabul qilinishi uchun hech qanday tarzda tahrirlay olmaymiz. Ammo bizga bu sinflarning ob'ektlari kerak! Bu erda bunday ob'ektlarni yaratish uchun bizga java konfiguratsiyasi kerak bo'ladi. Boshlash uchun, keling, masalan, paketni yaratamiz configsva unda - masalan, oddiy Java sinfi MyConfigva uni izoh bilan belgilaymiz.@Configuration
@Configuration
public class MyConfig {
}
main()Endi biz usulda kontekstni yaratish usulini biroz o'zgartirishimiz kerak . Biz o'z sinfimizni to'g'ridan-to'g'ri konfiguratsiya bilan belgilashimiz mumkin:
ApplicationContext context =
	new AnnotationConfigApplicationContext(MyConfig.class);
Agar bizda fasol yaratadigan bir nechta turli sinflar mavjud bo'lsa va biz bir vaqtning o'zida bir nechtasini ulashni xohlasak, ularni vergul bilan ajratamiz:
ApplicationContext context =
	new AnnotationConfigApplicationContext(MyConfig.class, MyAnotherConfig.class);
Xo'sh, agar bizda ular juda ko'p bo'lsa va biz ularni bir vaqtning o'zida ulashni istasak, biz bu erda bizda mavjud bo'lgan paket nomini ko'rsatamiz:
ApplicationContext context =
	new AnnotationConfigApplicationContext("ru.javarush.info.fatfaggy.animals.configs");
Bunday holda, Spring ushbu paketdan o'tadi va izoh bilan belgilangan barcha sinflarni topadi @Configuration. Agar bizda konfiguratsiyalar turli paketlarga bo'lingan haqiqatan ham katta dastur mavjud bo'lsa, biz shunchaki vergul bilan ajratilgan konfiguratsiyalar bilan paketlarning nomlarini ko'rsatamiz:
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");
Xo'sh, yoki ularning barchasi uchun umumiyroq paket nomi:
ApplicationContext context =
	new AnnotationConfigApplicationContext("ru.javarush.info.fatfaggy.animals");
Siz buni xohlaganingizcha qilishingiz mumkin, lekin menimcha, konfiguratsiyalar bilan sinfni ko'rsatadigan birinchi variant bizning dasturimizga eng mos keladi. Kontekstni yaratishda Spring izoh bilan belgilangan sinflarni qidiradi @Configurationva o'zida bu sinflarning ob'ektlarini yaratadi. Shundan so'ng u ushbu sinflarda izoh bilan belgilangan usullarni chaqirishga harakat qiladi @Bean, ya'ni bunday usullar o'z kontekstida allaqachon joylashtirgan fasolni (ob'ektlarni) qaytaradi. Xo'sh, endi sinfimizda java konfiguratsiyasi bilan mushuk, it va to'tiqush fasollarini yarataylik. Bu juda oddiy tarzda amalga oshiriladi:
@Bean
public Cat getCat() {
	return new Cat();
}
Ma'lum bo'lishicha, biz mushukimizni o'zimiz qo'l bilan yaratdik va uni Bahorga berdik va u allaqachon bizning ob'ektimizni o'z kontekstiga joylashtirdi. Fasolimizning nomini aniq ko'rsatmaganimiz uchun, Bahor fasolga usul nomi bilan bir xil nom beradi. Bizning holatda, mushukning fasoli " getCat" nomiga ega bo'ladi. Ammo -e ichida mainbiz hali ham mushukni nomi bilan emas, balki sinfi bo'yicha olamiz, bu holda bu qutining nomi biz uchun muhim emas. Xuddi shu tarzda it bilan loviya qiling, lekin unutmangki, Bahor bunday fasolni usul nomi bilan nomlaydi. Bizning loviyamizni to'tiqush bilan aniq nomlash uchun uning nomini izohdan keyin qavs ichida ko'rsatish kifoya @Bean:
@Bean("parrot-kesha")
public Object weNeedMoreParrots() {
	return new Parrot();
}
Ko'rib turganingizdek, bu erda men qaytish qiymatining turini ko'rsatdim Objectva usulni umuman har qanday narsa deb atadim. Bu fasol nomiga hech qanday ta'sir qilmaydi, chunki biz uni bu erda aniq belgilab qo'yganmiz. Ammo qaytariladigan qiymat turini va usul nomini aniq emas, balki ko'proq yoki kamroq aniq ko'rsatish yaxshiroqdir. Hatto o'zingiz uchun ham, bu loyihani bir yilda ochganingizda. :) Endi bitta loviya yaratish uchun vaziyatni ko'rib chiqaylik, biz boshqa loviya ishlatishimiz kerak . Masalan, mushuk fasolidagi mushukning nomi to'tiqush nomidan va "-qotil" qatoridan iborat bo'lishini xohlaymiz. Muammosiz!
@Bean
public Cat getCat(Parrot parrot) {
	Cat cat = new Cat();
	cat.setName(parrot.getName() + "-killer");
	return cat;
}
Mana, bahor, bu loviyani yaratishdan oldin, u allaqachon yaratilgan to'tiqush loviyasini bu erga o'tkazishi kerakligini ko'radi. Shuning uchun u bizning usullarimizga qo'ng'iroqlar zanjirini quradi, shunda to'tiqushni yaratish usuli birinchi bo'lib chaqiriladi va keyin bu to'tiqush mushukni yaratish usuliga o'tadi. Bu erda qaramlik in'ektsiyasi deb ataladigan narsa ishladi : bahorning o'zi bizning usulimizga kerakli to'tiqush loviyasini o'tkazdi. Agar fikr o'zgaruvchidan shikoyat qilsa parrot, to'tiqushni yaratish usulida qaytarish turini dan Objectga o'zgartirishni unutmang Parrot. Bundan tashqari, Java konfiguratsiyasi fasol yaratish usullarida mutlaqo har qanday Java kodini bajarishga imkon beradi . Siz haqiqatan ham hamma narsani qilishingiz mumkin: boshqa yordamchi ob'ektlarni yarating, boshqa usullarni chaqiring, hatto bahor izohlari bilan belgilanmaganlarni ham chaqiring, ilmoqlar, shartlar qiling - aqlga kelgan narsa! Bularning barchasiga avtomatik konfiguratsiya yordamida erishib bo'lmaydi, xml konfiguratsiyasidan kamroq. Keling, yanada qiziqarli muammoni ko'rib chiqaylik. Polimorfizm va interfeyslar bilan :) Keling, interfeys yaratamiz WeekDayva ushbu interfeysni amalga oshiradigan 7 ta sinf yaratamiz: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday. Keling, interfeysda String getWeekDayName()mos keladigan sinfning hafta kunining nomini qaytaradigan usul yarataylik. Ya'ni, sinf " " va hokazolarni Mondayqaytaradi . mondayAytaylik, ilovamizni ishga tushirishda vazifa haftaning joriy kuniga mos keladigan kontekstda loviya joylashtirishdir. WeekDayInterfeysni amalga oshiradigan barcha sinflarning barcha fasollari emas , balki faqat bizga kerak bo'lgan fasol. Buni shunday qilish mumkin:
@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();
	}
}
Bu erda qaytariladigan qiymat turi bizning interfeysimizdir va usul haftaning joriy kuniga qarab interfeysni amalga oshirish sinflarining haqiqiy ob'ektlarini qaytaradi. Endi usulda main()biz buni qila olamiz:
WeekDay weekDay = context.getBean(WeekDay.class);
System.out.println("It's " + weekDay.getWeekDayName() + " today!");
Bugun yakshanba ekanligini aytdi :) Ishonchim komilki, ertaga dasturni ishga tushirsam, kontekstda butunlay boshqa ob'ekt paydo bo'ladi. E'tibor bering, bu erda biz fasolni oddiy interfeys orqali olamiz: context.getBean(WeekDay.class). Bahor fasollaridan qaysi biri bunday interfeysni amalga oshirishini va uni qaytarishini ko'rish uchun o'z kontekstiga qaraydi. Xo'sh, ma'lum bo'ladiki, WeekDayturdagi o'zgaruvchida tip ob'ekti mavjud Sundayva barchamizga tanish bo'lgan polimorfizm ushbu o'zgaruvchi bilan ishlashda boshlanadi. :) Va birlashtirilgan yondashuv haqida bir necha so'z , loviya ba'zi bir izoh bilan sinflar mavjudligi uchun paketlar skanerlash yordamida Bahor o'zi tomonidan yaratilgan @Component, va ba'zi boshqa loviya java konfiguratsiya yordamida yaratilgan. Buni amalga oshirish uchun, keling, asl versiyaga qaytaylik, qachon sinflar Cat, Dogva Parrotizoh bilan belgilangan edi @Component. Aytaylik, biz bahorgacha paketni avtomatik skanerlashdan foydalangan holda hayvonlarimiz uchun qutilar yaratmoqchimiz entities, lekin biz xuddi shunday qilganimizdek, haftaning kunini ko'rsatadigan axlat qutisini yaratamiz. Siz qilishingiz kerak bo'lgan narsa bu --chi izohda MyConfigkontekstni yaratishda biz belgilagan sinf darajasiga qo'shish va qavs ichida skanerlanishi kerak bo'lgan paketni va avtomatik ravishda yaratilgan zarur sinflarning loviyalarini ko'rsatish: main@ComponentScan
@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();
		}
	}
}
Ma'lum bo'lishicha, kontekst yaratishda Spring sinfni qayta ishlash kerakligini ko'radi MyConfig. U unga kiradi va "" paketini skanerlashi va o'sha sinflarning loviyalarini yaratishi kerakligini ko'radi , shundan so'ng u sinfdan ru.javarush.info.fatfaggy.animals.entitiesusulni amalga oshiradi va kontekstga turdagi loviya qo'shadi . Usulda biz endi barcha kerakli loviyalarga ega bo'lamiz: hayvonlarning ob'ektlari ham, hafta fasoli ham. Bahor ham ba'zi xml konfiguratsiyalarini tanlashiga qanday ishonch hosil qilish mumkin - agar kerak bo'lsa, uni Internetda o'zingiz google orqali toping :) Xulosa:getDay()MyConfigWeekDaymain()
  • avtomatik konfiguratsiyadan foydalanishga harakat qiling;
  • avtomatik konfiguratsiya paytida biz loviya yaratilishi kerak bo'lgan sinflarni o'z ichiga olgan paket nomini ko'rsatamiz;
  • bunday sinflar izoh bilan belgilanadi@Component;
  • bahor barcha bunday sinflardan o'tadi va ularning ob'ektlarini yaratadi va ularni kontekstga joylashtiradi;
  • agar avtomatik konfiguratsiya biron sababga ko'ra bizga mos kelmasa, biz java konfiguratsiyasidan foydalanamiz;
  • bu holda biz oddiy Java sinfini yaratamiz, uning usullari bizga kerak bo'lgan ob'ektlarni qaytaradi va @Configurationkontekstni yaratishda konfiguratsiyaga ega ma'lum bir sinfni ko'rsatmasdan, butun paketni skanerdan o'tkazsak, bunday sinfni izoh bilan belgilaymiz;
  • bu sinfning loviya qaytaradigan usullari annotatsiya bilan belgilanadi @Bean;
  • java konfiguratsiyasidan foydalanganda avtomatik skanerlashni yoqmoqchi bo'lsak, izohdan foydalanamiz @ComponentScan.
Hech narsa aniq bo'lmasa, ushbu maqolani bir necha kundan keyin o'qib ko'ring. Xo'sh, agar siz Javarashning dastlabki bosqichida bo'lsangiz, unda siz bahorni o'rganishingizga biroz erta bo'lishi mumkin. Java-da dasturlashda o'zingizni ishonchli his qilganingizda, siz har doim ushbu maqolaga biroz keyinroq qaytishingiz mumkin. Agar hamma narsa aniq bo'lsa, siz o'zingizning chorva loyihalaringizning bir qismini Bahorga o'tkazishga urinib ko'rishingiz mumkin :) Agar biror narsa aniq bo'lsa, lekin biror narsa unchalik ko'p bo'lmasa, iltimos, izoh qoldiring :) Agar biror joyga qadam qo'ygan bo'lsam yoki ahmoqona narsa yozgan bo'lsam, taklif va sharhlar ham bor. ) Keyingi maqolada biz spring-web-mvc- ga chuqur kirib boramiz va spring yordamida oddiy veb-ilovani yaratamiz.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION