鍍金池/ 教程/ Java/ Spring松耦合的實(shí)例
Spring EL hello world實(shí)例
Spring使用@Autowired注解自動(dòng)裝配
MapFactoryBean實(shí)例
Bean InitializingBean和DisposableBean實(shí)例
Spring使用@Required注解依賴(lài)檢查
安裝Spring工具套件到Eclipse
CGLIB is required to process @Configuration classes
Spring EL Arrays, Lists, Maps實(shí)例
Spring由類(lèi)型(Type)自動(dòng)裝配
Spring在bean配置文件中定義電子郵件模板
Spring發(fā)送帶附件郵件
ListFactoryBean實(shí)例
Struts 2 + Spring + Hibernate集成實(shí)例
Spring bean引用實(shí)例
Spring JdbcTemplate batchUpdate()實(shí)例
Spring SetFactoryBean實(shí)例
Spring通過(guò)setter方法注入
Spring EL hello world實(shí)例
在bean配置文件中的電子郵件模板
Spring發(fā)送帶附件的Email
Spring EL 方法調(diào)用實(shí)例
Spring自動(dòng)裝配Beans
Spring由構(gòu)造方法自動(dòng)裝配
Spring使用@Required注解依賴(lài)檢查
Spring SimpleJdbcTemplate查詢(xún)示例
自定義@Required-style注解
Spring+JDBC實(shí)例
Spring EL三元運(yùn)算(if-then-else)實(shí)例
JdbcTemplate+JdbcDaoSupport實(shí)例
Spring自動(dòng)掃描組件
Spring EL方法調(diào)用實(shí)例
Spring自動(dòng)裝配Beans
Spring EL bean引用實(shí)例
Spring依賴(lài)注入(DI)
Spring EL Lists,Maps實(shí)例
Spring通過(guò)構(gòu)造方法依賴(lài)注入
通過(guò)MailSender發(fā)送電子郵件
Spring AOP實(shí)例(Pointcut, Advisor)
Spring EL運(yùn)算符實(shí)例
Spring JavaConfig實(shí)例
Spring依賴(lài)注入 (DI)
Spring EL bean引用實(shí)例
Spring由AutoDetect自動(dòng)裝配
Spring由構(gòu)造方法自動(dòng)裝配
Spring JdbcTemplate查詢(xún)實(shí)例
Spring SimpleJdbcTemplate batchUpdate()實(shí)例
Spring+JDBC實(shí)例
如何注入值到Spring bean屬性
Spring SimpleJdbcTemplate類(lèi)命名參數(shù)實(shí)例
Spring PropertyPlaceholderConfigurer實(shí)例
Spring JdbcTemplate batchUpdate() 實(shí)例
Spring EL與ExpressionParser測(cè)試
Spring內(nèi)部Bean實(shí)例
加載多個(gè)Spring bean配置文件
Spring+Hibernate+MySql實(shí)例(注解)
Spring AOP+AspectJ 在XML配置實(shí)例
Spring自動(dòng)代理創(chuàng)建者實(shí)例
Spring EL正則表達(dá)式實(shí)例
測(cè)試 Spring EL與ExpressionParser
java.lang.ClassNotFoundException: org.exolab.castor.xml.XMLExcep
Spring PropertyPlaceholderConfigurer實(shí)例
Spring bean配置繼承
Spring使用Setter依賴(lài)注入
Spring自動(dòng)裝配@Qualifier實(shí)例
Spring依賴(lài)檢查
Spring hello world實(shí)例
Spring依賴(lài)注入servlet會(huì)話(huà)監(jiān)聽(tīng)器
Spring自定義@Required-style注解
Spring bean作用域
Spring AOP攔截器的序列
注入值到Spring Bean的屬性
Spring JdbcTemplate+JdbcDaoSupport實(shí)例
Spring教程
Spring自動(dòng)裝配@Qualifier實(shí)例
Spring MapFactoryBean例子
Spring Bean作用域?qū)嵗?/span>
Cannot proxy target class because CGLIB2 is not available
Spring AOP攔截器的順序
Spring集合(List, Set, Map, and Properties)實(shí)例
Spring SimpleJdbcTemplate類(lèi)命名參數(shù)實(shí)例
Spring通過(guò)自動(dòng)檢測(cè)自動(dòng)裝配
Spring+Hibernate+MySql實(shí)例
Spring JavaConfig @Import實(shí)例
訪(fǎng)問(wèn)MessageSource的bean(MessageSourceAware)
Spring JdbcTemplate查詢(xún)實(shí)例
Spring JavaConfig @Import實(shí)例
Spring Object/XML映射實(shí)例
Spring Bean引用例子
Spring AOP+AspectJ注解實(shí)例
java.lang.ClassNotFoundException: org.apache.xml.serialize.XMLSe
Spring依賴(lài)檢查
Spring JavaConfig實(shí)例
Spring AOP+AspectJ注解實(shí)例
Spring bean配置繼承
Spring自動(dòng)掃描組件
自動(dòng)代理創(chuàng)建者實(shí)例
Spring Bean init-method 和 destroy-method實(shí)例
Spring通過(guò)構(gòu)造方法注入
Spring過(guò)濾器組件自動(dòng)掃描
Spring構(gòu)造方法注入類(lèi)型歧義
Spring+JDBC實(shí)例
Spring EL正則表達(dá)式實(shí)例
Spring通過(guò)Gmail SMTP服務(wù)器MailSender發(fā)送電子郵件
Spring AOP+AspectJ在XML配置實(shí)例
SetFactoryBean實(shí)例
Spring注入日期到bean屬性-CustomDateEditor
Spring AOP通知實(shí)例 – Advice
Spring使用@Autowired注解自動(dòng)裝配
Spring AOP實(shí)例(Pointcut,Advisor)
Spring AOP在Hibernate的事務(wù)管理
Spring初學(xué)快速入門(mén)
Spring內(nèi)部bean實(shí)例
Spring bean加載多個(gè)配置文件
Spring + Hibernate+ MySql注解實(shí)例
Spring @PostConstruct和@PreDestroy實(shí)例
Spring依賴(lài)注入servlet會(huì)話(huà)監(jiān)聽(tīng)器
Spring ListFactoryBean實(shí)例
Spring松耦合的實(shí)例
Spring過(guò)濾器組件自動(dòng)掃描
Spring按名稱(chēng)(Name)自動(dòng)裝配
Spring AOP通知實(shí)例(Advice)
Spring AOP在Hibernate事務(wù)管理
Bean init-method和destroy-method實(shí)例
Spring EL操作符實(shí)例
Spring注入日期到bean屬性(CustomDateEditor)
資源加載程序的getResource()示例
Bean @PostConstruct和@PreDestroy實(shí)例
Struts2+Spring集成實(shí)例
Spring集合 (List,Set,Map,Properties) 實(shí)例
Spring按類(lèi)型(Type)自動(dòng)裝配
Spring由名稱(chēng)(Name)自動(dòng)裝配
Spring SimpleJdbcTemplate batchUpdate()實(shí)例
Spring hello world實(shí)例
Spring Bean InitializingBean和DisposableBean實(shí)例
Spring構(gòu)造方法注入類(lèi)型歧義
Spring EL三元操作符(if-then-else)實(shí)例
Spring+Hibernate+MySql實(shí)例
Spring松耦合實(shí)例

Spring松耦合的實(shí)例

面向?qū)ο蟮母拍?,是一個(gè)很好的設(shè)計(jì)來(lái)打破系統(tǒng)進(jìn)入一個(gè)組可重用的對(duì)象。然而,當(dāng)系統(tǒng)變大,尤其是在Java項(xiàng)目,龐大的對(duì)象依賴(lài)關(guān)系將一直緊密耦合引起對(duì)象難以管理或修改。在這種情況下,可以使用Spring框架作為一個(gè)核心模塊輕松高效地管理所有的對(duì)象依賴(lài)。

輸出生成器的例子

讓我們來(lái)看一個(gè)例子,假設(shè)你的項(xiàng)目有一個(gè)函數(shù)輸出的內(nèi)容,以CSV或JSON格式。您的代碼可能看起來(lái)像下面的例子:

File : IOutputGenerator.java – 輸出生成器接口

package com.yiibai.output;

public interface IOutputGenerator
{
	public void generateOutput();
}

File : CsvOutputGenerator.java – 一個(gè)CSV輸出生成器用來(lái)實(shí)現(xiàn)IOutputGenerator接口。

package com.yiibai.output.impl;

import com.yiibai.output.IOutputGenerator;

public class CsvOutputGenerator implements IOutputGenerator
{
	public void generateOutput(){
		System.out.println("Csv Output Generator");
	}
}

File : JsonOutputGenerator.java – 一個(gè)JSON輸出生成器用來(lái)實(shí)現(xiàn)IOutputGenerator接口。

package com.yiibai.output.impl;

import com.yiibai.output.IOutputGenerator;

public class JsonOutputGenerator implements IOutputGenerator
{
	public void generateOutput(){
		System.out.println("Json Output Generator");
	}
}
有幾個(gè)方法來(lái)調(diào)用IOutputGenerator,以及如何使用 Spring 來(lái)避免對(duì)象相互結(jié)合緊密。

1. 方法1 – 直接調(diào)用

正常的方式,直接調(diào)用它。
package com.yiibai.common;

import com.yiibai.output.IOutputGenerator;
import com.yiibai.output.impl.CsvOutputGenerator;

public class App 
{
    public static void main( String[] args )
    {
    	IOutputGenerator output = new CsvOutputGenerator();
    	output.generateOutput();
    }
}

存在問(wèn)題

以這種方式,這個(gè)問(wèn)題是“output”緊密到CsvOutputGenerator耦合,輸出生成的每一個(gè)變化可能涉及代碼變化。如果此代碼分散在你的項(xiàng)目中,輸出生成的每一次變化都會(huì)讓你受苦。

方法2 – 用輔助類(lèi)調(diào)用它

可能想創(chuàng)建一個(gè)輔助類(lèi)將所有輸出實(shí)現(xiàn)在類(lèi)的內(nèi)部。
package com.yiibai.output;

import com.yiibai.output.IOutputGenerator;
import com.yiibai.output.impl.CsvOutputGenerator;

public class OutputHelper
{
	IOutputGenerator outputGenerator;
	
	public OutputHelper(){
		outputGenerator = new CsvOutputGenerator();
	}
	
	public void generateOutput(){
		outputGenerator.generateOutput();
	}
	
}
通過(guò)輔助類(lèi)調(diào)用它
package com.yiibai.common;

import com.yiibai.output.OutputHelper;

public class App 
{
    public static void main( String[] args )
    {
    	OutputHelper output = new OutputHelper();
    	output.generateOutput(); 
    }
}

存在問(wèn)題

這看起來(lái)比之前的更優(yōu)雅,只需要管理一個(gè)輔助類(lèi),但是輔助類(lèi)仍是緊耦合 CsvOutputGenerator,輸出生成的每一個(gè)變化仍然涉及小的代碼更改。

方法3 – Spring

在這種情況下,Spring 依賴(lài)注入(DI)是一個(gè)不錯(cuò)的選擇。Spring 可以讓輸出生成松散的耦合到輸出發(fā)生器。
OutputHelper類(lèi)更小的修改。
package com.yiibai.output;

import com.yiibai.output.IOutputGenerator;

public class OutputHelper
{
	IOutputGenerator outputGenerator;
	
	public void generateOutput(){
		outputGenerator.generateOutput();
	}
	
	public void setOutputGenerator(IOutputGenerator outputGenerator){
		this.outputGenerator = outputGenerator;
	}
}
創(chuàng)建一個(gè) Spring bean 的配置文件,并在這里聲明所有的Java對(duì)象的依賴(lài)。
<!-- 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.yiibai.output.OutputHelper">
		<property name="outputGenerator" ref="CsvOutputGenerator" />
	</bean>
	
	<bean id="CsvOutputGenerator" class="com.yiibai.output.impl.CsvOutputGenerator" />
	<bean id="JsonOutputGenerator" class="com.yiibai.output.impl.JsonOutputGenerator" />
		
</beans>

通過(guò)Spring來(lái)調(diào)用它

package com.yiibai.common;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.yiibai.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();
    	  
    }
}
現(xiàn)在,只需要改變 Spring XML 文件使用不同的輸出生成器。只修改 Spring XML 文件而不需要無(wú)碼修改,這意味著更少的錯(cuò)誤。

結(jié)論

有了Spring框架 - 這種依賴(lài)注入(DI)為對(duì)象的依賴(lài)關(guān)系管理有用的特性,使大型Java項(xiàng)目開(kāi)發(fā)管理中更優(yōu)雅的,高度靈活和便于維護(hù)。


上一篇:Spring教程下一篇:Spring+JDBC實(shí)例