Весенний пример слабосвязанного

Весенний слабо связанный пример

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