閱讀114 返回首頁    go 阿裏雲 go 技術社區[雲棲]


spring如何在xml裏配置Calendar,Date

文章地址:https://blog.csdn.net/hengyunabc/article/details/14107963

在Spring MVC裏可以通過message converter機製來對數據進行格式化,但是在普通的Spring xml配置裏就無能為力了。

在網上找了一通,發現也有很多人苦惱這個問題,不妨記錄下。


Spring 自帶一個PropertyEditor的機製,但是這個是全局的,假如你的配置文件要是和別人有不同的話,那就悲劇了,比如你配置的時間的格式是“yyyy-mm-dd",別人的是"yyyy-mm-dd-hh”。別外自定義的PropertyEditor還要注冊到ApplicationContext裏,非常麻煩,而且這個也是一個全局的配置。

https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/validation.html


別外Spring文檔裏提到了一個BeanInfo機製,但實際這個機製很坑爹,這個對Date無用,因為CustomDateEditor默認是沒有注冊到Spring裏的。

Customizable property editor for java.util.Date, supporting a custom DateFormat. NOT registered by default. Must be user registered as needed with appropriate format.

配置Date:

下麵來看下如何利用Spring提供的Factory bean機製來初始化Date對象的:

<beans xmlns="https://www.springframework.org/schema/beans"
	xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="https://www.springframework.org/schema/beans
	https://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
 
	<bean  >
		<constructor-arg value="yyyy-MM-dd" />
	</bean>
 
	<bean  >
		<property name="date">
			<bean factory-bean="dateFormat" factory-method="parse">
				<constructor-arg value="2010-01-31" />
			</bean>
		</property>
	</bean>
 
</beans>

來自:https://www.mkyong.com/spring/spring-how-to-pass-a-date-into-bean-property-customdateeditor/


配置Calendar:

至於Calendar,則沒有Date那麼容易了,因為Calendar是一個抽象類。一般都是通過Calendar.getInstance()來得到一個實例的。

Spring forum上有個網友給出了一個很巧妙的辦法:

https://forum.spring.io/forum/spring-projects/container/22111-inject-java-util-calendar-instance


package org.spring.forum;

import java.util.Calendar;

import org.springframework.beans.factory.config.AbstractFactoryBean;

public class CalendarFactoryBean extends AbstractFactoryBean  {

	/**
	 * Year; defaults to zero.
	 */
	private int year = 0;

	/**
	 * Month; defaults to zero.
	 */
	private int month = 0;

	/**
	 * Date; defaults to zero.
	 */
	private int date = 0;

	/**
	 * Number of hour of day (24 hour); defaults to zero.
	 */
	private int hourOfDay = 0;

	/**
	 * Number of minutes; defaults to zero.
	 */
	private int minute = 0;

	/**
	 * Number of seconds; defaults to zero.
	 */
	private int second = 0;

	public void setYear(int year) {
		this.year = year;
	}

	public void setMonth(int month) {
		this.month = month;
	}

	public void setDate(int date) {
		this.date = date;
	}

	public void setHourOfDay(int hourOfDay) {
		this.hourOfDay = hourOfDay;
	}

	public void setMinute(int minute) {
		this.minute = minute;
	}

	public void setSecond(int second) {
		this.second = second;
	}

	@Override
	protected Object createInstance() throws Exception {
		Calendar calendar = Calendar.getInstance();
		calendar.set(this.year, this.month, this.date, this.hourOfDay, this.minute, this.second);
		return calendar;
	}

	public Class getObjectType() {
		return Calendar.class;
	}

}


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "https://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>

   <bean  >
      <property name="year" value="2006" />
      <property name="month" value="0" />
      <property name="date" value="1" />
   </bean>

   <bean  >
      <property name="year" value="2006" />
      <property name="month" value="0" />
      <property name="date" value="1" />
      <property name="hourOfDay" value="12" />
   </bean>

</beans>


如果非要用字符串的方式來配置一個Calendar,如"1999-09-09"。有兩個思路,一個是把一個Date對象setter到一個Calendar裏,這個就很繞彎了。

<bean   factory-method="getInstance">  
    <property name="time" ref="dateBean"/>  
</bean> 

另一個是,參考上麵AbstractFactoryBean的思路,其實我們自己定義一個支持自定義格式化字符串的AbstractFactoryBean也是可行的。


不過,扯了這麼久,上麵都是如何得到一個Date或者Calendar對象,如果硬是要是配置文件裏直接用字符串的方式把Date或者Calendar注入到一個Bean,那麼隻用在Spring Context裏注冊一個全局的PropertyEditor了。


最後更新:2017-04-03 14:54:00

  上一篇:go Java IO--字節-字符流轉換OutputStreamWriter/InputStreamReader
  下一篇:go NET[NET基礎知識]