Pull to refresh

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

Reading time5 min
Views5.7K


Добрый день!

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

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

Урок 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>

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

Продолжение следует…
Tags:
Hubs:
Total votes 9: ↑9 and ↓0+9
Comments15

Articles