
Добрый день!
Я вдохновился приглашением продолжить публикацию, поэтому продолжаю.
В этот раз мы рассмотрим основные варианты внедрения зависимости — через конструктор и через сеттеры. Все исходники искать здесь
Урок 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>
Класс старт в данном случае можно не трогать. Запускаем. Все работает. Отметим, что для сцены не запускается конструктор с двумя параметрами, зато после создания сцены устанавливаются два сеттера.
Продолжение следует…