【问题标题】:Java package import depending on configJava包导入取决于配置
【发布时间】:2013-03-09 11:57:09
【问题描述】:

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

【问题讨论】:

  • Java 中没有条件包导入。根据您的问题描述,我建议您开始阅读控制反转 (IOC)。

标签: java web-applications configuration-files layer


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    但是,您可以根据您的配置使用不同的库。例如,如果您有 2 个不同的接口 Foo 实现:FooOneFooTwo 位于不同的 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();
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      Why use JNDI for data sources

      【讨论】:

        猜你喜欢
        • 2016-08-02
        • 1970-01-01
        • 2019-12-15
        • 1970-01-01
        • 2012-04-12
        • 1970-01-01
        • 1970-01-01
        • 2015-08-27
        • 2016-10-17
        相关资源
        最近更新 更多