2 Spring鬆耦合例項
物件導向的概念,是一個很好的設計來打破系統進入一個組可重用的物件。然而,當系統變大,尤其是在Java專案,龐大的物件依賴關係將一直緊密耦合引起物件難以管理或修改。在這種情況下,可以使用Spring框架作為一個核心模組輕鬆高效地管理所有的物件依賴。
輸出生成器的例子
讓我們來看一個例子,假設你的專案有一個函式輸出的內容,以CSV或JSON格式。您的程式碼可能看起來像下面的例子:
File : IOutputGenerator.java – 輸出生成器介面
package com.gp6.service;
public interface IOutputGenerator {
public void generateOutput();
}
File : CsvOutputGenerator.java – 一個CSV輸出生成器用來實現IOutputGenerator介面。
package com.gp6.service.impl;
import com.gp6.service.IOutputGenerator;
public class CsvOutputGenerator implements IOutputGenerator{
public void generateOutput(){
System.out.println("Csv Output Generator");
}
}
File : JsonOutputGenerator.java – 一個JSON輸出生成器用來實現IOutputGenerator介面。
package com.gp6.service.impl;
public class JsonOutputGenerator {
public void generateOutput(){
System.out.println("Json Output Generator");
}
}
有幾個方法來呼叫IOutputGenerator,以及如何使用 Spring 來避免物件相互結合緊密。
- 方法1 – 直接呼叫
正常的方式,直接呼叫它。
package com.gp6.test;
import com.gp6.service.IOutputGenerator;
import com.gp6.service.impl.CsvOutputGenerator;
public class SpringTest02 {
/**
* @param args
*/
public static void main(String[] args) {
IOutputGenerator output = new CsvOutputGenerator();
output.generateOutput();
}
}
存在的問題:
以這種方式,這個問題是“output”緊密到CsvOutputGenerator耦合,輸出生成的每一個變化可能涉及程式碼變化。如果此程式碼分散在你的專案中,輸出生成的每一次變化都會讓你受苦。
- 方法2 : 用輔助類呼叫它
可能想建立一個輔助類將所有輸出實現在類的內部。
package com.gp6.help;
import com.gp6.service.IOutputGenerator;
import com.gp6.service.impl.CsvOutputGenerator;
public class OutputHelper {
IOutputGenerator outputGenerator;
public OutputHelper(){
outputGenerator = new CsvOutputGenerator();
}
public void generateOutput(){
outputGenerator.generateOutput();
}
}
通過輔助類呼叫它
package com.gp6.test;
import com.gp6.help.OutputHelper;
public class SpringTest02 {
/**
* @param args
*/
public static void main(String[] args) {
OutputHelper output = new OutputHelper();
output.generateOutput();
}
}
存在問題:
這看起來比之前的更優雅,只需要管理一個輔助類,但是輔助類仍是緊耦合 CsvOutputGenerator,輸出生成的每一個變化仍然涉及小的程式碼更改。
- 方法3 – Spring
在這種情況下,Spring 依賴注入(DI)是一個不錯的選擇。Spring 可以讓輸出生成鬆散的耦合到輸出發生器。OutputHelper類更小的修改。
OutputHelper.java
package com.gp6.help;
import com.gp6.service.IOutputGenerator;
public class OutputHelper {
IOutputGenerator outputGenerator;
public void generateOutput(){
outputGenerator.generateOutput();
}
public void setOutputGenerator(IOutputGenerator outputGenerator){
this.outputGenerator = outputGenerator;
}
}
建立一個 Spring bean 的配置檔案,並在這裡宣告所有的Java物件的依賴。
Spring01.xml
<?xml version="1.0" encoding="UTF-8"?>
<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.gp6.help.OutputHelper">
<property name="outputGenerator" ref="CsvOutputGenerator" />
</bean>
<bean id="CsvOutputGenerator" class="com.gp6.service.impl.CsvOutputGenerator" />
<bean id="JsonOutputGenerator" class="com.gp6.service.impl.JsonOutputGenerator" />
</beans>
通過Spring來呼叫它
package com.gp6.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.gp6.help.OutputHelper;
public class SpringTest02 {
/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext(new String[] {"Spring01.xml"});
OutputHelper output = (OutputHelper)context.getBean("OutputHelper");
output.generateOutput();
}
}
現在,只需要改變 Spring XML 檔案使用不同的輸出生成器。只修改 Spring XML 檔案而不需要無碼修改,這意味著更少的錯誤。
結論
有了Spring框架 - 這種依賴注入(DI)為物件的依賴關係管理有用的特性,使大型Java專案開發管理中更優雅的,高度靈活和便於維護。
相關文章
- MEF實現設計上的“鬆耦合”(2)
- Axis2+spring整合例項Spring
- Spring ScheduleTask和bean2次例項化問題SpringBean
- MEF實現設計上的“鬆耦合”(1)
- 程式碼大全中保持鬆散耦合的demo
- 2.Vue例項Vue
- Smarty例項教程(2)
- 2 Day DBA-管理Oracle例項-Oracle例項和例項管理概覽Oracle
- 在ECS上輕鬆搭建RDS的從例項
- struts2 與spring 相結合做出的登陸例項Spring
- Spring Boot 整合 FreeMarker 例項Spring Boot
- spring+zookeeper+dubbo使用例項Spring
- shell指令碼例項(2)指令碼
- oracle create function 例項2OracleFunction
- Spring IOC 為什麼能降低耦合Spring
- Spring中用註解建立bean例項SpringBean
- spring boot +WebSocket 廣播式例項Spring BootWeb
- Spring事務管理(詳解+例項)Spring
- Spring MVC之例項初體驗SpringMVC
- spring4簡單例項(1)Spring單例
- Spring使用實現類注入為什麼會導致高耦合度(舉例)Spring
- 治理、質量和管理:讓鬆散耦合執行起來
- Spring mvc+struts2+Hibernate整合例項程式碼(註解詳解)SpringMVC
- 11GR2 Active Duplicate過程(單例項對單例項)單例
- XML輕鬆學習手冊(6)XML例項解析(轉)XML
- spring整合quartz的叢集配置例項Springquartz
- Mybatis原始碼解析2—— 例項搭建MyBatis原始碼
- 以例項說明 OAuth2OAuth
- 【spring原始碼學習】Spring @PostConstruct和@PreDestroy例項Spring原始碼Struct
- 2 Day DBA-管理Oracle例項-關於例項的啟動和關閉-關於例項關閉Oracle
- 2 Day DBA-管理Oracle例項-關於例項的啟動和關閉-關於例項啟動Oracle
- 2 Day DBA-管理Oracle例項-關於例項記憶體結構Oracle記憶體
- ssh框架搭建Struts2 06+spring2 5+hibernate3 2整合例項程式碼教程步驟框架Spring
- Spring 原始碼學習 - 單例bean的例項化過程Spring原始碼單例Bean
- 【spring 原始碼】IOC 之bean例項的建立Spring原始碼Bean
- Spring 原始碼分析之 bean 例項化原理Spring原始碼Bean
- Spring中Bean的例項化詳細流程SpringBean
- ActiveMQ的使用及整合spring的使用例項MQSpring