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

    路径

  • 相关阅读:
    asp.net core 使用 StaticFiles 中间件 (不完整翻译)
    asp.net core 通过 TeamCity 实现持续集成笔记
    Swashbuckle for asp.net core 配置说明
    # TypeScript 中如何确保 this 的正确性
    MySql + EF6 + .Net Core
    ASP.NET Core + EF6
    数据库设计 Assignment 02
    NYOJ 8 一种排序
    NYOJ 23.取石子(一)
    邻接表(C++)
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/8778207.html
Copyright © 2011-2022 走看看