假如这个世界上只剩下你一个人,当你正坐在屋子里的时候,这时突然响起了敲门声...

在Spring2.5中定制自己的属性编辑器

上一篇 / 下一篇  2008-05-07 14:00:48

查看( 81 ) / 评论( 0 )
本文为原创,如需转载,请注明作者和出处,谢谢!
Db&CO5?-\6^0
R2T6]C a%~%q8|0装配Bean是Spring的一个非常重要的功能。我们可以通过Spring在XML文件中配置Java Bean,然后通过ApplicationContext来获得Bean的对象实例。在配置Bean时,需要对构造方法的参数,属性进行初始化。对于Java简单类型或简单类型的List、Map等数据类型初始化非常简单,如下面就是一个对简单类型属性和构造方法参数进行初始化的配置代码:
f#L,G)DJQ0<!--  要求Spring2.0或Spring2.5   scope="prototype"相当于Spring1.x的singleton="false" -->
:@/}$q4W_0lV,q6]P0<bean id="my" class="bean.MyClass" scope="prototype">
7U.{Jn-O.z YBO0<constructor-arg>ITPUB个人空间"n?s"k"`7JR~Y\
            <value>my value1</value>
Exb^a+T1U0        </constructor-arg>
6wr7t4@c4f(a0        <property name="name">
u |Hx#Q!E0er r#K*N0                <value>皮球</value>
!FxI*O;S%h/wy+Qg l0        </property>ITPUB个人空间 srV+ij8l}
<property name="myList">ITPUB个人空间f-A jsOW0Y {'yGg
            <list>
G%J&u9w"pE0                    <value>value1</value>ITPUB个人空间)zTg@ R
                    <value>value2</value>ITPUB个人空间0`/k`7yA$t
                </list>ITPUB个人空间`f v Bsf8yZ#a#u
        </property>
3r#_L!]8V:V&^Z0</bean>ITPUB个人空间:@T1Z.S;[j I|
ITPUB个人空间'Ki&EsV hV"M+SX2[
但对于复杂类型的属性或参数,如一个属性的类型是另外一个Java Class,这样就必须在配置文件中再声明这个Java Class,如果这种情况很多时,或是我们做的类要release时,就会给开发人员增加很多工作量。让我们先来举个例子。假设有两个类:Contact和PhoneNumber,Contact的phoneNumber属性的类型是PhoneNumber,代码如下:
.b MON0n9DVz"N0ITPUB个人空间8k{7sG)?
Contact类ITPUB个人空间7hmP@'kUL
ITPUB个人空间 e'q @ [4_a e}&_s2u
package bean;ITPUB个人空间^J&BNI

t'^N7n.F0public class ContactITPUB个人空间i3w | FL+Q T/p i
{ITPUB个人空间Th&`q3X|Q?F
    private PhoneNumber phoneNumber;ITPUB个人空间#edRW#n.T
        public PhoneNumber getPhoneNumber()ITPUB个人空间'ec)jDTy#|0]
        {
2wx TQ4`3M6g9n'B-yG0                return phoneNumber;ITPUB个人空间i5WRul:f_%T*Y
        }
-N1i0P%Y Q0        public void setPhoneNumber(PhoneNumber phoneNumber)ITPUB个人空间\ A4MQ3n,E
        {ITPUB个人空间Tf9Z6Y7|F`
                this.phoneNumber = phoneNumber;ITPUB个人空间\-R.p'mJP
        }
&y z9gc5zx?"T%q8f0}ITPUB个人空间D2i)u v.AQk
ITPUB个人空间 snnkD@o3AA
PhoneNumber类
{xxc*A$K/oekI9x0
Y X'|#BZ1tzy0package bean;
.{!}B@7C0ITPUB个人空间n[!YR3dB
public class PhoneNumberITPUB个人空间TD9Fw9u-TG2wr
{ITPUB个人空间syq1_T
    private String number;
(u%Za D^0    public PhoneNumber(String s)ITPUB个人空间C-i efetD
    {ITPUB个人空间9jR{;jkY F
            this.number = s;
'Q9q2IDzt t0e0    }
P3B(W'[|(Q#u0    public String getNumber()
4nMi*_1D+tV%np l0    {
3a5et*n x/QOf0            return number;
go0C1jX0    }ITPUB个人空间.J*A+zu8sW A9n
}ITPUB个人空间Y2gV.x9W w
ITPUB个人空间%ai4o1s%ei%eo r
    如果直接在XML配置文件中装配Contact类,就需要先装配PhoneNumber类,代码如下:ITPUB个人空间!{qRZnC}h

p$}| _y.P RI$ZQ0<?xml version="1.0" encoding="UTF-8"?>ITPUB个人空间[1d:}4o b`Yt4s
<beans xmlns="http://www.springframework.org/schema/beans"
n(Wp*u;b'C0        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"ITPUB个人空间d ^ im`].FY6O
        xmlns:tx="http://www.springframework.org/schema/tx"
3~Z.TK L)aW0        xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd
iV}%Vc_d3O0                               http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.0.xsd">ITPUB个人空间g:S.\],R kW

5N)g$^`4u aq | dzY0        <bean id="contact" class="bean.Contact">ITPUB个人空间9a'gnct r
                <property name="phoneNumber">ITPUB个人空间'NGSXur1o l)?
                        <ref bean="phoneNumber"/>ITPUB个人空间%D/n;g u:Pg4CQ
                </property>ITPUB个人空间!G;n8GF?5M ^
        </bean>
K!i#H4? I7R0        <bean id="phoneNumber" class="bean.PhoneNumber">
:k-~.p:`UM1K,_0                <constructor-arg>
H1jY6q/jT5UoG Q0                        <value>12345678</value>ITPUB个人空间{S#["z8\"GTbu
                </constructor-arg>
bbn;?0G0        </bean>
Xfk#Tu'N4KTM0</beans>
W!W;j9vt ~ jt0
2m\8Zp d4m0从上面的代码中可以看到,装载Contact的同时,也装载了PhoneNumber。但如果使用了属性编辑器,就可以无需装载PhoneNumber就可以装载Contact了。ITPUB个人空间 U:Yg LaUu
编写自己的属性编辑器的步骤很简单,属性编辑器类需要从java.beans.PropertyEditorSupport类继承,在这个类中有一个setAsText方法,这个方法有一个String类型的参数,通过这个方法,可以将String类型的参数值转换成其他类型的属性。在这个方法中我们还需要使用一个setValue方法,就来指定转换后的对象实例。好,现在我们来实现这个简单的编辑器类,代码如下:ITPUB个人空间_,A${e:{"P:J
ITPUB个人空间-m6x Z u Q v { X
package editor;
Nk5_%lW8[-D0ITPUB个人空间;j6G`3_TEt&X
public class PhoneEditor extends java.beans.PropertyEditorSupport
|[(i T@C xB0{ITPUB个人空间%z|WaU2[y
@OverrideITPUB个人空间 RI@/U'E2lJ,\v b
public void setAsText(String text) throws IllegalArgumentException
Tw`G2_ F u0{               
Q4pf?+[0        setValue(new bean.PhoneNumber(text));
na8aJ\:mjdf0}
z#uFP`1\,eb0}
V(s jFf2Z4Z0ITPUB个人空间F6b3d@u`0\
    这个类的代码非常简单,在setAsText方法中只有一行代码,实际上只是建立一个PhoneNumber对象实例,并将text属性值作为参数值传入PhoneNumber的构造方法。接下来我们在配置文件中安装这个属性编辑器(实际上是装配org.springframework.beans.factory.config.CustomEditorConfigurer类),代码如下:
\$bJ*b+\.R&sx0ITPUB个人空间GQ1z%n2_ NE'E:q
<bean id="customerEditor"ITPUB个人空间;u9_}D!ye
                class="org.springframework.beans.factory.config.CustomEditorConfigurer">ITPUB个人空间:~my7R8l
        <property name="customEditors">ITPUB个人空间.Bsh IV`uI:T6cY i
                <map>ITPUB个人空间Xp'k&P+~N`5?]
                        <entry key="bean.PhoneNumber">ITPUB个人空间?;`K1CVen o
                                <bean id="phoneEditor" class="editor.PhoneEditor"/>
A0UdD(M6I7YUUyw_0                        </entry>
u!a4cP!b8uIH0                </map>ITPUB个人空间 XQ!L%D%\4},Z
        </property>ITPUB个人空间n M ?$Q}EY
</bean>ITPUB个人空间"r/d5DL;L:QkKB
ITPUB个人空间 Y3B1T8[ G

r:Dv:BU)V(MYTB0    从上面的代码可以看出,属性编辑器是使用了CustomEditorConfigurer的customEditors属性进行安装的。这是一个Map类型的属性。key的值必须是属性编辑器最终转换后的类型名,如在本例中,要将文本的参数值转换成bean.PhoneNumber类型的值,因此,key必须为bean.PhoneNumber。  下面我们来使用PhoneEditor属性编辑器类来装配Contact类,代码如下:
ey&RV_i0ITPUB个人空间 ]RM+Lm*N9O3FA
<bean id="contact" class="bean.Contact">ITPUB个人空间L%_$h(^,iu*[ j
        <property name="phoneNumber">
5s1HO~2MO X,G0                <value>87654321</value>ITPUB个人空间7XByrk ?1r
        </property>ITPUB个人空间L2z ^ E\POB+X3E
</bean>ITPUB个人空间^"z|!UK5B
ITPUB个人空间5w1ue x6T;iq
也许大家都注意到了上面这段代码的变化,在设置phoneNumber属性默认值时,不再使用<ref>标签来引用phoneNumber对象,而是直接使用了<value>来设置一个文本的电话号。Spring当遇到这种情况时,也就是说,某个属性值和属性类型不一致时(如本例中一个是文本,一个是PhoneNumber类型),会先找一下属性类型是否有相应的属性编辑器已经被安装,在本例中将以bean.PhoneNumber作为key来查找,正好找到上面安装的PhoneEditor,因此,Spring就会调用PhoneEditor类中的setAsValue方法来设置PhoneNumber对象实例,然后Spring在内部又分调用getValue来获得PhoneNumber对象实例,并将其赋给Contact的phoneNumber属性。其实所有类型的bean.PhoneNumber的属性都可以使用这个属性编辑器。
?'H&M+IW`*V{A+S0大家可以看看,这样做是不是简单的多!尤其是在发布通用的framework或程序时,就更为简单了。在Spring中已经定义了很多这种属性编辑器,如我们可以使用org.springframework.beans.propertyeditors.URLEditor将字符串映射成java.net.URL对象。ITPUB个人空间$ey| mx K:Pn]^7a

wJLl`cD@i0    下面的代码通过ApplicationContext来获得Contact的对象实例,并输出其phoneNumber属性值:
4AMN?*y0ITPUB个人空间%wZ'Mg/s{
ITPUB个人空间VU!{!l\aO \)f;}V
import org.springframework.context.*;ITPUB个人空间/z p9K%R+UN S]
import org.springframework.context.support.*;ITPUB个人空间PX2k I&F8uQtY0x
public class TestITPUB个人空间Y't3eND%Z*{ vC
{
LX \,js0ITPUB个人空间}5A1y-VEY
        public static void main(String[] args)ITPUB个人空间hs3s4j)Zx#n2J:c\
        {
SGFb} @0               ITPUB个人空间3dJx z|wX%G
                ApplicationContext context = new
Wf5uf(K0FileSystemXmlApplicationContext("src\applicationContext.xml");ITPUB个人空间"o Hc6R1`
       
0u;P{_.m-|(^9L)N+P8hE0                bean.Contact contact = (bean.Contact) context.getBean("contact");
5e7}"X| ?"W0                System.out.println(contact.getPhoneNumber().getNumber());
MjxlSe?|t0ITPUB个人空间P I ?4w)x9G
        }ITPUB个人空间+g9bW\rbIo

!olOv [ SyL h0}ITPUB个人空间1hm8Ba|
ITPUB个人空间 B:E&ihH2_Wt`e'm

PY#an$M*Me;_0注:实际上,属性编辑器本身是由Java提供了,Spring只是利用了这一特性使装配一个Bean更容易而已。

TAG:

我来说两句

(可选)

日历

« 2008-05-17  
    123
45678910
11121314151617
18192021222324
25262728293031

数据统计

  • 访问量: 3859
  • 日志数: 83
  • 建立时间: 2008-02-08
  • 更新时间: 2008-04-25

RSS订阅

Open Toolbar