Spring 环境与profile(二)——Properties with Spring
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.connectionURL=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 jms.queue=dev.queue
application-prod.properties
profile.name=prod.profiles # Database Properties db.driverClass=com.mysql.jdbc.Driver db.connectionURL=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 jms.queue=prod.queue
application-test.properties
profile.name=test.profiles # Database Properties db.driverClass=com.mysql.jdbc.Driver db.connectionURL=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 jms.queue=test.queue
#需解析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 + ", connectionURL=" + 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 version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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://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 location="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 location="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 location="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, connectionURL=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]
5. 代码