SPRING-SOURCE.RU

Использование Spring для конфигурирования модульного приложения

Следующий рисунок графически показывает, как Spring может гибко менять реализацию математической операции или реализацию ResultWriter.

Spring конфигурация модульного приложения

Кружок на рисунке – это Spring контейнер. Он читает конфигурационный файл beans.xml (описание контекста) и использует полученную информацию для связывания компонентов вместе. Описание контекста – это разновидность конфигурационного файла для создания приложения за пределами компонентов.

CalculateSpring – это основной класс, который на прямую не иницилизирует Operation или ResultWriter. Вместо этого эта задача выполняется Spring контейнером. Spring контейнер считывает конфигурационный файл beans.xml, иницилизирует бины и затем связывает их соответственно конфигурационной информации, содержащейся в beans.xml.

Давайте попробуем.
Компиляция вашего первого приложения.

  1. Для компиляции исходных кодов нужно зайти в распакованную директорию и запустить команду:
    mvn compile
    Запоните, что после запуска команды Maven 2 будет скачивать все необходимые Spring библиотеки из глобального репозитория. Однажды, списанная библиотека сохраняется в локальном репозитории на вашем компьютере и при следующем запуске Maven уже не будет ее списывать.
  2. Теперь запустим наше приложение, используя следующую команду:
    mvn exec:java -Dexec.mainClass=com.wrox.begspring.CalculateSpring –Dexec.args="3000 3"
    Результатом должна быть строка: The result of 3000 times 3 is 9000!

Как это работает

Способность соединять и рассоединять повторно используемые Java бины в приложении – это важная сторона Spring framework.

Суть в том, что CalculateSpring не сам работает с экземплярами Operation или ResultWriter, а делегирует эту задачу Spring контейнеру. Spring контейнер, в свою очередь, читайет конфигурационный файл и вызывает бин файл дескриптор.

                        
package com.wrox.begspring;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class CalculateSpring {
  private Operation ops;
  private ResultWriter wtr;
  public void setOps(Operation ops) {
  this.ops = ops;
}

public void setWriter(ResultWriter writer) {
  this.wtr = writer;
}

public static void main(String[] args) {
  ApplicationContext context =
  new ClassPathXmlApplicationContext("beans.xml");
  BeanFactory factory = (BeanFactory) context;
  CalculateSpring calc =(CalculateSpring) factory.getBean("opsbean");
  calc.execute(args);
}
public void execute(String [] args) {
  long op1 = Long.parseLong(args[0]);
  long op2 = Long.parseLong(args[1]);
  wtr.showResult("The result of " + op1 + ops.getOpsName() + op2 + " is " + ops.operate(op1, op2) + "!");
}
}
		

ApplicationContext это BeanFactory

Создаем контекст, затем фабрику и при помощи фабрики достаем бин. ApplicationContext в Spring это тип BeanFactory. BeanFactory дает возможность доступа к JavaBeans которые иницилизированы, связанные и управляемые Spring контейнером.

Хотя есть и другие BeanFactory классы в Spring, ApplicationContext класс намного чаще используется, так как он снабжает нас несколькими ценными особенностями – включение поддержки для интернационализации, загрузка ресурсов, интеграция с внешними иерархиями конекстов и много чего еще.

Обеспечиваем Spring контейнер инструкциями по связыванию

Конструктор ClassPathXmlApplicationContext берет в качестве аргумента файл описания контекста или bean wiring файл. Этот файл называется beans.xml только лишь в наших примерах, вы же можете называть его как хотите, но следите, чтобы расширение файла было XML. Файл beans.xml – это конфигурационный файл, описывающий, как связывать объекты вместе. Здесь показан beans.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-2.0.xsd">
<bean id="screen" class="com.wrox.begspring.ScreenWriter" />
<bean id="multiply" class="com.wrox.begspring.OpMultiply" />
<bean id="add" class="com.wrox.begspring.OpAdd" />
<bean id="opsbean" class="com.wrox.begspring.CalculateSpring">
<property name="ops" ref="multiply" />
<property name="writer" ref="screen"/>
</bean>
</beans>
		

ClassPathXmlApplicationContext – это часть Spring контейнера, и ищет контекстное описание (beans.xml) в Java VM CLASSPATH и создает из него экземпляр ApplicationContext. Spring контейнер связывает бины в ходе иницилизации ApplicationContext.

Связывание Java Beans

  1. Создаем экземпляр ScreenWriter и именуем bean, как screen
  2. Создаем экземпляр OpMultiply именуем bean, как multiply
  3. Создаем экземпляр OpAdd именуем bean, как add
  4. Создаем экземпляр CalculateSpring именуем bean, как opsbean
  5. Устанавливаем ссылку свойства ops opsbean бина, к бину с именем multiply
  6. Устанавливаем ссылку свойства writer opsbean бина, к бину с именем screen

                        
<?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-2.0.xsd">
<(1)bean id="screen" class="com.wrox.begspring.ScreenWriter" />
<(2)bean id="multiply" class="com.wrox.begspring.OpMultiply" />
<(3)bean id="add" class="com.wrox.begspring.OpAdd" />
<(4)bean id="opsbean" class="com.wrox.begspring.CalculateSpring">
<(5)property name="ops" ref="multiply" />
<(6)property name="writer" ref="screen"/>
</bean>
</beans>
		

В xml файле каждый бин имеет id с уникальным именем.