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