JavaRush /Java блогы /Random-KK /Көктем жалқауларға арналған. Негіздер, негізгі түсініктер...
Стас Пасинков
Деңгей
Киев

Көктем жалқауларға арналған. Негіздер, негізгі түсініктер және кодпен мысалдар. 2-бөлім

Топта жарияланған
Соңғы мақалада мен көктемнің не екенін, қоқыс жәшіктері мен контекстін қысқаша түсіндірдім. Енді бәрі қалай жұмыс істейтінін сынап көру уақыты келді. Көктем жалқауларға арналған.  Негіздер, негізгі түсініктер және codeпен мысалдар.  2 - 1 бөлімМен мұны Intellij Idea Enterprise Edition бағдарламасында өзім жасаймын. Бірақ менің барлық мысалдарым тегін Intellij Idea Community Edition бағдарламасында да жұмыс істеуі керек. Скриншоттарда менде сізде жоқ терезенің бар екенін көрсеңіз, алаңдамаңыз, бұл жоба үшін маңызды емес :) Алдымен бос Maven жобасын жасайық. Мен мұны қалай жасау керектігін мақалада көрсеттім (« Мавен жобамызды веб-жобаға айналдыратын уақыт келді. » деген сөздерді оқыңыз , содан кейін ол веб-жобаны қалай жасау керектігін көрсетеді, және бізге қазір бұл қажет емес) Оны src/main қалтасында жасайық /java - бұл қандай да бір бума (менің жағдайда мен оны « ru.javarush.info.fatfaggy.animals» деп атадым, оны қалағаныңызша атай аласыз, оны дұрыс жерлерде өз атыңызбен ауыстыруды ұмытпаңыз). MainАл біз әдіс жасайтын класс құрайық
public static void main(String[] args) {
    ...
}
Содан кейін pom.xml файлын ашып, сол жерге бөлім қосыңыз dependencies. Енді біз Maven репозиторийіне барамыз және сол жерден соңғы тұрақты нұсқаның көктемгі контекстін іздейміз және алғанымызды бөлімге қоямыз dependencies. Мен бұл процесті осы мақалада біршама егжей-тегжейлі сипаттадым (« Мавендегі тәуелділіктерді қосу » бөлімін қараңыз ). Содан кейін Maven өзі қажетті тәуелділіктерді тауып, жүктеп алады және соңында сіз келесідей нәрсені алуыңыз керек:
Көктем жалқауларға арналған.  Негіздер, негізгі түсініктер және codeпен мысалдар.  2 - 2 бөлім
Сол жақтағы терезеде бумасы мен класы бар жобаның құрылымын көруге болады Main. Ортаңғы терезе менің pom.xml қалай көрінетінін көрсетеді. Мен сонымен қатар сипаттар бөлімін қостым , онда мен Maven-ге қай Java нұсқасын бастапқы codeта қолданып жатқанымды және қай нұсқаны құрастыру керектігін көрсеттім. Бұл Java бағдарламасының ескі нұсқасын іске қосу кезінде ескерту туралы идеяны алмау үшін ғана. Сіз мұны істей аласыз, сіз жасай алмайсыз) Оң жақ терезеде - біз тек көктемгі контекстті қосқанымызға қарамастан, ол автоматты түрде ядро, бұршақ, aop және өрнек қосылғанын көре аласыз. Әрбір модульді бөлек қосуға болады, олардың әрқайсысына тәуелділікті жадта нұсқаның нақты көрсетілімімен тіркейді, бірақ қазір біз қазіргідей опцияға ризамыз. Енді бума entities(an objectілер) жасап, онда 3 класс құрайық: Cat, Dog, Parrot. Әрбір жануардың аты болсын ( private String name, онда кейбір мәндерді codeтауға болады) және қабылдаушылар/қоюшылар жалпыға ортақ. Енді сыныпқа барыңыз Mainжәне main()әдісте келесідей нәрсені жазыңыз:
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());
}
Алдымен контекстік нысанды жасаймыз және конструкторда бұршақтың бар-жоғын сканерлеу қажет пакеттің атын береміз. Яғни, Көктем осы пакеттен өтіп, көктемге бұл бұршақ екенін білуге ​​мүмкіндік беретін арнайы annotationлармен белгіленген сыныптарды табуға тырысады. Осыдан кейін ол осы сыныптардың an objectілерін жасайды және оларды контекстке орналастырады. Осыдан кейін біз осы контекстен мысық аламыз. Мәтінмәндік an objectіге жүгінген кезде біз одан бізге бұршақ (an object) беруін сұраймыз және бізге an objectінің қандай класы қажет екенін көрсетеміз (бұл жерде, айтпақшы, тек сыныптарды ғана емес, сонымен қатар интерфейстерді де көрсетуге болады). Осыдан кейін Spring бізге осы класстың an objectісін қайтарады, біз оны айнымалыға сақтаймыз. Әрі қарай көктемнен «ит» деп аталатын бұршақ алуын сұраймыз. Spring сынып an objectісін жасағанда, Dogоған стандартты атау береді (егер жасалатын бұршақтың аты нақты көрсетілмесе), бұл нысан класының атауы, тек кіші әріппен. Сондықтан, біздің сынып » деп аталатындықтан Dog, мұндай бұршақтың аты «ит» болады. Егер бізде онда нысан болса BufferedReader, онда Spring оған әдепкі «bufferedReader» атауын береді. Бұл жағдайда (Java тілінде) мұндай нысанның қандай класс болатынына нақты сенімділік жоқ болғандықтан, ол жай ғана белгілі бір нәрсені қайтарады Object, содан кейін біз оны қажетті түрге қолмен шығарамыз Dog. Кластың анық көрсетілген нұсқасы ыңғайлырақ. Ал, үшінші жағдайда біз бұршақты класы мен аты бойынша аламыз. Контексте бір сыныптың бірнеше бұршақтары болатын жағдай болуы мүмкін және бізге қандай бұршақтың қажет екенін көрсету үшін оның атын көрсетеміз. Біз мұнда сыныпты да анық көрсеткендіктен, бұдан былай кастинг қажет емес. Маңызды!Егер көктем біз көрсеткен талаптарға сәйкес бірнеше бұршақты тауып алатын болса, ол бізге қандай бұршақты беретінін анықтай алмайды және ерекшелік жасайды. Сондықтан, мұндай жағдайлар туындамас үшін оған қандай қоқыс керек екенін барынша дәл көрсетуге тырысыңыз. Егер көктем сіздің шарттарыңызға сәйкес контекстінде бір бұршақты таппаса, ол да ерекшелік жасайды. Олай болса, бұл шын мәнінде бізге қажет нысандар екеніне көз жеткізу үшін біз жай ғана экранда жануарларымыздың атын көрсетеміз. Бірақ қазір бағдарламаны іске қоссақ, Көктем өз контекстінде бізге қажетті жануарларды таба алмай ант етіп жатқанын көреміз. Бұл бұршақтарды ол жасамағандықтан болды. Жоғарыда айтқанымдай, Spring сабақтарды сканерлеген кезде, ол жерден «өзінің» көктемгі annotationларын іздейді. Егер ол оны таппаса, онда ол бұршағын жасау керек сыныптарды қабылдамайды. @ComponentМұны түзету үшін, біздің жануарлар сыныптарындағы сыныптың алдына annotation қосыңыз .
@Component
public class Cat {
	private String name = "Barsik";
	...
}
Бірақ бұл бәрі емес. Егер көктемге осы сыныпқа арналған бұршақтың белгілі бір атауы болуы керек екенін нақты көрсету керек болса, бұл атауды annotationдан кейін жақшада көрсетуге болады. parrot-keshaМысалы, көктемге кейінірек осы тоты құсты алатын тотықұс бұршағына атау беру үшін mainбізге келесідей әрекет жасау керек:
@Component("parrot-kesha")
public class Parrot {
	private String name = "Kesha";
	...
}
Бұл автоматты конфигурацияның барлық нүктесі . Сіз өз сыныптарыңызды жазасыз, оларды қажетті annotationлармен белгілейсіз және Spring бағдарламасына сыныптарыңыз бар буманы көрсетесіз, ол арқылы ол өтіп, annotationларды іздейді және осындай класстардың an objectілерін жасайды. Айтпақшы, Spring тек annotationларды ғана емес @Component, сонымен бірге осыдан мұраланған барлық басқа annotationларды да іздейді. Мысалы, @Controller, @RestController, @Service, @Repositoryжәне басқалары, олармен біз келесі мақалаларда кездесетін боламыз. Енді дәл осылай жасауға тырысайық, бірақ java конфигурациясын қолданып көрейік . @ComponentАлдымен сабақтарымыздан annotationларды алып тастаймыз . Тапсырманы қиынdate үшін, бұл біздің жеке жазбаша сыныптар емес деп елестетіп көрейік, біз оларды оңай өзгерте аламыз, бірдеңе қоса аламыз, оның ішінде annotationлар. Бұл сыныптар бір кітапханада жинақталған сияқты. Бұл жағдайда біз бұл сыныптарды көктемге дейін қабылданатындай етіп өңдей алмаймыз. Бірақ бізге осы сыныптардың an objectілері қажет! Мұнда осындай нысандарды жасау үшін java конфигурациясы қажет болады. Бастау үшін пакетті жасайық, мысалы configs, және онда - мысалы, кәдімгі Java класы MyConfigжәне оны annotationмен белгілейік.@Configuration
@Configuration
public class MyConfig {
}
main()Енді әдісте контекст жасау жолын аздап өзгерту керек . Біз сол жерде конфигурациямен сыныпты тікелей көрсете аламыз:
ApplicationContext context =
	new AnnotationConfigApplicationContext(MyConfig.class);
Егер бізде бұршақ жасайтын бірнеше түрлі сыныптар болса және олардың бірнешеуін бірден қосқымыз келсе, біз оларды үтірмен бөліп көрсетеміз:
ApplicationContext context =
	new AnnotationConfigApplicationContext(MyConfig.class, MyAnotherConfig.class);
Егер бізде олардың саны тым көп болса және олардың барлығын бірден қосқымыз келсе, біз бұл жерде олар бар пакеттің атын көрсетеміз:
ApplicationContext context =
	new AnnotationConfigApplicationContext("ru.javarush.info.fatfaggy.animals.configs");
Бұл жағдайда Spring осы бума арқылы өтіп, annotationмен белгіленген барлық сыныптарды табады @Configuration. Егер бізде конфигурациялар әртүрлі бумаларға бөлінген шынымен үлкен бағдарлама болса, біз жай ғана үтірмен бөлінген конфигурациялары бар бумалардың аттарын көрсетеміз:
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");
Ал, немесе олардың барлығына ортақ пакет атауы:
ApplicationContext context =
	new AnnotationConfigApplicationContext("ru.javarush.info.fatfaggy.animals");
Сіз мұны өз қалауыңыз бойынша жасай аласыз, бірақ менің ойымша, конфигурациялары бар сыныпты көрсететін бірінші нұсқа біздің бағдарламамызға жақсы сәйкес келеді. Мәтінмәнді жасау кезінде Spring annotationмен белгіленген сыныптарды іздейді @Configurationжәне осы сыныптардың нысандарын өз бетінше жасайды. Осыдан кейін ол annotationмен белгіленген осы сыныптардағы әдістерді шақыруға тырысады @Bean, яғни мұндай әдістер контекстінде бұрыннан орналастырған бұршақтарды (нысандарды) қайтарады. Ал, енді сыныпта java конфигурациясымен мысық, ит және тотықұс бұршақтарын жасайық. Бұл өте қарапайым түрде жасалады:
@Bean
public Cat getCat() {
	return new Cat();
}
Біз мысықты өз қолымызбен жасап, оны Көктемге бердік, ол біздің бұл нысанды өз контекстіне орналастырды. Біз бұршақтың атын нақты көрсетпегендіктен, Көктем бұршаққа әдіс атауымен бірдей атау береді. Біздің жағдайда мысықтың бұршағында « getCat» атауы болады. Бірақ -e-де mainбіз мысықты аты бойынша емес, класс бойынша аламыз, бұл жағдайда бұл қоқыс жәшігінің атауы біз үшін маңызды емес. Дәл осылай итпен бұршақ жасаңыз, бірақ көктем мұндай бұршақты әдіс атымен атайтынын есте сақтаңыз. Біздің бұршақты тотықұспен нақты атау үшін оның атын annotationдан кейін жақша ішінде көрсетіңіз @Bean:
@Bean("parrot-kesha")
public Object weNeedMoreParrots() {
	return new Parrot();
}
Көріп отырғаныңыздай, мен мұнда қайтарылатын мәннің түрін көрсеттім Objectжәне әдісті кез келген нәрсе деп атадым. Бұл бұршақтың атына ешқандай әсер етпейді, өйткені біз оны осында нақты орнаттық. Бірақ қайтарылатын мән түрін және әдіс атауын ашық емес, азды-көпті анық көрсеткен дұрыс. Бір жылдан кейін бұл жобаны ашқанда, тіпті өзіңіз үшін. :) Енді бір бұршақты жасау үшін басқа бұршақты пайдалану керек жағдайды қарастырайық . Мысалы, мысық бұршақтағы мысықтың аты тотықұс аты мен «-өлтіруші» жолынан тұруын қалаймыз. Проблема жоқ!
@Bean
public Cat getCat(Parrot parrot) {
	Cat cat = new Cat();
	cat.setName(parrot.getName() + "-killer");
	return cat;
}
Міне, көктем осы бұршақты жасамас бұрын, ол қазірдің өзінде жасалған тотықұс бұршағын осында тасымалдау керек екенін көреді. Сондықтан ол біздің әдістерімізге қоңыраулар тізбегін құрастырады, осылайша алдымен попугаяны жасау әдісі шақырылады, содан кейін бұл тотықұсты мысық жасау әдісіне береді. Дәл осы жерде тәуелділік инъекциясы деп аталатын нәрсе жұмыс істеді : Көктемнің өзі біздің әдісімізге қажетті тотықұс бұршағын берді. Егер идея айнымалыға шағымданса , попугадан -ға дейін parrotқайтару түрін өзгертуді ұмытпаңыз . Сонымен қатар, Java конфигурациясы бұршақтар жасау әдістерінде кез келген Java codeын орындауға мүмкіндік береді . Сіз шынымен де кез келген нәрсені жасай аласыз: басқа көмекші нысандарды жасаңыз, кез келген басқа әдістерді шақырыңыз, тіпті серіппелі annotationлармен белгіленбегендерді де шақырыңыз, ілмектер, шарттар жасаңыз - ойыңызға келгеннің бәрі! Мұның барлығына автоматты конфигурацияны пайдалану арқылы қол жеткізу мүмкін емес, xml конфигурацияларын пайдалану әлдеқайда аз. ObjectParrot Енді қызықтырақ мәселені қарастырайық. Полиморфизммен және интерфейстермен :) Интерфейс құрып WeekDay, осы интерфейсті жүзеге асыратын 7 класс құрайық: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday. String getWeekDayName()Сәйкес сыныптың апта күнінің атын қайтаратын әдісті интерфейсте жасайық . Яғни, сынып Monday« » қайтарады mondayжәне т.б. Қолданбамызды іске қосқан кезде тапсырма аптаның ағымдағы күніне сәйкес келетін контексте бұршақты орналастыру болып табылады делік. Интерфейсті жүзеге асыратын барлық сыныптардың барлық бұршақтары емес WeekDay, тек бізге қажет. Мұны келесідей жасауға болады:
@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();
	}
}
Мұнда қайтарылатын мән түрі біздің интерфейсіміз болып табылады және әдіс аптаның ағымдағы күніне байланысты интерфейсті іске асыру сыныптарының нақты нысандарын қайтарады. Енді әдісте main()біз мұны істей аламыз:
WeekDay weekDay = context.getBean(WeekDay.class);
System.out.println("It's " + weekDay.getWeekDayName() + " today!");
Бұл маған бүгін жексенбі екенін айтты :) Мен ертең бағдарламаны іске қоссам, контексте мүлдем басқа нысан пайда болатынына сенімдімін. Назар аударыңыз, мұнда біз бұршақты интерфейс арқылы аламыз: context.getBean(WeekDay.class). Көктем өз бұршақтарының қайсысы осындай интерфейсті жүзеге асыратынын және оны қайтаратынын көру үшін контекстке қарайды. Сонымен, WeekDayтипті айнымалыда типті an object бар екені белгілі болды Sundayжәне бәрімізге таныс полиморфизм осы айнымалымен жұмыс істегенде басталады. :) Және аралас тәсіл туралы бірнеше сөз , мұнда бұршақтың бір бөлігін Аннотациясы бар сыныптардың болуы үшін пакеттерді сканерлеу арқылы Spring өзі жасайды @Componentжәне кейбір басқа бұршақтар java конфигурациясы арқылы жасалады. CatМұны істеу үшін, сыныптар , Dogжәне Parrotannotationмен белгіленген кезде бастапқы нұсқаға оралайық @Component. Көктемге қарай пакетті автоматты сканерлеу арқылы жануарларымызға арналған жәшіктер жасағымыз келеді делік entities, бірақ біз жаңа жасағандай аптаның күнімен қоқыс жәшігін жасадық. Сізге тек --ші annotationда MyConfigмәтінмәнді құру кезінде белгілейтін сынып деңгейіне қосу және жақшада сканерлеуді қажет ететін буманы және автоматты түрде жасалған қажетті сыныптардың бұршақтарын көрсету керек: 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();
		}
	}
}
Мәтінмән құру кезінде Spring сыныпты өңдеу керек екенін көреді MyConfig. Ол оған кіреді және « » бумасын сканерлеу және сол сыныптардың бұршақтарын жасау керек екенін көреді , содан кейін ол сыныптан ru.javarush.info.fatfaggy.animals.entitiesәдісті орындайды және контекстіне түрдің бұршағын қосады . Әдісте біз қазір барлық қажетті бұршақтарға қол жеткізе аламыз: жануарларға арналған нысандар да, аптаның күні бұршақ. Spring кейбір xml конфигурацияларын таңдайтынына қалай көз жеткізуге болады - қажет болса, оны Интернетте google-ден өзіңіз іздеңіз :) Түйіндеме:getDay()MyConfigWeekDaymain()
  • автоматты конфигурацияны қолдануға тырысыңыз;
  • автоматты конфигурациялау кезінде бұршақтары жасалуы қажет сыныптарды қамтитын буманың атын көрсетеміз;
  • мұндай сыныптар annotationмен белгіленеді@Component;
  • көктем осындай сыныптардың барлығынан өтіп, олардың an objectілерін жасайды және оларды контексте орналастырады;
  • егер автоматты конфигурация қандай да бір себептермен бізге сәйкес келмесе, біз java конфигурациясын пайдаланамыз;
  • @Configurationбұл жағдайда біз әдістері бізге қажетті нысандарды қайтаратын кәдімгі Java сыныбын жасаймыз және контекст құру кезінде конфигурациясы бар белгілі бір сыныпты көрсетпей, бүкіл пакетті сканерлеген жағдайда мұндай классты annotationмен белгілейміз ;
  • бұршақты қайтаратын осы сыныптың әдістері annotationмен белгіленеді @Bean;
  • java конфигурациясын пайдалану кезінде автоматты сканерлеуді қосқымыз келсе, біз annotationны қолданамыз @ComponentScan.
Егер ештеңе анық болмаса, осы мақаланы бірнеше күннен кейін оқып көріңіз. Егер сіз Джараваштың бастапқы деңгейінде болсаңыз, көктемді үйренуге сәл ертерек болуы мүмкін. Сіз Java тілінде бағдарламалауда сенімдірек сезінген кезде, сіз әрқашан осы мақалаға сәл кейінірек орала аласыз. Егер бәрі түсінікті болса, сіз өзіңіздің үй жануарларыңыздың кейбір жобаларын Көктемге көшіруге тырысуға болады :) Егер бірдеңе түсінікті болса, бірақ бірдеңе онша көп болмаса, пікір қалдырыңыз :) Егер мен бір жерге қадам басып кетсем немесе ақымақ нәрсе жазсам, ұсыныстар мен пікірлер де бар. ) Келесі мақалада біз spring-web-mvc- ке терең үңіліп , көктемнің көмегімен қарапайым веб-қосымшаны жасаймыз.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION