我正在尝试更改一些遗留代码以将 DI 与 Spring 框架一起使用。我有一个具体的案例,我想知道哪个是最合适的实现方式。
它是一个java桌面应用程序。有一个 DataManager 接口用于从数据存储中查询/更改数据。目前只有一种实现使用 XML 文件进行存储,但将来可以添加 SQL 实现。同样对于单元测试,我可能需要模拟它。
目前,需要数据管理器的每个代码和平都通过使用工厂来检索它。这是工厂的源代码:
public class DataManagerFactory
{
private static DataManagerIfc dataManager;
public static DataManagerIfc getInstance()
{
// Let assume synchronization is not needed
if(dataManager == null)
dataManager = new XMLFileDataManager();
return dataManager;
}
}
现在我看到了 3 种将应用程序更改为使用 DI 和 Spring 的方法。
I. 只在工厂中注入依赖,不要更改任何其他代码。
这是新代码:
public class DataManagerFactory
{
private DataManagerIfc dataManager;
public DataManagerFactory(DataManagerIfc dataManager)
{
this.dataManager = dataManager;
}
public DataManagerIfc getDataManager()
{
return dataManager;
}
public static DataManagerIfc getInstance()
{
return getFactoryInstance().getDataManager();
}
public static DataManagerFactory getFactoryInstance()
{
ApplicationContext context =
new ClassPathXmlApplicationContext(new String[] {"com/mypackage/SpringConfig.xml"});
return context.getBean(DataManagerFactory.class);
}
}
以及带有 bean 描述的 XML:
<bean id="dataManagerFactory"
class="com.mypackage.DataManagerFactory">
<constructor-arg ref="xmlFileDataManager"/>
</bean>
<bean id="xmlFileDataManager"
class="com.mypackage.datamanagers.xmlfiledatamanager.XMLFileDataManager">
</bean>
二、更改使用数据管理器的每个类,使其通过构造函数并将其存储为类变量。仅为创建链开始的“根”类创建 Spring bean 定义。
三、同Ⅱ。但是对于每个使用数据管理器的类,创建一个 Spring bean 定义并使用 Spring Ioc 容器实例化每个这样的类。
由于我是 DI 概念的新手,我会很感激每一个建议,什么是正确的和“最佳实践”的解决方案。提前谢谢了。