疎結合の例
オブジェクト指向のコンセプトは、システムを再利用可能なオブジェクトのグループに分割する優れた設計です。しかし、システムが大きくなると、特にJavaプロジェクトでは、巨大なオブジェクトの依存関係が常に緊密に結び付けられ、オブジェクトの管理や変更が非常に困難になります。このシナリオでは、Springフレームワークを使用して、すべてのオブジェクト依存関係を簡単かつ効率的に管理する中心的なモジュールとして機能させることができます。
出力ジェネレータの例
例を見てみましょう。プロジェクトにCsvまたはJson形式でコンテンツを出力する関数があるとします。コードは次の例のようになります。
File:IOutputGenerator.java – 出力ジェネレータ
のインタフェース
package com.mkyong.output;
public interface IOutputGenerator
{
public void generateOutput();
}
__File:CsvOutputGenerator.java – IOutputGeneratorインターフェイスを実装するためのCsv出力ジェネレータ。
package com.mkyong.output.impl;
import com.mkyong.output.IOutputGenerator;
public class CsvOutputGenerator implements IOutputGenerator
{
public void generateOutput(){
System.out.println("Csv Output Generator");
}
}
__File:JsonOutputGenerator.java – IOutputGeneratorインターフェイスを実装するJson出力ジェネレータ。
package com.mkyong.output.impl;
import com.mkyong.output.IOutputGenerator;
public class JsonOutputGenerator implements IOutputGenerator
{
public void generateOutput(){
System.out.println("Json Output Generator");
}
}
Output Generatorを呼び出すにはいくつかの方法があります。また、Springを使用してオブジェクト同士が密接に結合しないようにする方法もあります。
1.方法1 – 直接呼び出す
通常の方法で直接呼びます。
package com.mkyong.common;
import com.mkyong.output.IOutputGenerator;
import com.mkyong.output.impl.CsvOutputGenerator;
public class App
{
public static void main( String[]args )
{
IOutputGenerator output = new CsvOutputGenerator();
output.generateOutput();
}
}
方法2 – ヘルパークラスで呼び出す
すべての出力実装を内部で動かすためのヘルパークラスを作成すると考えられます。
package com.mkyong.output;
import com.mkyong.output.IOutputGenerator;
import com.mkyong.output.impl.CsvOutputGenerator;
public class OutputHelper
{
IOutputGenerator outputGenerator;
public OutputHelper(){
outputGenerator = new CsvOutputGenerator();
}
public void generateOutput(){
outputGenerator.generateOutput();
}
}
ヘルパークラスを介して呼び出します。
package com.mkyong.common;
import com.mkyong.output.OutputHelper;
public class App
{
public static void main( String[]args )
{
OutputHelper output = new OutputHelper();
output.generateOutput();
}
}
-
問題** これはより洗練されたもので、ヘルパークラスはまだCsvOutputGeneratorに密接に結合されていますが、出力ジェネレータの変更にはマイナーコードの変更が含まれます。
方法3 – 春
このシナリオでは、Spring Dependency Injection(DI)が良い選択です。
Springは、出力ジェネレータを出力ジェネレータに疎結合させることができます。
OutputHelperクラスのマイナーな変更。
package com.mkyong.output;
import com.mkyong.output.IOutputGenerator;
public class OutputHelper
{
IOutputGenerator outputGenerator;
public void generateOutput(){
outputGenerator.generateOutput();
}
public void setOutputGenerator(IOutputGenerator outputGenerator){
this.outputGenerator = outputGenerator;
}
}
SpringのBean構成ファイルを作成し、すべてのJavaオブジェクトの依存関係をここで宣言します。
<!-- Spring-Common.xml -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="OutputHelper" class="com.mkyong.output.OutputHelper">
<property name="outputGenerator" ref="CsvOutputGenerator"/>
</bean>
<bean id="CsvOutputGenerator" class="com.mkyong.output.impl.CsvOutputGenerator"/>
<bean id="JsonOutputGenerator" class="com.mkyong.output.impl.JsonOutputGenerator"/>
</beans>
それを春から呼び出す
package com.mkyong.common;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.mkyong.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フレームワーク – 依存関係注入(DI)は、オブジェクト依存関係の管理に便利な機能です。特に、大規模なJavaプロジェクトでは、エレガントで柔軟性が高く、保守性が向上します。