我有一个设计为三层架构的Java Web应用程序。目前我有两个不同的数据库层。我的所有数据访问层代码都集中在一个包中。所需的数据层在配置文件中定义。因此,应根据配置文件导入另一个包。两个数据层都通过DBfacade对象与业务层进行通信。是否可以决定应该导入哪个软件包,还是应该重命名我的DBfacades,以便我有2个不同的名称并导入这两个软件包?
答案 0 :(得分:2)
如果您在单独的包中创建具有相同名称和相同方法签名的2个类,并且您通过更改导入在这些实现之间切换,那么您使用非常糟糕的设计。非常糟糕的设计。
请注意,导入部分仅在编译之前存在。然后你在字节码中有完全限定的引用。
使用接口和实现,在使用IoC或反射的实现之间切换。或者导入两个实现并决定调用哪个实现,但是IoC为您提供了更大的灵活性(例如,无需更改代码即可添加新实现)。
答案 1 :(得分:1)
import
语句本身在编译时处理,因此您无法“根据配置文件导入不同的包”。
但是,根据您的配置,您可以使用不同的库。例如,如果您有两个不同的接口Foo
实现:FooOne
和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();
}
}
答案 2 :(得分:0)
数据层是否依赖于环境?如果是这样,请查看使用JNDI公开数据源。这将允许环境封装低级细节。