Spring容器的高级特性涉及到属性编辑器,使用外部属性文件,国际化,容器事件等等; 今天讲解一下属性编辑器,使用外部资源,国际化。
属性编辑器 如果你没有了解过属性编辑器,建议你先google一下,我简单的解释一下什么是属性编辑器,看一个新写的有代表性的bean:
配置文件:
配置中的value都是字符串的形式出现的,但是我们的BasicProperties的属性不都是字符串,那么把字符串这种字面量转换为bean的属性对应的类型靠的就是属性编辑器。比如上面 spring能够自动把c://1.txt识别为File的,把http://www.google.com自动转化为URL. Spring为基本数据类型包括包装类型, 集合类( List,Set,Map,Collection ), 资源类( File, Class, Locale, Resource, InoutStream, URL )提供了默认的编辑器,如果我们想实现自己的属性编辑器,比如能够把05/08/2009自动识别为日期类型,我们需要做以下的工作:
1 写一个Editor继承自PropertyEditorSupport,
2 在IOC容器中注册这个编辑器.说注册有点玄乎,其实就是让容器知道这个编辑器的存在, 也就是配置一下.
3 写一个带有日期类的class测试一下:
4 配置一个Foo Bean,
写一个测试类看容器是否真的可以把05/05/2008转换为Date:
打印出Jan 5, 2008 12:05:00 AM, 成功!
使用外部属性文件 为什么要使用外部熟性文件? 举例子:我们经常把数据库链接,用户名,密码单独放在一个properties文件中,但是我们希望在bean config文件中可以使用它,那就以这个例子来做以下,我们的db.properties文件如下:
该文件放在classpath下面根目录上.我们需要把这个属性文件也注册到IOC容器:
配置一个DateSource,并且使用这个属性文件:
然后启动容器,没报错,说明配置成功.这个dataSource在讲spring jdbc的时候会用到.
国际化 国际化也就是我们的程序能支持多语言环境, 程序中的提示信息是多语言的.假如我们有这样的资源文件:
msg._en_US.properties,内容如下:
greeting.morning=Good morning
greeting.afternoon=Good afternoon
还有一个中文版本的:msg.properties
greeting.morning=早上好
greeting.afternoon=下午好
但是资源文件只能包含ascii字符,幸好java提供了一个把unicode字符转换为ascii的工具native2ascii,在jdk/bin下面.调用该命令把资源文件转化一下:
native2ascii c:/msg.properties c:/msg_zh_CN.properties. 把生成的文件msg_zh_CN.properties拷贝到src根目录.注意文件的命名: 文件名_语言简称_国家简称.properties ; 生成的msg_zh_CN.properties如下:
greeting.morning=/u65E9/u4E0A/u597D
greeting.afternoon=/u4E0B/u5348/u597D
配置一个messageResource:
注意路径,如果资源文件放在某个包下面,则要带上包名 pkgname/pkgname/msg;
测试程序:
消息文件中可以有占位符,context.getMessage()的第二个参数是数组, 可以放到占位符上.比如消息:
greeting.morning=good morning {0}, today is {1} ,则:
String msg = c.getMessage("greeting.morning",new Object[]{"John", new GregorianCalendar().getTime
()},Locale.US);
下一讲将学习spring aop.