Как я изучаю фреймворк Spring — часть 2 (помощь начинающим — дело рук самих начинающих)

Добрый день!

Я вдохновился приглашением продолжить публикацию, поэтому продолжаю.

В этот раз мы рассмотрим основные варианты внедрения зависимости — через конструктор и через сеттеры. Все исходники искать здесь

Урок 06. Внедрение через конструктор.

Снова возьмем за основу проект из урока 2.

Добавим еще одного поэта. src\main\java\spring\impls\Severyanin.java

package spring.impls;  import spring.intarfaces.Lyricist;  public class Severyanin implements Lyricist {  	@Override 	public String Generate() { 		return "Это было у моря, где ажурная пена,\r\n" + "Где встречается редко городской экипаж…\r\n" 		+ "Королева играла — в башне замка — Шопена,\r\n" + "И, внимая Шопену, полюбил её паж. "; 	}  } 

Зарегистрируем класс в конфигурационном файле src\main\resources\ApplicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  	<bean id="LyricistBean1" class="spring.impls.Poushkin"/> 	<bean id="LyricistBean2" class="spring.impls.Mayakovsky"/> 	<bean id="LyricistBean3" class="spring.impls.Severyanin"/>  </beans> 

В начале двадцатого века были очень популярны литературные дуэли.

Устроим литературную дуэль между двумя поэтами. Для этого создадим сцену src\main\java\spring\impls\ Stage.java

package spring.impls;  import spring.intarfaces.Lyricist;  public class Stage { 	private Lyricist lyr1; 	private Lyricist lyr2;  	public Stage(Lyricist lyr1, Lyricist lyr2) { 		this.lyr1 = lyr1; 		this.lyr2 = lyr2; 	}  	public void Act() { 		System.out.println("Первый поэт:"); 		System.out.println(lyr1.Generate());  		System.out.println(); 		System.out.println("Второй поэт:"); 		System.out.println(lyr2.Generate());  		System.out.println();  		System.out.print("В литературной дуэли победил "); 		if (Math.random() < 0.1) { 			System.out.println("Первый поэт."); 		} else { 			System.out.println("Второй поэт."); 		} 	} } 

В принципе, можно изменить src\main\java\spring\main\ Start.java – и все заработает:

package spring.main;  import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;  import spring.impls.Stage; import spring.intarfaces.Lyricist;  public class Start {  	public static void main(String[] args) { 		ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml"); 		Lyricist lyr1 = context.getBean("LyricistBean2", Lyricist.class);  		Lyricist lyr2 = context.getBean("LyricistBean3", Lyricist.class);  		Stage myStage = new Stage(lyr1, lyr2); 		myStage.Act();  		((ConfigurableApplicationContext) context).close();// закрытие контекста   	}  } 

Запускаем – все работает. Поэты выдали по одному шедевру, второй, скорее всего, победил. Так и должно быть, 27 февраля 1918 года в Политехническом музее на Избрании короля поэтов Северянин победил Маяковского. Но мы дали Владимиру Владимировичу небольшой шанс. Может быть, в вашей версии победил он.

Теперь вынесем все настройки в конфигурационный файл src\main\resources\ApplicationContext.xml, негоже явно в стартовом файле конфигурировать бины.

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  	<bean id="LyricistBean1" class="spring.impls.Poushkin"/> 	<bean id="LyricistBean2" class="spring.impls.Mayakovsky"/> 	<bean id="LyricistBean3" class="spring.impls.Severyanin"/>  	<bean id="StageBean" class="spring.impls.Stage"> 		<constructor-arg ref="LyricistBean2" /> 		<constructor-arg ref="LyricistBean3" /> 	</bean> 	 </beans> 

Обычно бины создаются с конструктором по умолчанию без аргументов. Но в нашем случае он не подойдет. Передадим в качестве аргументов ссылки на другие создаваемые бины Маяковского и Северянина.

Осталось убрать все лишнее из класса src\main\java\spring\main\ Start.java

package spring.main;  import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;  import spring.impls.Stage;  public class Start {  	public static void main(String[] args) { 		ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");  		Stage myStage = context.getBean("StageBean", Stage.class); 		myStage.Act();  		((ConfigurableApplicationContext) context).close();// закрытие контекста  	}  } 

Запускаем. Все работает. Бины создаются. Северянин вновь победил.

Во всяком случае, в моей реальности.

Теперь посмотрим, каким образом можно сконфигурировать сеттеры.

Урок 07. Внедрение через сеттеры.

Продолжим терзать предыдущий проект.
Наверное, неправильно при создании сцены создавать и поэтов.
Исправим эту оплошность и немного изменим класс сцены. Удалим конструктор и добавим сеттеры для lyr1 и lyr2 из src\main\java\spring\impls\ Stage.java

package spring.impls;  import spring.intarfaces.Lyricist;  public class Stage { 	private Lyricist lyr1; 	private Lyricist lyr2;  	public void setLyr1(Lyricist lyr1) { 		this.lyr1 = lyr1; 	}  	public void setLyr2(Lyricist lyr2) { 		this.lyr2 = lyr2; 	}  	public void Act() { 		System.out.println("Первый поэт:"); 		System.out.println(lyr1.Generate());  		System.out.println(); 		System.out.println("Второй поэт:"); 		System.out.println(lyr2.Generate());  		System.out.println();  		System.out.print("В литературной дуэли победил "); 		if (Math.random() < 0.1) { 			System.out.println("Первый поэт."); 		} else { 			System.out.println("Второй поэт."); 		} 	} } 

Изменим конфигурационный файл src\main\resources\ApplicationContext.xml. Уберем аргументы конструктора и добавим значения сеттеров.

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  	<bean id="LyricistBean1" class="spring.impls.Poushkin"/> 	<bean id="LyricistBean2" class="spring.impls.Mayakovsky"/> 	<bean id="LyricistBean3" class="spring.impls.Severyanin"/>  	<bean id="StageBean" class="spring.impls.Stage"> 		<property name="lyr1" ref="LyricistBean2"></property> 		<property name="lyr2" ref="LyricistBean3"></property> 	</bean> </beans> 

Класс старт в данном случае можно не трогать. Запускаем. Все работает. Отметим, что для сцены не запускается конструктор с двумя параметрами, зато после создания сцены устанавливаются два сеттера.

Продолжение следует…

FavoriteLoadingДобавить в избранное
Posted in Без рубрики

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *