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. 代码

路径

 

posted @ 2018-04-10 12:42  jihite  阅读(1811)  评论(0编辑  收藏  举报