java.beans.PropertyEditor
PropertyEditor实现的是双向类型转换:String和Object互转。调用setValue()方法后,需要先“缓存”起来后续才能够使用(输出)
java doc中重要的一句话:
PropertyEditor 类为希望允许用户编辑给定类型的属性值的 GUI 提供支持。
PropertyEditor 支持各种不同的显示和更新属性值的方式。大多数 PropertyEditor 只需要支持此 API 中可用的不同选项的子集。
JDK对PropertyEditor接口提供了一个默认实现java.beans.PropertyEditorSupport,因此我们若需扩展此接口,仅需继承此类,根据需要复写getAsText/setAsText这两个方法即可,Spring无一例外都是这么做的。
PropertyEditor作为一个JDK原生接口,内置了一些基本实现来服务于GUI程序,如:
BooleanEditor:将true/false字符串转换为Boolean类型
IntegerEditor:将字符串转换为Integer类型
同类别的还有LongEditor、FloatEditor...
JDK内置的实现比较少(如上),功能简陋,但对于服务GUI程序来说已经够用,毕竟界面输入的只可能是字符串,并且还均是基础类型。但这对于复杂的Spring环境、以及富文本的web环境来说就不够用了,所以Spring在此基础上有所扩展,因此才有了本文来讨论。
这么一来PropertyEditorSupport就是有状态的了,因此是线程不安全的。在使用过程中需要特别注意,避免出现并发风险。
官方的javadoc都说得很清楚:PropertyEditor设计是为GUI程序服务的,那么Spring为何看上它了呢?
试想一下:那会的Spring只能支持xml方式配置,而XML属于文本类型配置,因此在给某个属性设定值的时候,书写上去的100%是个字符串,但是此属性对应的类型却不一定是字符串,可能是任意类型。你思考下,这种场景是不是跟GUI程序(AWT)一毛一样:输入字符串,对应任意类型。
基于PropertyEditor的类型转换作为一种古老的、遗留下来的方式,是具有一些设计缺陷的,如:职责不单一,类型不安全,只能实现String类型的转换等。虽然自Spring 3.0起提供了现代化的类型转换接口,但是此部分机制一直得以「保留」,保证了向下兼容性。
新一代类型转换接口Converter、GenericConverter
其中一部分搬运自:https://mp.weixin.qq.com/s/Afu8YYyREoynAXS6YrJe7g
建议阅读:
https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s/5daOOdhIFqrGbpgtnuQMNw
https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s/Afu8YYyREoynAXS6YrJe7g
https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s/--UO3pH1nxTW3f5nQvEnkg
有关PropertyEditorRegistrar接口,spring提供的用于自定义PropertyEditor的接口,建议阅读:
https://blog.csdn.net/qq_43414291/article/details/111226055