Весенний слабо связанный пример
Концепция объектно-ориентированного подхода - это хороший дизайн, позволяющий разбить вашу систему на группу многократно используемых объектов. Однако, когда система становится больше, особенно в Java-проекте, огромные объектные зависимости всегда будут тесно связаны, что затруднит управление или изменение объектов. В этом сценарии вы можете использовать инфраструктуру Spring в качестве центрального модуля для простого и эффективного управления всеми объектными зависимостями.
Пример генератора выходных данных
Давайте рассмотрим пример, предположим, что в вашем проекте есть функция для вывода контента в формат Csv или Json. Ваш код может выглядеть следующим образом:
Файл: IOutputGenerator.java - Интерфейс для генератора вывода
package com.example.output;
public interface IOutputGenerator
{
public void generateOutput();
}
Файл: CsvOutputGenerator.java - генератор вывода Csv для реализации интерфейса IOutputGenerator.
package com.example.output.impl;
import com.example.output.IOutputGenerator;
public class CsvOutputGenerator implements IOutputGenerator
{
public void generateOutput(){
System.out.println("Csv Output Generator");
}
}
Файл: JsonOutputGenerator.java - генератор вывода Json для реализации интерфейса IOutputGenerator.
package com.example.output.impl;
import com.example.output.IOutputGenerator;
public class JsonOutputGenerator implements IOutputGenerator
{
public void generateOutput(){
System.out.println("Json Output Generator");
}
}
Есть несколько способов вызова IOutputGenerator и как использовать Spring, чтобы избежать тесного связывания объектов друг с другом.
1. Способ 1 - позвоните прямо
Обычный способ, позвоните прямо.
package com.example.common;
import com.example.output.IOutputGenerator;
import com.example.output.impl.CsvOutputGenerator;
public class App
{
public static void main( String[] args )
{
IOutputGenerator output = new CsvOutputGenerator();
output.generateOutput();
}
}
Problem
Таким образом, проблема состоит в том, что «выход» тесно связан с CsvOutputGenerator, каждое изменение выходного генератора может включать изменение кода. Если этот код разбросан по всему вашему проекту, каждое изменение выходного генератора заставит вас серьезно пострадать.
Метод 2 - вызвать его с помощью вспомогательного класса
Вы можете подумать о создании вспомогательного класса, чтобы переместить всю выходную реализацию внутрь.
package com.example.output;
import com.example.output.IOutputGenerator;
import com.example.output.impl.CsvOutputGenerator;
public class OutputHelper
{
IOutputGenerator outputGenerator;
public OutputHelper(){
outputGenerator = new CsvOutputGenerator();
}
public void generateOutput(){
outputGenerator.generateOutput();
}
}
Назовите это через вспомогательный класс.
package com.example.common;
import com.example.output.OutputHelper;
public class App
{
public static void main( String[] args )
{
OutputHelper output = new OutputHelper();
output.generateOutput();
}
}
Problem
Это выглядит более элегантно, и вам нужно управлять только одним вспомогательным классом, однако вспомогательный класс по-прежнему тесно связан с CsvOutputGenerator, каждое изменение выходного генератора по-прежнему требует незначительного изменения кода.
Метод 3 - Весна
В этом сценарии Spring Dependency Injection (DI) является хорошим выбором. Spring может сделать ваш выходной генератор слабо связанным с выходным генератором.
Незначительные изменения в классе OutputHelper.
package com.example.output;
import com.example.output.IOutputGenerator;
public class OutputHelper
{
IOutputGenerator outputGenerator;
public void generateOutput(){
outputGenerator.generateOutput();
}
public void setOutputGenerator(IOutputGenerator outputGenerator){
this.outputGenerator = outputGenerator;
}
}
Создайте файл конфигурации Spring bean и объявите здесь все ваши зависимости Java-объектов.
Позвони через весну
package com.example.common;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.example.output.OutputHelper;
public class App
{
public static void main( String[] args )
{
ApplicationContext context =
new ClassPathXmlApplicationContext(new String[] {"Spring-Common.xml"});
OutputHelper output = (OutputHelper)context.getBean("OutputHelper");
output.generateOutput();
}
}
Теперь вам просто нужно изменить XML-файл Spring для другого генератора вывода. Когда выходные данные изменились, вам нужно изменить только XML-файл Spring, код не изменился, значит меньше ошибок.
Заключение
В Spring Framework - Dependency Injection (DI) - полезная функция для управления объектными зависимостями, она просто элегантна, очень гибка и облегчает сопровождение, особенно в больших Java-проектах.