我已经在一个可以部署在多个位置的 webapp 上工作了一段时间:它被设计为在许多主机上实例化。完全可以做到这一点,但很难。编写代码以使其能够以这种方式工作需要非常小心。
这样做的关键是使您对事物的所有依赖关系都明确,并且您的所有配置都由可以在安装期间设置的属性驱动。春天让这变得容易多了!特别是,org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer
该类允许您使用 servlet 上下文作为值的来源,然后您可以将其注入到您的 bean 中(例如,通过@Value
注释)。自己做这一切要困难得多。这是我使用的(简化版本):
<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
<property name="contextOverride" value="true" />
<property name="location" value="/WEB-INF/default.properties" />
</bean>
这会将 servlet 上下文的属性合并到您在 web 应用程序中作为默认值提供的属性之上(如果大多数事情大部分时间都不需要修改,这绝对是一个好习惯),然后使用它们来定义属性。foo.bar
然后我使用占位符将配置属性(例如, )应用于 bean 属性,如下所示:
@Value("${foo.bar}")
public void setFoobar(String foobar) { ... }
以这种方式配置的内容包括数据库配置、包含无法在 webapp 中打包的内容的文件的绝对位置等。您必须使用您对应用程序域的技能和知识来确定需要做什么列出。
其他关键原则是尽可能多地保留在 webapp 内部(从而减少部署者搞砸它的机会),非常小心地记录所有内容,并尝试使用多个 servlet 容器。请记住,部署您的 web 应用程序的人无法访问您的想法内容:您必须将其写下来并准确告诉他们要做什么。(太多的说明处于“点击这个,点击那个,奇迹发生”的级别,但这些说明很糟糕,因为确切的方法会随着时间的推移而变化:说明为什么会更有帮助,因为它更便携。)