我在控制台应用程序中使用C#和Spring Net 1.3.2。
我得到了: 一个app.cfg 一个spring-context.xml 一个environnement.xml文件,它根据应用程序运行的位置包含特定的变量值:一个用于生产的文件夹,一个用于qa,一个用于测试。
我想要实现的目标: 在我的shell(windows)中,在使用foo.bat启动应用程序之前,我这样做: 设置环境=" qa"
当Spring加载上下文时,它会选择环境var(比如qa)中包含的值,并加载正确的文件:从而替换:configuration / {environment} /vars.xml
by configuration / qa / vars.xml。
在我的spring-context.xml文件中,我得到了这样的对象:value = $ {connectionString.DB1}"其中值在每个vars.xml文件中定义(记住,一个用于prod,一个用于qa ...)。
目前,我无法替换$ {environment}变量。所以我通过使用System.Environment.GetEnvironmentVariable(" environnement")获取$ {environment}的值来以编程方式完成它。并使用Path.Combine,自己加载两个上下文:
reader.LoadObjectDefinitions(envPath); reader.LoadObjectDefinitions("配置/普通/ springContext.xml&#34);
但是: 我想通过配置来实现。 我一直在玩(没有运气):
<object type="Spring.Objects.Factory.Config.VariablePlaceholderConfigurer, Spring.Core">
<property name="VariableSources">
<list>
<object type="Spring.Objects.Factory.Config.EnvironmentVariableSource, Spring.Core"/>
</list>
</property>
</object>
<object name="appConfigPropertyHolder"
type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core">
<property name="EnvironmentVariableMode" value="Override"/>
</object>
有什么想法吗?
答案 0 :(得分:1)
好的,经过大量研究,它确实有效!
<object type="Spring.Objects.Factory.Config.VariablePlaceholderConfigurer, Spring.Core">
<property name="VariableSources">
<list>
<object type="Spring.Objects.Factory.Config.EnvironmentVariableSource, Spring.Core"/>
<object type="Spring.Objects.Factory.Config.PropertyFileVariableSource, Spring.Core">
<property name="Location" value="${root.config}/envars.properties" />
<property name="IgnoreMissingResources" value="false"/>
</object>
</list>
</property>
</object>
属性文件的路径取决于环境变量。 变量将替换为从属性文件中获取的值。
我部署了一个包含4个环境属性文件的包+文件夹 我相应地设置了我的env var。 无需混淆app.config或多个Spring配置文件。