3

我有一个设计为三层架构的 Java Web 应用程序。目前我有两个不同的数据库层。我所有的数据访问层代码都集中在一个包中。所需的数据层在配置文件中定义。所以应该根据配置文件导入另一个包。两个数据层都通过 DBfacade 对象与业务层通信。是否可以决定应该导入哪个包,或者我应该重命名我的 DBfacades,以便我有 2 个不同的名称并导入两个包?

4

3 回答 3

2

如果您在不同的包中创建 2 个具有相同名称和相同方法签名的类,并且您正在通过更改导入在此实现之间切换,那么您使用的设计非常糟糕。非常糟糕的设计。

请注意,导入部分仅在编译之前存在。然后你在字节码中有完全限定的引用。

使用接口和实现,使用 IoC 或反射在实现之间切换。或者导入两个实现并通过 if 决定调用哪一个,但 IoC 为您提供了更大的灵活性(例如,无需更改代码即可添加新实现的能力)。

于 2013-03-20T12:18:39.863 回答
1

import语句本身是在编译时处理的,因此您不能“根据配置文件导入不同的包”。

但是,您可以根据您的配置使用不同的库。例如,如果您有 2 个不同的 interface 实现FooFooOne并且FooTwo位于不同的jar文件中,您可以实现工厂FooFactory,该工厂加载从文件中获取配置的实现之一,例如:

public class FooFactory {
    public Foo createFoo() throws Exception{
        Properties props = new Properties();
        props.load("/var/config.properties");
        return Class.forName(props.getProperty("foo.class")).newInstance();
    }
}
于 2013-03-20T12:36:06.073 回答
0

数据层是否依赖于环境?如果是这样,请考虑使用 JNDI 公开数据源。这将允许环境封装低级细节。

请参阅为什么将 JNDI 用于数据源

于 2013-03-20T11:54:01.727 回答