弹簧松耦合示例

面向对象的概念是一个很好的设计,可以将您的系统分为一组可重用的对象。 但是,当系统变得越来越大时,尤其是在Java项目中,巨大的对象依赖关系将始终紧密耦合,从而导致对象很难管理或修改。 在这种情况下,您可以使用Spring框架充当中央模块,轻松高效地管理所有对象依赖项。

输出发生器示例

让我们看一个示例,假设您的项目具有将内容输出为Csv或Json格式的功能。 您的代码可能类似于以下示例:

文件: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");
	}
}

有两种方法可以调用IOutputGenerator,以及如何使用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();
    }
}

问题
这样,问题是“输出”与CsvOutputGenerator紧密耦合,输出生成器的每次更改都可能涉及代码更改。 如果此代码散布在您的整个项目中,则输出生成器的每次更改都会使您遭受重创。

方法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)是一个不错的选择。 弹簧可以使您的输出发电机松散地耦合到输出发电机。

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>

通过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();
    	  
    }
}

现在,您只需要为其他输出生成器更改Spring XML文件即可。 当输出更改时,您只需要修改Spring XML文件,而无需更改代码,这意味着更少的错误。

结论

使用Spring框架-依赖注入(DI)是对象依赖管理的有用功能,它美观大方,高度灵活并易于维护,特别是在大型Java项目中。

翻译自: https://mkyong.com/spring/spring-loosely-coupled-example/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值