繁体   English   中英

如何在Java代码中检测应用程序类型

[英]How to detect application type in Java code

假设我们有一个Java包。 该软件包可在任何地方使用。 但是,此程序包中有一些代码取决于上下文。 例如,如果使用此程序包的应用程序是一个Web应用程序,我们需要通过调用一个函数来执行某些任务,而如果该应用程序是一个控制台应用程序,则需要通过调用相同的函数来执行其他任务。

这是我的问题:

Java中是否有任何方法可以在代码内检测到应用程序是作为Web应用程序还是作为控制台运行的? 我感谢任何帮助:)

作为一个真实的例子,Web和控制台应用程序加载属性文件的方式是不同的。

对于Web应用程序,我们可能使用this.getClass().getClassLoader().getResourceAsStream(url) ;对于控制台应用程序,我们可能使用new FileInputStream(physical path)

最好在某个地方设置一个build属性,而不是尝试检测您的应用程序类型,因为我认为没有可靠的方法可以做到这一点。

此外,您不应尝试检测应用程序类型,因为根据现代体系结构原理,您的视图层(Web,桌面或控制台)应易于互换。


回应您的最后评论。

正如用户384706所说,在IMO中DI是正确的选择。 我将以春天为例。

在控制台和Web应用程序部分中,您都可以:

public class WebOrConsoleServiceImpl {

    private PropertyProvider propertyProvider = new NullPropertyProvider();

    // and

    public void setPropertyProvider(PropertyProvider impl) {
        this.propertyProvider = impl;
    }

    // and in your service logic

    public void logic() {

        final Properties props = propertyProvider.loadProperties();
        // do stuff            
    }
}

对于您的PropertyProvider不同实现,将覆盖您的loadProperties()方法。

在春季,您可以:

<bean id="consolePropertyProvider" class="com.company.ConsolePropertyProvider"/>

<bean id="myConsoleService" class="com.company.MyConsoleService">
    <property name="propertyProvider" ref="consolePropertyProvider" />
</bean>

还有您的WebServiceWebPropertyProvider的同一对Bean定义。

只需使用依赖注入
只需放置所有适当的参数即可通过设置器来配置您的库,并让容器或应用程序使用DI相应地对其进行配置。
因此,您无需检查哪种恕我直言是不好的方法

  1. J2EE方式。 如果您的软件包是在Web应用程序中使用的,那么我假设您在J2EE容器中,则可以在部署时在命名中添加一个Reference 您还可以注册一个MDB,该MDB可以侦听对此引用的更改并在运行时修改代码的行为。 甜美的吧?

  2. 传递调用者上下文的其他标准方法是通过参数化的Factory或属性。

  3. 一种非标准的方法-有趣的是获取堆栈跟踪并查找调用者是谁,或查找j2ee上下文等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM