Spring 3.1中的默认configuration文件

在我的应用程序中,我用@Profile("prod")@Profile("demo")注释了bean。 第一个,你可以猜到:)用于连接到生产数据库的bean,第二个注释使用一些假DB( HashMap或其他)的bean,以加快开发速度。

我想要的是默认configuration文件( "prod" ),如果它不被“ 别的东西 ”覆盖,将被永远使用。

完美的是要在我的web.xml

 <context-param> <param-name>spring.profiles.active</param-name> <param-value>prod</param-value> </context-param> 

然后用-Dspring.profiles.active="demo"覆盖它,以便我可以这样做:

 mvn jetty:run -Dspring.profiles.active="demo". 

但可悲的是,这是行不通的。 任何想法我怎么能达到? 在我的所有环境中设置-Dspring.profiles.active="prod"不是一个选项。

我的经验是使用

 @Profile("default") 

如果没有其他configuration文件被标识,这个bean只会被添加到上下文中。 如果您传入其他configuration文件,例如-Dspring.profiles.active="demo" ,则此configuration文件将被忽略。

将您的生产环境定义为web.xml中的默认configuration文件

 <context-param> <param-name>spring.profiles.default</param-name> <param-value>prod</param-value> </context-param> 

如果你想使用不同的configuration文件传递它作为系统属性

 mvn -Dspring.profiles.active="demo" jetty:run 

您也可以考虑删除PRODconfiguration文件,并使用@Profile(“!demo”)

我有同样的问题,但我使用WebApplicationInitializer以编程方式configurationServletContext(Servlet 3.0+)。 所以我做了以下几点:

 public class WebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext sc) throws ServletException { // Create the 'root' Spring application context final AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); // Default active profiles can be overridden by the environment variable 'SPRING_PROFILES_ACTIVE' rootContext.getEnvironment().setDefaultProfiles("prod"); rootContext.register(AppConfig.class); // Manage the lifecycle of the root application context sc.addListener(new ContextLoaderListener(rootContext)); } } 

关于设置默认生产configuration文件已发布@andih

为maven jetty插件设置默认configuration文件最简单的方法是在您的插件configuration中包含以下元素:

 <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <configuration> <systemProperties> <systemProperty> <name>spring.profiles.active</name> <value>demo</value> </systemProperty> </systemProperties> </configuration> </plugin> 

Spring在确定哪些configuration文件处于活动状态时提供了两个独立的属性: 1)spring.profiles.active和2)spring.profiles.default。 如果设置了spring.profiles.active,则其值将确定哪些configuration文件处于活动状态。 但是如果没有设置spring .profiles.active,那么Spring将会看到spring.profiles.default。 如果既没有设置spring.profiles.active也没有设置spring.profiles.default,那么就没有活动的configuration文件,只有那些没有定义在configuration文件中的bean才被创build。没有指定configuration文件的bean属于“默认”configuration文件。

您可以将您的web.xml设置为过滤资源,并通过Mavenconfiguration文件设置中的maven填充此值,即我们所做的。

在pom中过滤所有的资源(如果你没有$ {}标记,你可以做)

 <webResources> <resource> <directory>src/main/webapp</directory> <filtering>true</filtering> </resource> </webResources> 

在web.xml中

 <context-param> <param-name>spring.profiles.active</param-name> <param-value>${spring.prfile}</param-value> </context-param> 

在POM创buildmavenconfiguration文件

 <profiles> <profile> <id>DEFAULT</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <spring.profile>prod</spring.profile> </properties> <profile> <profile> <id>DEMO</id> <properties> <spring.profile>demo</spring.profile> </properties> <profile> </profiles> 

现在你可以使用

 mvn jetty:run -P DEMO 

或者简单地用任何maven命令进行-P DEMO