spring学习笔记:ioc容器高级特性

来源:互联网 发布:皇室战争亡灵升级数据 编辑:程序博客网 时间:2024/04/30 09:38

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.

原创粉丝点击