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



i有一个实用程序类,该类别具有与电子邮件sender相关的常见配置,配置基于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";*/
}

在我的代码中,我正在手动评论配置!

您可以使用属性文件来解决您的问题,就像您可以有两个属性文件取决于环境。

1(config_staging.properties2(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";

然后将它们注入电子邮件类,

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

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

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

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

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

这样,您可以使操作团队能够使用您(作为开发人员(不知道的数据来操纵(或预配合(属性文件,例如。高安全系统的密码...

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

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

e.t.c

启动应用程序之前,您将定义这些属性(取决于您的EVN(。当然,您需要将它们注入班级,如下所示:

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

所以现在fromEmailId将具有application.properties文件中的值。

祝你好运。

编辑:

如果您想要更高的安全级别,则可以使用jasypt将密码插入applicaiton.properties文件中。最后,密码将看起来像这样:

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

在春季您可以设置具有属性或yaml的外部配置。

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

例如,像这样的表:

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

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

属性

environment=development

可以变成

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

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

有些人建议将配置值移至.properties文件中。这是朝着正确方向迈出的重要一步,但忽略了您正在使用Spring Boot的事实。

有些人建议将配置值移至Spring application.propertiesapplication.yaml文件中。这是春季应用程序的更好选择。application.properties实际上只是.properties的第一个建议,但会自动由Spring Framework加载。这全都在第24章中描述了。

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

[...] 常见配置与电子邮件 - sender相关,配置基于阶段和生产等环境更改。

Spring具有非常好的功能,您可以在其中拥有一组配置文件(甚至是一个.yaml文件(,并且该框架将自动加载适当的配置值,具体取决于应用程序在何处运行,分期或登台或生产。这全都在第25章中进行了描述。个人资料。

application-{profile}.propertiesapplication-{profile}.yml允许您基于春季配置文件自定义应用程序。

只能在{profile}中使用:

在{profile}中创建beans
@Service
@Profile(profile-name)
public class ServiceImpl implements ServiceInterface {
}

也可以根据属性值和条件创建豆类。

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

条件豆可以基于表达

@Bean
@ConditionalOnExpression("'${spring.datasource.driver-class-name}'=='com.mysql.jdbc.Driver'")
public DbUtil dbMysqlUtil() {
    ...
}
@Bean
@ConditionalOnExpression("'${spring.datasource.driver-class-name}'=='org.hsqldb.jdbc.JDBCDriver'")
public DbUtil dbHsqlUtil() {
    ...
}

制作配置。这些配置文件将具有相应的属性。现在,当应用程序启动时,您可以首先基于环境读取属性。环境价值您可以作为应用程序中的参数传递。您只需要编写一个简单的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");

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

我都使用了这两种方法:

  1. 指定活动配置文件(例如application- {profile} .properties(这很好,很简单。构建过程将解决特定环境属性文件。每个ENV的文件可以保存在源控制中。可以在源控件中确保Prod属性文件(不访问DEV/QE(。不利的一面是,管理不同的属性可以摆脱同步(又称配置漂移((例如,在dev中添加了某个属性密钥,而不是在QE中添加(

  2. 在运行应用程序中指定自定义参数(例如-dapp.home(您必须添加代码才能自定义属性文件的加载。一些自定义可以包括处理加密属性值。属性密钥/值可以保存在厨师(或同等工具(中。请参阅下面的示例代码:

    @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;
        }
    }
    

最新更新