Spring BootカスタムDatePropertySrouceリソースプール
7813 ワード
時々、設定ファイルに直接時間ベースのパラメータを設定したいです.例えば、サービスが登録センターに登録されるとき、サービス起動のタイムスタンプを持参したいです.
以下のように、Spring Bootのプロファイルでは乱数の配置が簡単にできます.
コア実現:DatePropertySource
PropertySourceを継承し、特定のDateリソースプールを実現します.Calendarのすべての属性の単独取得をサポートしています.自由に組み合わせられています.使い方は:$
Aplication Contect Initializerインターフェースを実現し、DatePropertySourceをシステムリソースプールに参加して、それを有効にします.
OKです.これで、カスタマイズしたリソースプールが完成しました.この設定ファイルは自由に組み合わせられ、直接に時間を設定することができます.使用時間は属性値の生成が完了したら固定され、使用時、注入時には変化しません.
以下のように、Spring Bootのプロファイルでは乱数の配置が簡単にできます.
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
同様に、私達が望む時間の配置方式は以下の通りである.spring.cloud.consul.discovery.tags=now=${date.now},timestamp=${date.timestamp}
どのように多く言わないで実現して、コードをつけます.コア実現:DatePropertySource
PropertySourceを継承し、特定のDateリソースプールを実現します.Calendarのすべての属性の単独取得をサポートしています.自由に組み合わせられています.使い方は:$
public class DatePropertySource extends PropertySource {
private static final Log log = LogFactory.getLog(DatePropertySource.class);
public static final String DATE_PROPERTY_SOURCE_NAME = "date_time";
public static final String PREFIX = "date.";
public static final String NOW = "NOW";
public static final String TIMESTAMP = "TIMESTAMP";
//yyyy-MM-dd HH:mm:ss
public static final String FORMAT = "FORMAT";
public static final String YMD = "YMD";
public static final String HMS = "HMS";
public static final String ERA = "ERA";
public static final String YEAR = "YEAR";
public static final String DAY_OF_YEAR = "DAY_OF_YEAR";
public static final String DAY_OF_MONTH = "DAY_OF_MONTH";
public static final String WEEK_OF_YEAR = "WEEK_OF_YEAR";
public static final String WEEK_OF_MONTH = "WEEK_OF_MONTH";
public static final String DAY_OF_WEEK_IN_MONTH = "DAY_OF_WEEK_IN_MONTH";
public static final String AM_PM = "AM_PM";
public static final String HOUR = "HOUR";
public static final String HOUR_OF_DAY = "HOUR_OF_DAY";
public static final String MINUTE = "MINUTE";
public static final String SECOND = "SECOND";
public static final String MILLISECOND = "MILLISECOND";
public DatePropertySource(String name) {
super(name, Calendar.getInstance());
}
public DatePropertySource() {
this(DATE_PROPERTY_SOURCE_NAME);
}
@Override
public Object getProperty(String name) {
if (!name.startsWith(PREFIX)) {
return null;
}
if (log.isTraceEnabled()) {
log.trace("Generating date property for '" + name + "'");
}
String valueType = name.substring(PREFIX.length()).toUpperCase();
Calendar now = Calendar.getInstance();
switch (valueType) {
case NOW:
return getNow(now);
case TIMESTAMP:
return getTimestamp(now);
case FORMAT:
return getFormat(now);
case YMD:
return getYMD(now);
case HMS:
return getHMS(now);
case ERA:
return getEra(now);
case YEAR:
return getYear(now);
case DAY_OF_YEAR:
return getDayOfYear(now);
case DAY_OF_MONTH:
return getDayOfMonth(now);
case WEEK_OF_YEAR:
return getWeekOfYear(now);
case WEEK_OF_MONTH:
return getWeekOfMonth(now);
case DAY_OF_WEEK_IN_MONTH:
return getDayOfWeekInMonth(now);
case AM_PM:
return getAmOrPm(now);
case HOUR:
return getHour(now);
case HOUR_OF_DAY:
return getHourOfDay(now);
case MINUTE:
return getMinute(now);
case SECOND:
return getSecond(now);
case MILLISECOND:
return getMilliSecond(now);
default:
return getNow(now);
}
}
public static void addToEnvironment(ConfigurableEnvironment environment) {
environment.getPropertySources().addAfter(
StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME,
new RandomValuePropertySource(DATE_PROPERTY_SOURCE_NAME));
log.trace("RandomValuePropertySource add to Environment");
}
private Date getNow(Calendar instance) {
return instance.getTime();
}
private String getFormat(Calendar instance) {
StringBuffer sb = new StringBuffer(64);
sb.append(instance.get(Calendar.YEAR))
.append("-")
.append(instance.get(Calendar.MONTH))
.append("-")
.append(instance.get(Calendar.DAY_OF_MONTH))
.append(" ")
.append(instance.get(Calendar.HOUR))
.append(":")
.append(instance.get(Calendar.MINUTE))
.append(":")
.append(instance.get(Calendar.SECOND));
return sb.toString();
}
private long getTimestamp(Calendar instance) {
return instance.getTimeInMillis();
}
private String getYMD(Calendar instance) {
return instance.get(Calendar.YEAR) + "-" + instance.get(Calendar.MONTH) + "-" + instance.get(Calendar.DAY_OF_MONTH);
}
private String getHMS(Calendar instance) {
return instance.get(Calendar.HOUR_OF_DAY) + ":" + instance.get(Calendar.MINUTE) + ":" + instance.get(Calendar.SECOND);
}
private int getEra(Calendar instance) {
return instance.get(Calendar.ERA);
}
private int getYear(Calendar instance) {
return instance.get(Calendar.YEAR);
}
private int getDayOfYear(Calendar instance) {
return instance.get(Calendar.DAY_OF_YEAR);
}
private int getDayOfMonth(Calendar instance) {
return instance.get(Calendar.DAY_OF_MONTH);
}
private int getWeekOfYear(Calendar instance) {
return instance.get(Calendar.WEEK_OF_YEAR);
}
private int getWeekOfMonth(Calendar instance) {
return instance.get(Calendar.WEEK_OF_MONTH);
}
private int getDayOfWeek(Calendar instance) {
return instance.get(Calendar.DAY_OF_WEEK);
}
private int getDayOfWeekInMonth(Calendar instance) {
return instance.get(Calendar.DAY_OF_WEEK_IN_MONTH);
}
private int getAmOrPm(Calendar instance) {
return instance.get(Calendar.AM_PM);
}
private int getHour(Calendar instance) {
return instance.get(Calendar.HOUR);
}
private int getHourOfDay(Calendar instance) {
return instance.get(Calendar.HOUR_OF_DAY);
}
private int getMinute(Calendar instance) {
return instance.get(Calendar.MINUTE);
}
private int getSecond(Calendar instance) {
return instance.get(Calendar.SECOND);
}
private int getMilliSecond(Calendar instance) {
return instance.get(Calendar.MILLISECOND);
}
}
システムのリソースプールに追加Aplication Contect Initializerインターフェースを実現し、DatePropertySourceをシステムリソースプールに参加して、それを有効にします.
public class DatePropertyConfiguration implements ApplicationContextInitializer{
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
ConfigurableEnvironment environment = applicationContext.getEnvironment();
DatePropertySource datePropertySource = new DatePropertySource();
environment.getPropertySources().addLast(datePropertySource);
}
}
resoures\META-INF\spring.factoresにApple Controtext Initializerを配置します.Spring Bootが起動すると自動的にロードされます.org.springframework.context.ApplicationContextInitializer=\
com.example.demo.config.DatePropertyConfiguration
完了OKです.これで、カスタマイズしたリソースプールが完成しました.この設定ファイルは自由に組み合わせられ、直接に時間を設定することができます.使用時間は属性値の生成が完了したら固定され、使用時、注入時には変化しません.