spring为beans标签提供了profile功能,以便项目的开发和生成环境分离。
01 | < beans xmlns = "http://www.springframework.org/schema/beans" |
02 | xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:context = "http://www.springframework.org/schema/context" |
03 | xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd |
04 | http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> |
06 | < beans profile = "dev,test" > |
07 | < context:property-placeholder location = "classpath:application.properties" /> |
09 | < bean id = "dataSource" class = "com.jolbox.bonecp.BoneCPDataSource" destroy-method = "close" > |
10 | < property name = "driverClass" value = "${db.driver}" /> |
11 | < property name = "jdbcUrl" value = "${db.url}" /> |
12 | < property name = "username" value = "${db.username}" /> |
13 | < property name = "password" value = "${db.password}" /> |
14 | < property name = "idleConnectionTestPeriodInMinutes" value = "60" /> |
15 | < property name = "idleMaxAgeInMinutes" value = "240" /> |
16 | < property name = "maxConnectionsPerPartition" value = "30" /> |
17 | < property name = "minConnectionsPerPartition" value = "10" /> |
18 | < property name = "partitionCount" value = "3" /> |
19 | < property name = "acquireIncrement" value = "5" /> |
20 | < property name = "statementsCacheSize" value = "100" /> |
21 | < property name = "releaseHelperThreads" value = "3" /> |
23 | < beans profile = "production" > |
24 | < context:property-placeholder ignore-resource-not-found = "true" location = "classpath:application.properties,classpath:application-production.properties" /> |
26 | < bean id = "dataSource" class = "org.springframework.jndi.JndiObjectFactoryBean" > |
27 | < property name = "jndiName" value = "${db.jndi}" /> |
以数据库为例,开发环境使用的是直接将配置写在项目的配置文件里面,而生产环境则使用了jndi。
切换profile可以写在web.xml里面:
2 | < param-name >spring.profiles.active</ param-name > |
3 | < param-value >dev</ param-value > |
不过得改web.xml,现在一般项目都使用maven来管理,maven也有profile,可以将它们结合起来。
02 | < profile.active >dev</ profile.active > |
03 | </ properties >< span ></ span > < build > |
04 | < defaultGoal >install</ defaultGoal > |
07 | < directory >src/main/resources</ directory > |
10 | < directory >src/main/resources</ directory > |
11 | < filtering >true</ filtering > |
13 | < include >**/*.properties</ include > |
24 | < activeByDefault >true</ activeByDefault > |
33 | < profile.active >production</ profile.active > |
34 | < profile.scope >provided</ profile.scope > |
37 | </ profiles <span></ span > |
mvn install -Pproduction 就是发布生产版本。
然后我们需要在项目里面src resource里面的某个配置文件添加如:
1 | profile.active=${profile.active} |
这样maven在编译时会自动设置profile。最后就是设法让spring能够读取到我们的配置。我们的做法是自己实现ContextLoaderListener,里面读取这个properties文件,将spring profiles属性设置为我们需要的值。
1 | System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, activeProfile); |