Весенний слабо связанный пример
Концепция объектно-ориентированного подхода - это хороший дизайн, позволяющий разбить вашу систему на группу многократно используемых объектов. Однако, когда система становится больше, особенно в 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-проектах.