Spring之BeanWrapper和EL
BeanWrapper在Spring内部使用的地方非常多,因此有必要对其做简要的说明。另外Spring EL 是一种强大的表达式语音,支持在运行时对对象进行操作,这里也对其做简要说明。
BeanWrapper
BeanWrapper接口及其实现,方便的提供了获取bean的属性,设置属性、获取属性描述的方法。
以下示例:
System.out.println("----------test BeanWrapper---------");
BeanWrapper wrapper = new BeanWrapperImpl(new User(100, "test1"));
System.out.println(wrapper.getPropertyValue("id"));//输出100
PropertyValue v = new PropertyValue("id", 101);
wrapper.setPropertyValue(v);
System.out.println(wrapper.getPropertyValue("id"));//输出101
PropertyEditor
PropertyEditor是javaBean 标准定义的接口,spring使用它来把String转换为对象。之前的文章提过,基本类型的依赖注入(通过value属性)就使用了内置的PropertyEditor.
Spring使用了自己内置和javaBean标准内置的PropertyEditor,并把他们注册到Beanwrapper以供使用。见下图Spring内的实现,从名字可以看出其将要转化的类型,如ByteArrayPropertyEditor将字符串转化为 Byte数组。
Spring通过PropertyEditorManager来设置可能需要的propertyEditor的搜索路径,包括javabean标准和spring内置的,另外标准的命名也可以被自动搜索到,如
com
chank
pop
Foo
FooEditor // the PropertyEditor for the Foo class
当然可以自定义并注册自己的PropertyEditor。通过这么做,可以把string转换为我们自己需要类型。这里省略。
Spring TypeConversion
Spring从3.0开始提供了统一的类型转换接口,他作为另外一种可以替换propertyeditor的转换外部bean的方式。基本接口定义及其简单。
package org.springframework.core.convert.converter;
public interface Converter<S, T> {
T convert(S source);
}
这部分的详细内容涉及到SpringMVC等内容,关于详细请看博客:http://blog.csdn.net/renhui999/article/details/9837897
EL
Spring表达式可以用在bean定义中,从而配置更加灵活的bean。首先看下,其支持的操作吧:
表达式接口
通过表达式接口求值,我们一直在程序中很少这么用,只有spring框架内才会这么用。示例如下:
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello World'");
String message = (String) exp.getValue();
上面的示例是求字面字符串常量。
其他复杂例子不再举例。
配置bean
#{表达式}如下配置:
<bean id="numberGuess" class="org.spring.samples.NumberGuess">
<property name="randomNumber" value="#{ T(java.lang.Math).random() * 100.0 }"/>
<!-- other properties -->
</bean>
注解配置:
@Value("#{ systemProperties['user.region'] }")
private String defaultLocale;
结束
本篇文章极其简单的介绍了Spring中的beanWrapper、类型转换、表达式。其中类型转换极其重要,但是容易理解,本篇简单介绍的原因只是为了形成初步的印象,至于深入研究可以研究文章中的链接博文和源码,都是简单明了的。至于表达式,我其实很想知道它有多大的用处,感觉有点鸡肋。当然个人见解,很可能是没有理解到位。这里只是简单的走马观花,知道有这个东西,需要详细了解可以参考官方文档。