面向对象的概念是一个很好的设计,可以将您的系统分为一组可重用的对象。 但是,当系统变得越来越大时,尤其是在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/