Java Spring MVC具有多种配置
对于我的SpringMVC应用程序,我创建了几种类型的配置(单元测试、集成、qa、生产)。所有配置都在一个war文件中,因此我只创建一种类型的应用程序。采用哪种配置应由运行应用程序的服务器决定 为了决定应该使用哪种配置,我必须查看一个文件。之后,我可以决定SpringMVC应该使用哪种配置 目前,按照惯例,始终使用-servlet.xml。有没有一种方法可以动态决定采用哪种配置 问候,,Java Spring MVC具有多种配置,java,spring,testing,spring-mvc,Java,Spring,Testing,Spring Mvc,对于我的SpringMVC应用程序,我创建了几种类型的配置(单元测试、集成、qa、生产)。所有配置都在一个war文件中,因此我只创建一种类型的应用程序。采用哪种配置应由运行应用程序的服务器决定 为了决定应该使用哪种配置,我必须查看一个文件。之后,我可以决定SpringMVC应该使用哪种配置 目前,按照惯例,始终使用-servlet.xml。有没有一种方法可以动态决定采用哪种配置 问候,, Michael这是我使用的解决方案。它工作得很好: 将配置差异放在属性文件中 保留一个带有占位符的Spri
Michael这是我使用的解决方案。它工作得很好:
- 将配置差异放在属性文件中
- 保留一个带有占位符的SpringXML
- 使用PropertyPlaceHolderConfigure设置属性
- PropertyPlaceHolderConfigure可以使用系统属性解析要加载的属性文件的名称
- 在初始化PropertyPlaceHolderConfigure之前,使用环境的名称设置一个系统属性(可以在从文件中读取值的bean中执行此操作)
无需等待Spring3.1,您现在就可以在3.0中使用此解决方案。这是我使用的一个解决方案。它工作得很好:
- 将配置差异放在属性文件中
- 保留一个带有占位符的SpringXML
- 使用PropertyPlaceHolderConfigure设置属性
- PropertyPlaceHolderConfigure可以使用系统属性解析要加载的属性文件的名称
- 在初始化PropertyPlaceHolderConfigure之前,使用环境的名称设置一个系统属性(可以在从文件中读取值的bean中执行此操作)
无需等待Spring3.1,您现在可以在3.0中使用此解决方案。我有相同的设置,但我使用maven以不同的方式构建战争。我在上下文中使用PropertyPlaceHolderConfiguration:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="classpath:datasource.properties" ignore-unresolvable="true" />
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driver}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}" />
<!--other beans-->
</beans>
然后在我的Maven pom中,我使用构建概要文件根据Maven命令中的参数标志复制环境文件夹中的任何内容:
<profiles>
<profile>
<id>environment</id>
<activation>
<property>
<name>environment</name>
</property>
</activation>
<build>
<resources>
<resource>
<directory>
src/main/environments/${environment}
</directory>
</resource>
</resources>
<!-- other build config and plugins -->
将dev datasource.properties复制到war我有相同的设置,但我使用maven以不同的方式构建war。我在上下文中使用PropertyPlaceHolderConfiguration:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="classpath:datasource.properties" ignore-unresolvable="true" />
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driver}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}" />
<!--other beans-->
</beans>
然后在我的Maven pom中,我使用构建概要文件根据Maven命令中的参数标志复制环境文件夹中的任何内容:
<profiles>
<profile>
<id>environment</id>
<activation>
<property>
<name>environment</name>
</property>
</activation>
<build>
<resources>
<resource>
<directory>
src/main/environments/${environment}
</directory>
</resource>
</resources>
<!-- other build config and plugins -->
我会将dev datasource.properties复制到war中,毕竟我使用的是PropertyPlaceHolderConfigure,但与Axel提到的略有不同:我只从配置中加载一个属性,并使用它来确定要使用哪个导入。因为我不能使用文件来存储实例类型,但必须使用环境变量
<bean id="propertyConfigurerOne" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
<import resource="classpath:/web${vabse.Environment}.xml"/>
毕竟,我使用的是PropertyPlaceHolderConfigure,但与Axel提到的略有不同:我只从配置中加载一个属性,并使用它来确定要使用哪个导入。因为我不能使用文件来存储实例类型,但必须使用环境变量
<bean id="propertyConfigurerOne" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
<import resource="classpath:/web${vabse.Environment}.xml"/>
下一版本的spring有一个关于多个配置的计划功能。这背后更一般的问题实际上是:如何在一个spring应用程序中处理多个环境的配置?下一版本的spring有一个关于多个配置的计划功能。后面更一般的问题是这实际上是:如何在Spring应用程序中处理多个环境的配置?嗨,Axel,谢谢你的快速回复。据我所知,使用PropertyPlaceHolderConfigure可以只配置属性。但我还想配置bean(在内存数据库中而不是在真实数据库中),它仍然可以工作。使用属性作为您所依赖的bean的名称。如果有许多引用,可以使用别名及其指向的bean名称的属性。如果将bean标记为lazy init=true,则只有在当前环境中使用的bean才会被初始化。请参阅此处,以了解根据env加载proerty文件的优雅方法:@Pablojim是的,这正是我的看法。嗨,Axel,谢谢你的快速回复。据我所知,使用PropertyPlaceHolderConfigure可以只配置属性。但我还想配置bean(在内存数据库中而不是在真实数据库中),它仍然可以工作。使用属性作为您所依赖的bean的名称。如果有许多引用,可以使用别名及其指向的bean名称的属性。如果将bean标记为lazy init=true,则只有在当前环境中使用的bean才会被初始化。请参阅此处,以了解根据env加载proerty文件的优雅方法:@Pablojim是的,这正是我的看法。这是我的第一个计划。但我要将我的应用程序存储到vm映像中,并将该映像部署到我的服务器上。因此,我需要我的应用程序工作,因为每种类型的实例为每种环境构建不同的工件都有点麻烦-请参阅我的答案,以允许每个环境动态加载属性:我支持Pablojim。工件/环境是一种(不幸的是广泛存在的)反模式。它破坏了测试的可信度,因为您基本上在生产中部署了与您测试的产品不同的工件。这是我的第一个计划。但我要将我的应用程序存储到vm映像中,并将该映像部署到我的服务器上。因此,我需要我的应用程序工作,因为每种类型的实例为每种环境构建不同的工件都有点麻烦-请参阅我的答案,以允许每个环境动态加载属性:我支持Pablojim。工件/环境是一种(不幸的是广泛存在的)反模式。它破坏了测试的可信度,因为您基本上部署了一个diff