スプリングの疎結合の例
オブジェクト指向の概念は、システムを再利用可能なオブジェクトのグループに分割するための優れた設計です。 ただし、特にJavaプロジェクトでシステムが大きくなると、巨大なオブジェクトの依存関係が常に密結合し、オブジェクトの管理や変更が非常に難しくなります。 このシナリオでは、Springフレームワークを使用して、すべてのオブジェクトの依存関係を簡単かつ効率的に管理する中央モジュールとして機能できます。
出力ジェネレーターの例
例を見てみましょう。プロジェクトにコンテンツをCsvまたはJson形式で出力する機能があると仮定します。 コードは次の例のようになります。
ファイル:IOutputGenerator.java –出力ジェネレーターのインターフェース
package com.example.output;
public interface IOutputGenerator
{
public void generateOutput();
}
ファイル:CsvOutputGenerator.java –IOutputGeneratorインターフェースを実装するためのCsv出力ジェネレーター。
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 –IOutputGeneratorインターフェースを実装するためのJson出力ジェネレーター。
package com.example.output.impl;
import com.example.output.IOutputGenerator;
public class JsonOutputGenerator implements IOutputGenerator
{
public void generateOutput(){
System.out.println("Json Output Generator");
}
}
Output Generatorを呼び出す方法と、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オブジェクトの依存関係をここで宣言します。
Spring経由で呼び出す
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();
}
}
ここで、異なる出力ジェネレーターのSpring XMLファイルを変更するだけです。 出力が変更された場合、Spring XMLファイルのみを変更する必要があり、コードは変更されないため、エラーが少なくなります。
結論
Springフレームワーク– Dependency Injection(DI)は、オブジェクトの依存関係管理に役立つ機能です。エレガントで柔軟性が高く、特に大規模なJavaプロジェクトでの保守性を高めます。