JavaRush /Java Blogu /Random-AZ /Bahar tənbəllər üçündür. Əsaslar, əsas anlayışlar və kodl...
Стас Пасинков
Səviyyə
Киев

Bahar tənbəllər üçündür. Əsaslar, əsas anlayışlar və kodla nümunələr. 2-ci hissə

Qrupda dərc edilmişdir
Sonuncu məqalədə mən qısaca yazın nə olduğunu, qabların nə olduğunu və kontekstini izah etdim. İndi hər şeyin necə işlədiyini sınamağın vaxtı gəldi. Bahar tənbəllər üçündür.  Əsaslar, əsas anlayışlar və kodla nümunələr.  Hissə 2 - 1Mən bunu Intellij Idea Enterprise Edition-da özüm edəcəm. Amma mənim bütün nümunələrim pulsuz Intellij Idea Community Edition-da da işləməlidir. Sadəcə ekran görüntülərində görürsünüzsə ki, məndə sizdə olmayan hansısa pəncərə var, narahat olmayın, bu layihə üçün kritik deyil :) Əvvəlcə boş Maven layihəsi yaradaq. Bunu necə edəcəyimi məqalədə göstərdim (" Maven layihəmizi veb layihəyə çevirməyin vaxtı gəldi. " sözlərini oxuyun , bundan sonra artıq veb layihəsini necə yaratmağı göstərir və indi buna ehtiyacımız yoxdur) Gəlin onu src/main qovluğunda yaradaq /java hansısa paketdir (mənim vəziyyətimdə mən onu “ ru.javarush.info.fatfaggy.animals” adlandırdım , istədiyiniz kimi adlandıra bilərsiniz, sadəcə olaraq lazımi yerlərdə adınızla əvəz etməyi unutmayın). MainVə bir metod hazırlayacağımız bir sinif yaradaq
public static void main(String[] args) {
    ...
}
Sonra pom.xml faylını açın və oraya bölmə əlavə edin dependencies. İndi biz Maven repozitoriyasına gedirik və orada ən son stabil versiyanın yaz kontekstini axtarırıq və əldə etdiyimizi bölmənin içərisinə yapışdırırıq dependencies. Mən bu məqalədə bu prosesi bir az daha ətraflı təsvir etdim (" Maven-də asılılıqların bağlanması " bölməsinə baxın ). Sonra Maven özü lazımi asılılıqları tapıb yükləyəcək və sonda belə bir şey əldə etməlisiniz:
Bahar tənbəllər üçündür.  Əsaslar, əsas anlayışlar və kodla nümunələr.  2-2 hissə
Sol pəncərədə paket və siniflə layihənin strukturunu görə bilərsiniz Main. Orta pəncərə mənim pom.xml-in necə göründüyünü göstərir. Mən orada xüsusiyyətlər bölməsini də əlavə etdim , orada Mavenə mənbə kodunda Java-nın hansı versiyasından istifadə etdiyimi və hansı versiyanı tərtib edəcəyimi göstərdim. Bu, Java-nın köhnə versiyasının istifadə olunduğuna dair xəbərdarlığı əldə etməmək üçündür. Bunu edə bilərsiniz, edə bilməzsiniz) Sağ pəncərədə - görə bilərsiniz ki, biz yalnız yaz kontekstini bağlasaq da - avtomatik olaraq nüvə, lobya, aop və ifadə əlavə etdi. Hər modulu ayrı-ayrılıqda birləşdirmək mümkün idi, hər biri üçün versiyanın açıq şəkildə göstərilməsi ilə yaddaşda bir asılılıq qeydə alındı, lakin indiki kimi seçimdən məmnunuq. İndi paketi (obyektləri) yaradaq entitiesvə orada 3 sinif yaradaq: Cat, Dog, Parrot. Hər bir heyvanın bir adı olsun ( private String name, orada bəzi dəyərləri kodlaya bilərsiniz) və alıcılar/ayarlayıcılar açıqdır. İndi sinifə gedin Mainmain()metodda belə bir şey yazın:
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());
}
Əvvəlcə kontekst obyekti yaradırıq və konstruktorda ona paxlaların olub-olmaması üçün skan edilməli olan paketin adını veririk. Yəni, Bahar bu paketdən keçəcək və Bahara bunun paxla olduğunu bildirən xüsusi annotasiyalarla qeyd olunan sinifləri tapmağa çalışacaq. Bundan sonra o, bu siniflərin obyektlərini yaradır və onları öz kontekstində yerləşdirir. Bundan sonra bu kontekstdən bir pişik alırıq. Kontekst obyektinə müraciət edərkən ondan bizə lobya (obyekt) verməsini xahiş edirik və bizə hansı obyekt sinfinə ehtiyacımız olduğunu göstərin (burada, yeri gəlmişkən, siz təkcə sinifləri deyil, həm də interfeysləri göstərə bilərsiniz). Bundan sonra Spring bizə bu sinfin obyektini qaytarır, biz onu dəyişən kimi saxlayırıq. Sonra Bahardan bizə "it" adlı bir lobya almasını xahiş edirik. Spring bir sinif obyekti yaratdıqda, Dogona standart ad verəcək (əgər yaradılan paxlanın adı açıq şəkildə göstərilməyibsə), bu obyektin sinfinin adıdır, yalnız kiçik hərflə. Buna görə də, sinifimiz adlandığı üçün Dogbelə bir paxlanın adı "it" olacaq. Orada bir obyektimiz olsaydı BufferedReader, Bahar ona standart adı "bufferedReader" verərdi. Və bu halda (Java-da) belə bir obyektin hansı sinif olacağına dəqiq əminlik olmadığından, o, sadəcə olaraq müəyyən bir obyekti qaytarır Object, sonra biz onu əl ilə bizə lazım olan tipə köçürürük Dog. Sinfin açıq şəkildə göstərildiyi seçim daha əlverişlidir. Yaxşı, üçüncü halda, sinif və adla bir lobya alırıq. Sadəcə bir vəziyyət ola bilər ki, kontekstdə bir sinifdən bir neçə lobya olacaq və hansı lobyaya ehtiyacımız olduğunu göstərmək üçün onun adını qeyd edirik. Burada sinfi də aydın şəkildə göstərdiyimiz üçün artıq cast etmək məcburiyyətində deyilik. Vacibdir!Baharın ona göstərdiyimiz tələblərə uyğun olaraq bir neçə lobya tapdığı ortaya çıxarsa, o, bizə hansı paxlalı verəcəyini müəyyən edə bilməyəcək və istisna təşkil edəcək. Buna görə də, ona hansı zibil qutusuna ehtiyacınız olduğunu mümkün qədər dəqiq göstərməyə çalışın ki, belə hallar yaranmasın. Bahar şərtlərinizə uyğun olaraq kontekstində bir paxla tapmasa, o da bir istisna atacaq. Yaxşı, o zaman biz sadəcə olaraq heyvanlarımızın adlarını ekranda göstəririk ki, bunlar əslində bizə lazım olan obyektlərdir. Amma proqramı indi icra etsək, görərik ki, Bahar öz kontekstində bizə lazım olan heyvanları tapa bilməyəcəyinə and içir. Bu, bu paxlaları yaratmadığı üçün baş verdi. Artıq dediyim kimi, Bahar dərsləri skan edərkən orada “öz” Bahar annotasiyalarını axtarır. Əgər tapmasa, o, fasulyəsini yaratmalı olduğu sinifləri qəbul etmir. @ComponentBunu düzəltmək üçün, sadəcə olaraq , heyvan siniflərimizdə sinfin önünə annotasiya əlavə edin .
@Component
public class Cat {
	private String name = "Barsik";
	...
}
Ancaq bu, hamısı deyil. Bu sinif üçün paxlanın xüsusi bir ada sahib olması lazım olduğunu Bahara açıq şəkildə göstərməli olsaq, bu ad annotasiyadan sonra mötərizədə göstərilə bilər. parrot-keshaMəsələn, Baharın daha sonra bu tutuquşu alacağımız papağan paxlasına ad verməsi üçün mainbelə bir şey etməliyik:
@Component("parrot-kesha")
public class Parrot {
	private String name = "Kesha";
	...
}
Bu , avtomatik konfiqurasiyanın bütün nöqtəsidir . Siz siniflərinizi yazır, onları lazımi annotasiyalarla qeyd edirsiniz və Spring-ə sinifləriniz olan paketi göstərirsiniz, bu paket vasitəsilə o, annotasiyalar axtarır və belə siniflərin obyektlərini yaradır. Yeri gəlmişkən, Bahar təkcə annotasiyaları deyil @Component, həm də bundan miras qalan bütün digər annotasiyaları axtaracaq. Məsələn, @Controller, @RestController, @Service, @Repositoryvə başqaları ilə sonrakı məqalələrdə tanış olacağıq. İndi eyni şeyi etməyə çalışaq, lakin java konfiqurasiyasından istifadə edək . @ComponentƏvvəlcə dərslərimizdən annotasiyaları silək . Tapşırığı çətinləşdirmək üçün təsəvvür edək ki, bunlar bizim özümüz tərəfindən yazılmış dərslərimiz deyil, onları asanlıqla dəyişdirə, əlavə edə biləcəyimiz bir şey, o cümlədən annotasiyalar əlavə edə bilərik. Sanki bu dərslər hansısa kitabxanada yığılıb. Bu halda, biz bu sinifləri heç bir şəkildə redaktə edə bilmərik ki, onlar yaza qədər qəbul edilsin. Ancaq bu siniflərin obyektlərinə ehtiyacımız var! Burada belə obyektləri yaratmaq üçün java konfiqurasiyasına ehtiyacımız olacaq. Başlamaq üçün, məsələn, bir paket yaradaq configsvə onun içində - məsələn, adi Java sinfi MyConfigvə annotasiya ilə qeyd edək.@Configuration
@Configuration
public class MyConfig {
}
main()İndi metodda kontekst yaratmağımızı bir az tənzimləməliyik . Orada konfiqurasiya ilə sinfimizi birbaşa təyin edə bilərik:
ApplicationContext context =
	new AnnotationConfigApplicationContext(MyConfig.class);
Əgər lobya yaratdığımız bir neçə fərqli sinifimiz varsa və onlardan bir neçəsini eyni anda birləşdirmək istəyiriksə, sadəcə onları vergüllə ayırırıq:
ApplicationContext context =
	new AnnotationConfigApplicationContext(MyConfig.class, MyAnotherConfig.class);
Yaxşı, əgər bizdə onların çoxu varsa və hamısını bir anda birləşdirmək istəyiriksə, sadəcə olaraq bizdə olan paketin adını qeyd edirik:
ApplicationContext context =
	new AnnotationConfigApplicationContext("ru.javarush.info.fatfaggy.animals.configs");
Bu halda, Bahar bu paketdən keçəcək və annotasiya ilə qeyd olunan bütün sinifləri tapacaq @Configuration. Yaxşı, əgər konfiqurasiyaların müxtəlif paketlərə bölündüyü həqiqətən böyük bir proqramımız varsa, sadəcə olaraq paketlərin adlarını vergüllə ayrılmış konfiqurasiyalarla qeyd edirik:
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");
Yaxşı, ya da hamısı üçün daha ümumi olan bir paketin adı:
ApplicationContext context =
	new AnnotationConfigApplicationContext("ru.javarush.info.fatfaggy.animals");
İstədiyiniz kimi edə bilərsiniz, amma mənə elə gəlir ki, sadəcə olaraq konfiqurasiya ilə bir sinif göstərdiyiniz ilk seçim proqramımıza ən uyğun olacaq. Kontekst yaratarkən, Spring annotasiya ilə qeyd olunan sinifləri axtaracaq @Configurationvə özlüyündə bu siniflərin obyektlərini yaradacaq. Bundan sonra o, annotasiya ilə qeyd olunan bu siniflərdə metodları çağırmağa çalışacaq @Bean, bu o deməkdir ki, bu cür metodlar artıq kontekstində yerləşdirdiyi lobyaları (obyektləri) qaytaracaq. Yaxşı, indi sinifimizdə java konfiqurasiyası ilə pişik, it və tutuquşu paxlası yaradaq. Bu olduqca sadə şəkildə edilir:
@Bean
public Cat getCat() {
	return new Cat();
}
Belə çıxır ki, biz özümüz pişiyi əlimizlə yaratdıq və Bahara verdik və o, artıq bizim bu obyektimizi öz kontekstinə yerləşdirdi. Paxlamızın adını açıq şəkildə göstərmədiyimiz üçün Bahar paxlaya metodun adı ilə eyni adı verəcək. Bizim vəziyyətimizdə, pişik paxlasının adı " getCat" olacaq. Ancaq -e-də mainbiz hələ də pişiyi adla deyil, siniflə alırıq, bu halda bu qutunun adı bizim üçün vacib deyil. Eyni şəkildə bir itlə bir paxla hazırlayın, ancaq unutmayın ki, Bahar belə bir paxlalı üsulun adı ilə adlandıracaq. Paxlamızı açıq şəkildə tutuquşu ilə adlandırmaq üçün sadəcə olaraq annotasiyadan sonra onun adını mötərizədə göstərin @Bean:
@Bean("parrot-kesha")
public Object weNeedMoreParrots() {
	return new Parrot();
}
Gördüyünüz kimi, burada mən qaytarılan dəyərin növünü göstərdim Objectvə metodu ümumiyyətlə hər hansı bir şey adlandırdım. Bu, paxlanın adına heç bir şəkildə təsir etmir, çünki biz onu burada açıq şəkildə təyin etmişik. Ancaq qaytarılan dəyər növünü və metod adını açıq şəkildə deyil, daha çox və ya daha az aydın şəkildə göstərmək daha yaxşıdır. Yalnız özünüz üçün, bir ildən sonra bu layihəni açdığınız zaman. :) İndi bir lobya yaratmaq üçün başqa bir lobya istifadə etməmiz lazım olan vəziyyəti nəzərdən keçirək . Məsələn, pişik paxlasında olan pişiyin adının tutuquşu adından və “-killer” sətirindən ibarət olmasını istəyirik. Problem deyil!
@Bean
public Cat getCat(Parrot parrot) {
	Cat cat = new Cat();
	cat.setName(parrot.getName() + "-killer");
	return cat;
}
Burada Bahar görəcək ki, bu paxlalı yaratmazdan əvvəl artıq yaradılmış tutuquşu paxlasını buraya köçürməli olacaq. Buna görə də, o, üsullarımıza zənglər zənciri quracaq ki, əvvəlcə tutuquşu yaratmaq üsulu çağırılsın və sonra bu tutuquşu pişik yaratmaq üsuluna keçir. Burada asılılıq inyeksiyası deyilən şey işlədi : Bahar özü tələb olunan tutuquşu paxlasını bizim metodumuza keçirdi. İdeya dəyişəndən şikayətlənirsə parrot, tutuquşu yaratmaq metodunda geri dönüş növünü --dən -ə dəyişməyi Objectunutmayın Parrot. Bundan əlavə, Java konfiqurasiyası lobya yaratmaq üsullarında tamamilə istənilən Java kodunu icra etməyə imkan verir . Həqiqətən hər şeyi edə bilərsiniz: başqa köməkçi obyektlər yaradın, istənilən başqa metodları çağırın, hətta yaz annotasiyaları ilə qeyd olunmayanları da çağırın, döngələr, şərtlər düzəldin - ağlınıza gələn hər şey! Bütün bunlara xml konfiqurasiyasından daha az istifadə etməklə avtomatik konfiqurasiya ilə nail olmaq mümkün deyil. İndi daha əyləncəli bir problemə baxaq. Polimorfizm və interfeyslərlə :) Gəlin interfeys yaradaq WeekDayvə bu interfeysi həyata keçirəcək 7 sinif yaradaq: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday. İnterfeysdə String getWeekDayName()müvafiq sinfin həftəsinin gününün adını qaytaracaq metod yaradaq. Yəni, sinif Mondayqayıdacaqdı " monday" və s. Deyək ki, tətbiqimizi işə salarkən vəzifə həftənin cari gününə uyğun olan kontekstdə lobya yerləşdirməkdir. WeekDayİnterfeys həyata keçirən bütün siniflərin bütün lobyaları deyil , yalnız bizə lazım olanı. Bunu belə bir şey etmək olar:
@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();
	}
}
Burada qaytarılan dəyər növü bizim interfeysimizdir və metod həftənin cari günündən asılı olaraq interfeys tətbiqi siniflərinin real obyektlərini qaytarır. İndi metodda main()bunu edə bilərik:
WeekDay weekDay = context.getBean(WeekDay.class);
System.out.println("It's " + weekDay.getWeekDayName() + " today!");
Mənə deyirdi ki, bu gün bazar günüdür :) Əminəm ki, sabah proqramı işlətsəm, kontekstdə tamam başqa obyekt peyda olacaq. Nəzərə alın ki, burada lobya sadəcə interfeys vasitəsilə əldə edilir: context.getBean(WeekDay.class). Bahar, hansı lobya belə bir interfeys tətbiq etdiyini görmək üçün kontekstinə baxacaq və onu qaytaracaq. Yaxşı, onda belə çıxır ki, WeekDaytipli bir obyekt tipli bir dəyişəndə ​​bitdi Sundayvə bu dəyişənlə işləyərkən artıq hamımıza tanış olan polimorfizm başlayır. :) Və birləşdirilmiş yanaşma haqqında bir neçə kəlmə , burada paxlaların bir hissəsi Baharın özü tərəfindən, annotasiya ilə siniflərin olması üçün paketlərin skan edilməsindən istifadə edilərək yaradılır @Componentvə bəzi digər lobyalar java konfiqurasiyasından istifadə edərək yaradılır. Bunu etmək üçün, orijinal versiyaya qayıdaq, siniflər və Catannotasiya ilə qeyd olunduqda . Deyək ki, biz yaza qədər paketin avtomatik skan edilməsindən istifadə edərək heyvanlarımız üçün zibil qutuları yaratmaq istəyirik , lakin indi etdiyimiz kimi həftənin günü ilə zibil qutusu yaradın. Sizə lazım olan tək şey --ci annotasiyada kontekst yaratarkən müəyyən etdiyimiz sinif səviyyəsində əlavə etmək və mötərizədə skan edilməli olan paketi və avtomatik olaraq yaradılan lazımi siniflərin lobyalarını göstərməkdir: DogParrot@ComponententitiesMyConfigmain@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();
		}
	}
}
Belə çıxır ki, Bahar kontekst yaratarkən sinfi emal etməli olduğunu görür MyConfig. O, ora daxil olur və görür ki, " " paketini skan etməli ru.javarush.info.fatfaggy.animals.entitiesvə bu siniflərin lobyalarını yaratmalı, bundan sonra o, getDay()sinifdən bir metodu yerinə yetirir və kontekstinə MyConfigbir növ lobya əlavə edir . WeekDayMetodda, main()indi ehtiyacımız olan bütün lobyalara çıxışımız var: həm heyvan obyektləri, həm də həftənin lobya günü. Baharın bəzi xml konfiqurasiyalarını da seçdiyinə necə əmin olmaq olar - ehtiyacınız varsa, İnternetdə özünüz google-da axtarın :) Xülasə:
  • avtomatik konfiqurasiyadan istifadə etməyə çalışın;
  • avtomatik konfiqurasiya zamanı paxlasının yaradılması lazım olan sinifləri ehtiva edən paketin adını göstəririk;
  • belə siniflər annotasiya ilə qeyd olunur@Component;
  • yaz bütün belə siniflərdən keçir və onların obyektlərini yaradır və onları kontekstdə yerləşdirir;
  • avtomatik konfiqurasiya nədənsə bizə uyğun gəlmirsə, java konfiqurasiyasından istifadə edirik;
  • bu halda biz adi Java sinfi yaradırıq, onun metodları bizə lazım olan obyektləri qaytaracaq və @Configurationkontekst yaratarkən konfiqurasiya ilə müəyyən bir sinfi təyin etməkdənsə, bütün paketi skan etdiyimiz halda belə sinfi annotasiya ilə qeyd edirik;
  • lobya qaytaran bu sinfin üsulları annotasiya ilə qeyd olunur @Bean;
  • java konfiqurasiyasından istifadə edərkən avtomatik taramanı aktivləşdirmək istəyiriksə, annotasiyadan istifadə edirik @ComponentScan.
Heç bir şey aydın deyilsə, bir neçə gün ərzində bu məqaləni oxumağa çalışın. Yaxşı, ya da Javaraşın ilk pillələrindəsinizsə, yaz fəslini öyrənmək üçün bəlkə də bir az tezdir. Java-da proqramlaşdırmada özünüzü daha inamlı hiss etdiyiniz zaman bu məqaləyə bir az sonra qayıda bilərsiniz. Hər şey aydındırsa, pet layihələrinizin bir qismini Bahara köçürməyə cəhd edə bilərsiniz :) Bir şey aydındırsa, amma bir şey çox deyilsə, şərh verin :) Bir yerə addım atmışamsa və ya axmaq bir şey yazmışamsa, təkliflər və şərhlər də var. ) Növbəti məqalədə biz spring-web-mvc- ə dərindən girəcəyik və spring-dən istifadə edərək sadə veb proqram hazırlayacağıq.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION