想象一下,我们有一个java包。这个包可以在任何地方使用。但是,此程序包中有一些代码依赖于上下文。例如,如果使用此包的应用程序是Web应用程序,我们需要通过调用函数执行某些任务,如果应用程序是控制台应用程序,则通过调用相同的函数执行其他任务。
以下是我的问题:
在java中,如果应用程序是作为Web应用程序或控制台运行,我们可以检测到代码中的任何方法吗? 我感谢任何帮助:)
作为一个真实的例子,我们加载属性文件的方式对于Web和控制台应用程序是不同的。
对于网络应用程序,我们可能使用this.getClass().getClassLoader().getResourceAsStream(url)
,对于控制台应用,我们使用new FileInputStream(physical path)
。
答案 0 :(得分:2)
最好在某处设置构建属性,而不是尝试检测应用程序类型,因为我认为没有可靠的方法来实现这一点。
此外,您不应该尝试检测应用程序类型,因为您的视图层(Web,桌面或控制台)应该可以根据现代架构原则轻松互换。
回应你的上一条评论。
正如user384706所说DI是这里IMO的正确选择。 我将举一个春天的例子。
在您的控制台和网络应用程序部分中,您可以:
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
}
}
对于loadProperties()
的不同实现,您的PropertyProvider
方法将被覆盖。
在你的春天,你可以:
<bean id="consolePropertyProvider" class="com.company.ConsolePropertyProvider"/>
<bean id="myConsoleService" class="com.company.MyConsoleService">
<property name="propertyProvider" ref="consolePropertyProvider" />
</bean>
您WebService
和WebPropertyProvider
的相同豆类定义。
答案 1 :(得分:1)
只需使用dependency injection
只需放置所有适当的参数,通过设置器配置库,然后让容器或应用程序使用DI进行相应配置
所以你不需要任何恕我直言的检查
答案 2 :(得分:0)
J2EE方式。如果您的包在Web应用程序中使用,那么我假设您在J2EE容器中,那么您可以在部署时在命名中添加Reference。您还可以注册可以侦听此引用更改的MDB,并在运行时修改代码的行为。很好吧?
您可以传递调用者上下文的其他标准方法是通过参数化工厂或通过属性。
一种非标准方式 - 有趣的是get the stack trace并查找来电者是谁或寻找j2ee背景等。