SPRING-SOURCE.RU

Создание модульного приложения

Рассмотрим простое приложение по сложению двух чисел и выводу результата. Все приложение можно написать при помощи лишь одного класса Calculate. Что, если нам понадобилось изменить сложение в методе operate на умножение или выводить результат в методе showResult не на экран, а в файл. В этих случаях код программы нужно постоянно менять.

public class Calculate {
	public Calculate() {
	}

	public static void main(String[] args) {
		Calculate calc = new Calculate();
		calc.execute(args);
	}

	private void showResult(String result) {
		System.out.println(result);
	}

	private long operate(long op1, long op2) {
		return op1 + op2;
	}

	private String getOpsName() {
		return " plus ";
	}

	public void execute(String [] args) {
		long op1 = Long.parseLong(args[0]);
		long op2 = Long.parseLong(args[1]);
		showResult("The result of " + op1 +
		getOpsName() + op2 + " is " + operate(op1, op2) + "!");
	}
}
		

Вводим интерфейсы

Нам нужно разъединить логику приложения от математических операций, и от метода сохранения результатов, при помощи интерфейсов. Первый интерфейс будет называться Operation. В нем мы объявим два метода operate(long op1, long op2) и getOpsName(). После этого, если мы захотим сделать сложение, то мы просто будем реализовывать этот интерфейс. Для других математических действий все делаем также.

                        
public interface Operation {
	long operate(long op1, long op2);
	String getOpsName();
}
		

Сложение

                        
public class OpAdd implements Operation {
	public OpAdd() {
	}

	public String getOpsName() {
	return " plus ";
	}

	public long operate(long op1, long op2) {
		return op1 + op2;
	}
}
		

Умножение

                        
public class OpMultiply implements Operation {
	public OpMultiply() {
	}

	public String getOpsName() {
		return " times ";
	}

	public long operate(long op1, long op2) {
		return op1 * op2;
	}
}
		

Собираем все вместе

                        
public class CalculateScreen {
	private Operation ops = new OpAdd();
	private ResultWriter wtr = new ScreenWriter();

	public static void main(String[] args) {
		CalculateScreen calc = new CalculateScreen();
		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) + "!");
	}
}
		

Здесь мы увидели, как монолитное приложение было разъединено на компоненты. Теперь мы имеем OpAdd, OpMultiply и основной класс CalculateScreen. В главном классе мы определяем один из Op* классов и используем его.

Если мы хотим изменить действия, то нужно просто поменять названия классов. Все остальное поменяется автоматически (вывод информации).

Давайте попробуем

  1. Для компиляции исходных кодов монолитного приложения нужно зайти в распакованную директорию и запустить команду:
    mvn compile
  2. Теперь запустим наше приложение, используя следующую команду:
    mvn exec:java -Dexec.mainClass=com.Calculate –Dexec.args="3000 3"
    Результатом должна быть строка: The result of 3000 plus 3 is 3003!
  3. Для запуска модульной версии скопируйте все файлы из папки modules в папку com

Запомните, что у вас должно быть соединение с интернет когда работаете с Maven 2. Потому что Maven 2 автоматически скачивает все зависимости из глобальных репозиториев, где хранятся библиотеки с исходным кодом.

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

Команда mvn запускает Maven 2. Maven 2 – это инструмент управления проектами, который вы будете использовать.

На рисунке Вы можете увидеть два вида приложений: приложение all-in-one и модульное приложение.

Spring монолитное и модульное приложение

Здесь есть одна небольшая проблема: код CalculateScreen должен быть изменен или перекомпилирован если вам нужно изменить математическую операцию или по другому вывести результат. Код, который создает экземпляры OppAdd и ScreenWriter жестко закодирован в CalculateScreen. Следующая секция демонстрирует, как Spring может нам помочь решить эту проблему.