如何根据JAVA中的环境动态选择配置?

时间:2017-06-06 06:48:31

标签: java spring spring-boot constants

我有一个实用程序类,它具有与电子邮件发件人相关的常见配置,配置会根据StagingProduction等环境进行更改。现在我如何根据环境动态选择配置?

这是我的代码,

EmailUtility.java

package com.housecar.common;

public class EmailUtility {

 //For staging 
 public static final String FROM_EMAIL_ID = "xx12@xyz.com";
 public static final String FROM_NAME = "xyz";
 static final String SMTP_USERNAME = "xx12@xyz.com";
 static final String SMTP_PASSWORD = "15sss67$";
 public static final String REPLY_EMAIL_ID = "xx12@xyz.com";
 public static final String MAIL_SMTP_PORT = "587";
 public static final String MAIL_SMTP_SOCKET_FACTORY_PORT = "587";
 public static final String SMTP_HOST = "smtp.gmail.com";
 public static final String MAIL_SMTP_SOCKETFACTORY_CLASS = "javax.net.ssl.SSLSocketFactory";


 //for production

 /*public static final String FROM_EMAIL_ID = "admin@xyz.com";
 public static final String FROM_NAME = "xyz";
 static final String SMTP_USERNAME = "AKYeeeELEQAGAA"; // Replace with
                                                            // your SMTP
                                                            // username.
 static final String SMTP_PASSWORD = "gvwwwwwbgpGm/C/LmUYUK5HosQar7mTSwjl5MFeBRR";
 public static final String REPLY_EMAIL_ID = "admin@xyz.com";
 public static final String MAIL_SMTP_PORT = "587";
 public static final String MAIL_SMTP_SOCKET_FACTORY_PORT = "587";
 public static final String SMTP_HOST = "email-smtp.us-east-1.amazonaws.com";
 public static final String MAIL_SMTP_SOCKETFACTORY_CLASS = "javax.net.ssl.SSLSocketFactory";*/

}

在我的代码中,我手动注释掉配置!

8 个答案:

答案 0 :(得分:2)

您应该从属性存储中查找系统依赖值(例如,由Javas Properties类处理的属性文件)。

但是您不应该在同一个文件中提供所有系统信息。

您应该拥有单独的文件(具有相同的名称),并让您的部署过程将目标系统的文件复制到预期的位置。

通过这种方式,您可以让操作团队使用您(作为开发人员)不应该知道的数据来操作(或预配置)属性文件,例如。高安全性系统的密码......

答案 1 :(得分:2)

将以下内容添加到application.properties文件中:

from.email.id = xx12@xyz.com
from.name = xyz

...

e.t.c

在启动应用程序之前定义这些属性(取决于您的情况)。 当然,您需要按如下方式将它们注入您的课程:

@Value("${from.email.id}")
private String fromEmailId;

现在,fromEmailId将赋予application.properties文件中的值。

祝你好运。

编辑:

如果您想要更高级别的安全性,可以使用jasypt将密码压缩到applicaiton.properties文件中。最后,密码将如下所示:

smtp.password = ENC(5KZL2q+Ute21FzCsJy/h0aIp75TZgHBHx8L11R+jTJs0=)

答案 2 :(得分:2)

您可以使用属性文件来解决您的问题,例如,根据环境,您可以拥有两个属性文件。

1)config_staging.properties 2)config_production.properties

并将您的暂存电子邮件配置移至config_staging.properties,将您的生产配置移至config_production.properties。

将在运行应用时进行配置。

例如,

config_staging.properties

 smtp.username = "xx12@xyz.com";
 smtp.password = "15sss67$";

config_production.properties

smtp.username = "AKYeeeELEQAGAA";
smtp.password = "gvwwwwwbgpGm/C/LmUYUK5HosQar7mTSwjl5MFeBRR";

然后将它们注入到EmailUtility类中,

@Value("${smtp.username}")
private String smtpUsername;


@Value("${smtp.password}")
private String smtpPassword;

答案 3 :(得分:1)

在春季,您可以使用propertiesyaml设置外部配置。

否则,如果您需要在运行应用程序时更改配置并且正在使用数据库,则可以使用键值配置在数据库中创建配置表,并在代码中读取它们。

例如,像这样的表:

CREATE TABLE configuration (
    key varchar(255),
    value varchar(255)
);

其中key是属性名称,value是属性值。

属性

environment=development

可能会成为

INSERT INTO configuration (key, value) VALUES('environment', 'development');

答案 4 :(得分:1)

这里的其他答案是朝着正确方向迈出的一步。

有人建议将配置值移动到.properties文件中。这是朝着正确方向迈出的一大步,但忽略了你使用Spring Boot这一事实。

有人建议将配置值移到Spring application.propertiesapplication.yaml文件中。这是Spring应用程序的更好选择。 application.properties实际上只是第一个建议的.properties文件,但是由Spring Framework自动加载。这些都在Chapter 24. Externalized ConfigurationSpring Boot Reference Guide中进行了描述。

但是,你的问题实际上说:

  与电子邮件发件人相关的

[...] 常见配置,配置会根据分段和制作等环境而变化。

Spring有一个非常好的功能,你可以拥有一组配置文件(甚至是一个.yaml文件),框架将自动加载适当的配置值,具体取决于应用程序的运行位置,在分期或生产中。这些都在Chapter 25. Profiles中描述。

答案 5 :(得分:1)

X, Y, N, Ntr = createsplit.create_training_data(data) application-{profile}.properties可让您根据弹簧配置文件自定义应用程序。

可以使用以下命令在{profile}中创建bean:

application-{profile}.yml

还可以根据属性值和条件创建bean。

@Service
@Profile(profile-name)
public class ServiceImpl implements ServiceInterface {
}

条件bean可以基于表达式

@Bean
@ConditionalOnProperty(prefix = EmailProperties.PREFIX, name = "fromId")
public BeanClass bean() {
    return new BeanClass(okHttpProperties.getFromId());
}

答案 6 :(得分:0)

使stage.properties文件与舞台和制作分开。这些配置文件将具有相应的属性。现在,在应用程序启动时,您可以首先根据环境读取属性。您可以在应用程序中作为参数传递的环境值。您只需要编写一个简单的ConfigurtionReader类,它将在应用程序启动之前读取所需的配置。下面是代码示例,考虑在普通java中读取一个非常简单的属性文件。

这将读取与jar(当前应用程序)并行放置的属性文件。

public class ConfigurationReader {

    /** The job config prop. */
    private static final Properties JOB_CONFIG_PROP = new Properties();

    /**
     * Function is used to read configuration file that is placed in same place
     * where project jar is located.
     * 
     */
    public void readConfiguration(final String jobName) {
        File jarPath;
        String propertiesPath = " ";
        String jobConfigFile = " ";
        try {
            jarPath = new File(ConfigurationReader.class.getProtectionDomain().getCodeSource().getLocation().getPath());
            propertiesPath = jarPath.getParentFile().getAbsolutePath();
            jobConfigFile = propertiesPath + File.separator + AppConstants.CONFIGURATION_FOLDER_NAME
                    + File.separator + jobName + AppConstants.PROP;
            JOB_CONFIG_PROP.load(new FileInputStream(jobConfigFile));
        } catch (FileNotFoundException fileNtFoundExep) {
            throw fileNtFoundExep;
        } catch (IOException iOException) {
            throw iOException;
        } catch (Exception exception) {
            throw exception;
        }
    }

    public static String getPropertyValue(final String key) {
        return JOB_CONFIG_PROP.getProperty(key);
    }

    public static void setPropertyValue(final String key, final String value) {
        JOB_CONFIG_PROP.setProperty(key, value);
    }
}

然后,您可以使用...

获取/设置属性值
ConfigurationReader.getPropertyValue("abc");
ConfigurationReader.setPropertyValue("abc","xyz");

这只是一种从属性文件中读取属性的简单方法。你可以这样做。

答案 7 :(得分:0)

我使用了两种方法:

  1. 指定活动配置文件(例如,application- {profile} .properties) 这很好,很直接。构建过程将解析特定于环境的属性文件。每个env的文件都可以在源代码管理中维护。可以在源代码管理中保护Prod属性文件(dev / qe无法访问)。缺点是管理不同的属性可能会失去同步(也就是配置漂移)(例如,某个属性键在dev中添加但在qe中没有添加)

  2. 在运行应用程序时指定自定义参数(例如-Dapp.home) 您必须添加代码来自定义加载属性文件。某些自定义可以包括处理加密的属性值。可以在Chef(或等效工具)中维护属性键/值。请参阅以下示例代码:

    @Configuration
    public class MyExternalConfig {
    
        @Bean
        public static PropertyPlaceholderConfigurer configurer(){
    
            //this is an external file path
            String appHomeConfig = System.getProperty("app.home") + File.separatorChar + "config";
    
            PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
            final Resource extResource = new FileSystemResource( new File( appHomeConfig, "application.properties") );
            ppc.setLocations( new Resource[] { extResource } ); //add other properties file if needed
            ppc.setIgnoreUnresolvablePlaceholders( true );
            return ppc;
        }
    }