zoukankan      html  css  js  c++  java
  • 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. 代码

    路径

  • 相关阅读:
    Aurora 数据库支持多达五个跨区域只读副本
    Amazon RDS 的 Oracle 只读副本
    Amazon EC2 密钥对
    DynamoDB 读取请求单位和写入请求单位
    使用 EBS 优化的实例或 10 Gb 网络实例
    启动 LAMP 堆栈 Web 应用程序
    AWS 中的错误重试和指数退避 Error Retries and Exponential Backoff in AWS
    使用 Amazon S3 阻止公有访问
    路由表 Router Table
    使用MySQLAdmin工具查看QPS
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/8778207.html
Copyright © 2011-2022 走看看