Spring開源框架松耦合示例

本文我們來講講java開源框架Spring的松耦合示例,至于什麽是Spring,前面已經介紹過,大家也可以去百度搜搜。松耦合通常是基于消息的系統。

面向對象設計的理念是把整個系統分成一組可重用的組件,然而,當系統變得越大的時候,尤其是在java中,這最大的對象依賴將會緊緊耦合,以至于非常難以管理和修改,而現在,你可以使用Spring框架扮演一個中間模塊的角色,方便高效地管理其他組件依賴
輸出生成的例子
看個例子,假設你的專案有一個方法可以輸出內容到csv或者json格式,你可能寫出這樣的代碼
package com.mkyong.output;
public interface IOutputGenerator
{
public void generateOutput();
}

,然後是實現接口的類
package com.mkyong.output.impl;
import com.mkyong.output.IOutputGenerator;
public class CsvOutputGenerator implements IOutputGenerator
{
public void generateOutput(){
System.out.println(“Csv Output Generator”);
}
}
再寫個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”);
}
}
有好幾種方法來調用IOutputGenerator接口,以及我們如何使用Spring來避免對象的過度耦合。

方法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();
}
}
問題:
這種方法,output這個對象和CsvOutputGenerator耦合在了一起,每次要改變輸出格式的話都要修改代碼,如果這類代碼遍布專案,那麽改起來就跪了

方法2-通過幫助類調用
也許你會想創建一個Helper類吧所有的output實現都移進去
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();
}
}
問題:
看起來似乎更加優雅了,你僅僅需要管理這個Helper類就可以實現不同格式的輸出需求改變了,然而,Helper還是和CvsOutputGenerator耦合,每一次要改變輸出格式的時候,都要對Helper類做一下微調。

方法3-Spring
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"&gt;
&lt;bean id="OutputHelper" class="com.mkyong.output.OutputHelper"&gt;
&lt;property name="outputGenerator" ref="CsvOutputGenerator" /&gt;
&lt;/bean&gt;
&lt;bean id="CsvOutputGenerator" class="com.mkyong.output.impl.CsvOutputGenerator" /&gt;
&lt;bean id="JsonOutputGenerator" class="com.mkyong.output.impl.JsonOutputGenerator" /&gt;
</beans>
然後通過Spring調用
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();
}
}


以後要改Json格式,直接改一下xml配置文件就行了。能夠減少錯誤

結論
通過Spring框架的依賴注入,可以優雅的管理對象依賴,更大的靈活性,尤其是對于Java專案非常好用。

更多相關文章
  • Amoeba:開源的分布式數據庫Porxy解決方案
    Amoeba是一個以MySQL爲底層數據存儲,並對應用提供MySQL協定接口的proxy.它集中地回應應用的請求,依據用戶事先設置的規則,將SQL請求發送到特定的數據庫上執行.基于此可以實現負載均衡.讀寫分離.高可用性等需求.與MySQL官方的MySQL Proxy相比,作者強調的是amoeba配置
  • CYQ.Data開源數據層框架使用例子
    CYQData數據框架:是一款操作數據庫用的數據框架:簡潔易用.功能強大.效能優越.內置支
  • 我們經常會使用iptables來做linux系統的防火牆了,但你知道不知道linux還在大量的開源的防火牆哦,下面我給各位總結前10個防火牆吧.如今,開源防火牆可謂數目繁多.本文將涉及十個適合企業需求的最實用的開源防
  • HBase是一個分布式的.面向列的開源數據庫,hive是基于Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射爲一張數據庫表,並提供簡單的sql查詢功能,現在我們來談談hbase+hive應用場景.一.Hive應用場景本文主要講述使用 Hive 的實踐,業務不是關鍵,簡要介紹業務場景,本次的
  • 國內開源DNS之dnspod-sr測試例子
    本文章要介紹的內容是國內開源DNS之dnspod-sr測試了,各位如果想了解一下這個dns
  • 整理的7款常用的開源免費的Android UI組件及官方下載地址
    Android開發技術日趨成熟,開源社區也湧現了很多開源UI專案,以下是筆者整理的7款Android開發者常用的Android UI組件及官方下載地址.Android開發是目前最熱門的移動開發技術之一,隨著開發者的不斷努力和Android社區的進步,Android開發技術已經日趨成熟,當然,在And
  • Android如何實現圖表開源庫MPAndroidChart教程附圖
    本文講解內容爲Android開源圖表庫MPAndroidChart的簡單用法.MPAndroidChart是一款基于Android的開源圖表庫,它可以實現在Android設備上繪制各種統計圖表,目前提供線圖和餅圖,支持選擇.縮放和拖放,應用靈活方便.MPAndroidChart同樣擁有常用的圖表類型
  • 類Unix上5個最佳開源備份工具 Bacula/Amanda/Backupninja/Backuppc/UrBackup
    數據備份是相當重要的,或者你的數據會人爲的失誤,磁盤陣列或是硬盤故障,文件系統崩潰,數據中心被破壞等原因丟失,這是就得恢複你最新備份的.下面是我爲大家羅列了一些在linux和類unix上開源的軟件備份工具.當爲一個企業選擇備份工具的時候,你都考慮什麽呢?確定你正在部署的軟件具有下面的特性 開源軟件 ...
一周排行