我有一个实用程序类,它具有与电子邮件发件人相关的常见配置,配置会根据Staging
和Production
等环境进行更改。现在我如何根据环境动态选择配置?
这是我的代码,
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";*/
}
在我的代码中,我手动注释掉配置!
答案 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)
在春季,您可以使用properties或yaml设置外部配置。
否则,如果您需要在运行应用程序时更改配置并且正在使用数据库,则可以使用键值配置在数据库中创建配置表,并在代码中读取它们。
例如,像这样的表:
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.properties
或application.yaml
文件中。这是Spring应用程序的更好选择。 application.properties
实际上只是第一个建议的.properties
文件,但是由Spring Framework自动加载。这些都在Chapter 24. Externalized Configuration的Spring 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)
我使用了两种方法:
指定活动配置文件(例如,application- {profile} .properties) 这很好,很直接。构建过程将解析特定于环境的属性文件。每个env的文件都可以在源代码管理中维护。可以在源代码管理中保护Prod属性文件(dev / qe无法访问)。缺点是管理不同的属性可能会失去同步(也就是配置漂移)(例如,某个属性键在dev中添加但在qe中没有添加)
在运行应用程序时指定自定义参数(例如-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;
}
}