1. 简述
Spring profile用例,分3个场景(Test, Dev, Prod)相对Spring 环境与profile(一)——超简用例多了根据具体的profile获取对应的Properties
2. 代码结构
3. 各模块介绍
接口
GenericEnv
public interface GenericEnv {
}
#com.env模块
DevEnv.java
@Component
public class DevEnv implements GenericEnv {
private String envName = "dev";
@Value("${profile.name}")
private String profileName;
public String getEnvName() {
return envName;
}
public void setEnvName(String envName) {
this.envName = envName;
}
public String getProfileName() {
return profileName;
}
public void setProfileName(String profileName) {
this.profileName = profileName;
}
@Override
public String toString() {
return "DevEnv [envName=" + envName + ", profileName=" + profileName
+ "]";
}
}
ProdEnv
@Component
public class ProdEnv implements GenericEnv {
private String envName = "prod";
@Value("${profile.name}")
private String profileName;
public String getEnvName() {
return envName;
}
public void setEnvName(String envName) {
this.envName = envName;
}
public String getProfileName() {
return profileName;
}
public void setProfileName(String profileName) {
this.profileName = profileName;
}
@Override
public String toString() {
return "ProdEnv [envName=" + envName + ", profileName=" + profileName
+ "]";
}
}
TestEnv.java
@Component
public class TestEnv implements GenericEnv {
private String envName = "test";
@Value("${profile.name}")
private String profileName;
public String getEnvName() {
return envName;
}
public void setEnvName(String envName) {
this.envName = envName;
}
public String getProfileName() {
return profileName;
}
public void setProfileName(String profileName) {
this.profileName = profileName;
}
@Override
public String toString() {
return "TestEnv [envName=" + envName + ", profileName=" + profileName
+ "]";
}
}
#resources.properties文件
application-default.properties
# Application Common Properties
profile.name=spring.profile
application-dev.properties
profile.name=dev.profiles
# Database Properties
db.driverClass=com.mysql.jdbc.Driver
db.cnotallow=jdbc:mysql://localhost:3306/emp
db.username=dev_usr
db.password=dev_pss
# JMS Properties
jms.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
jms.provider.url=tcp://localhost:61616
application-prod.properties
profile.name=prod.profiles
# Database Properties
db.driverClass=com.mysql.jdbc.Driver
db.cnotallow=jdbc:mysql://192.168.1.1:3306/emp
db.username=prod_usr
db.password=prod_pss
# JMS Properties
jms.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
jms.provider.url=tcp://192.168.1.1:61616
application-test.properties
profile.name=test.profiles
# Database Properties
db.driverClass=com.mysql.jdbc.Driver
db.cnotallow=jdbc:mysql://192.168.1.2:3306/emp
db.username=test_usr
db.password=test_pss
# JMS Properties
jms.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
jms.provider.url=tcp://192.168.1.2:61616
#需解析properties的2个类
DatabaseProperties.java
package com.jcg.prop;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class DatabaseProperties {
@Value("${db.driverClass}")
private String driverClass;
@Value("${db.connectionURL}")
private String connectionURL;
@Value("${db.username}")
private String username;
@Value("${db.password}")
private String password;
public String getDriverClass() {
return driverClass;
}
public String getConnectionURL() {
return connectionURL;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
@Override
public String toString() {
return "DatabaseProperties [driverClass=" + driverClass
+ ", cnotallow=" + connectionURL + ", username=" + username
+ ", password=" + password + "]";
}
}
JmsProperties
package com.jcg.prop;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class JmsProperties {
/*
JMS即Java消息服务(Java Message Service)应用程序接口
*/
@Value("${jms.factory.initial}")
private String factoryInitial;
@Value("${jms.provider.url}")
private String providerUrl;
@Value("${jms.queue}")
private String queue;
public String getFactoryInitial() {
return factoryInitial;
}
public String getProviderUrl() {
return providerUrl;
}
public String getQueue() {
return queue;
}
@Override
public String toString() {
return "JmsProperties [factoryInitial=" + factoryInitial
+ ", providerUrl=" + providerUrl + ", queue=" + queue + "]";
}
}
#resources.spring模块
xml-config-context.xml
<?xml versinotallow="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cnotallow="http://www.springframework.org/schema/context"
xsi:schemaLocatinotallow="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- scans for annotated classes in the com.company package -->
<context:component-scan base-package="com.jcg" />
<!-- enables annotation based configuration -->
<context:annotation-config />
<beans profile="dev">
<!-- allows for ${} replacement in the spring xml configuration from the
application-default.properties, application-dev files on the classpath -->
<context:property-placeholder
locatinotallow="classpath:properties/application-default.properties, classpath:properties/application-dev.properties"
ignore-unresolvable="true" />
<!-- scans for annotated classes in the com.env.dev package -->
<context:component-scan base-package="com.env.dev" />
</beans>
<beans profile="test">
<context:property-placeholder
locatinotallow="classpath:properties/application-default.properties, classpath:properties/application-test.properties"
ignore-unresolvable="true" />
<context:component-scan base-package="com.env.test" />
</beans>
<beans profile="prod">
<context:property-placeholder
locatinotallow="classpath:properties/application-default.properties, classpath:properties/application-prod.properties"
ignore-unresolvable="true" />
<context:component-scan base-package="com.env.prod" />
</beans>
</beans>
4. 测试
package com.jcg.test;
import junit.framework.TestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.jcg.prop.DatabaseProperties;
import com.jcg.prop.GenericEnv;
import com.jcg.prop.JmsProperties;
@RunWith(SpringJUnit4ClassRunner.class)
//Change it to your desired profile
@ActiveProfiles(profiles = "dev")
@ContextConfiguration("classpath:spring/xml-config-context.xml")
public class SpringPropertiesTest extends TestCase {
@Autowired
private GenericEnv env;
@Autowired
private DatabaseProperties dbProp;
@Autowired
private JmsProperties jmsProp;
@Test
public void testAppProperties() {
System.out.println("Running DatabasePropertiesTest ...");
System.out.println("Environment : " + env.toString());
System.out.println("Database Properties: " + dbProp.toString());
System.out.println("JMS Properties : " + jmsProp.toString());
}
}
输出
Running DatabasePropertiesTest ...
Environment : DevEnv [envName=dev, profileName=dev.profiles]
Database Properties: DatabaseProperties [driverClass=com.mysql.jdbc.Driver, cnotallow=jdbc:mysql://localhost:3306/emp, username=dev_usr, password=dev_pss]
JMS Properties : JmsProperties [factoryInitial=org.apache.activemq.jndi.ActiveMQInitialContextFactory, providerUrl=tcp://localhost:61616, queue=dev.queue]