一个BeanDefination定义一个Bean,在XML中对应一个<bean>标记。Spring通过<bean>配置来实例化Bean,设置Bean的属性,以及设置Bean间相互的依赖性。
1. 基本配置<bean>
一个<bean>通常需要定义id与class属性。Class属性肯定是必须的。如果配置文件中配置的其它Bean中引用了该Bean,则id属性是必须的。Bean则通过id属性相互访问。例如:
<bean id=”exampleBean” class=”examples.ExampleBean”>
</bean>
上述代码等同于Java代码:
ExampleBean exampleBean = new ExampleBean();
其中,对象名exampleBean相当于配置中的id属性。
2. 工厂模式factory-method
如果一个Bean不能通过new直接实例化,而是通过工厂类的某个方法创建的,需要把<bean>的class属性配置为工厂类(或者把factory-bean属性配置为工厂类对象),factory-method属性配置为产生实例的方法:
<!—等同于exampleBean=example.MyFactoryBean.createInstance(); à
<bean id=”exampleBean” class=”example.MyFactoryBean” factory-method=”createInstance”/>
<!—等同于exampleBean2=myFactoryBean.createInstance(); à
<bean id=”exampleBean2” factory-bean=”myFactoryBean” factory-method=”createInstance”/>
3. 构造函数<constructor-arg>
如果Java Bean的构造函数带有参数,需要指定构造函数的参数。<constructor-arg/>指定构造函数参数所用的Bean或者值。多个参数时,用多个<constructor-arg/>配置即可。例如:
<bean id=”exampleBean” cl.ass=”examples.ExampleBean”> <!—定义Bean à
<constructor-arg><ref bean=”anotherExampleBean”/></constructor-arg><!—构造函数参数 à
<constructor-arg><ref bean=”yetAnotherBean”/></constructor-arg> <!--构造函数参数à
<constructor-arg><value>1</value></constructor-arg>
</bean>
每个<constructor-arg>配置一个参数,参数有先后顺序,顺序要与构造函数相同。<ref bean=”anotherExampleBean”/>表示参数名为anotherExampleBean的另一个Bean对象。等同于Java代码:
Public class ExampleBean{
Private AnotherBean beanOne;
Private YetAnotherBean beanTwo;
Private int i;
Public ExampleBean(AnotherBean anotherBean,YetAnotherBean yetAnotherBean,int i){
This.beanOne = anotherBean;
This.beanTwo = yetAnotherBean;
This.i = i;
}
}
4. 单态模式singleton
Bean可以定义是否为单态模式(Singleton)。单态模式也称为单例模式,即在程序中只有一个实例。单例模式是个很有用的模式,有的Java对象在程序中只要有一个便足够用了,多了会浪费资源。像数据源等Bean一般配置为单态模式。Spring默认为单态模式,如果想使用非单态模式(称为Prototype模式),需把singleton属性置为false:
<bean id=”exampleBean” class=”examples.ExampleBean” singleton=”false”/>
非单态模式下,每次请求该Bean,都会生成一个新的对象。
5. 配置属性<property/>
Spring通过Bean的setter方法设置属性。因此,需要由Spring注射的属性一般都具有公共的getter,setter方法。例如下面的配置代码:
<bean id=”dataSource” class=”org.apache.commons.dbcp.BasicDataSource” destory-method=”close”>
<property name=”driverClassName”>
<value>com.mysql.jdbc.Driver</value>
</property>
<property name=”url” value=”jdbc:mysql://localhost:3306/mydb”>
</property>
<property name=”username” value=”root”/>
<property name=”defaultAutoCommit” value=”false”/>
<property name=”maxActive” value=”100”/>
</bean>
Destroy-method属性配置关闭方法。如果有配置,在丢弃Java对象时会调用该方法。某些数据源,SessionFactory等对象都需要用destroy-method配置关闭方法。<property>配置了String,boolean,int类型的属性。注意各个<property>的写法略有不同,既可以使用value属性,也可以使用<value>字元素标签,效果是等价的。等同于Java代码:
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(“com.mysql.jdbc.Driver”);
dataSource.setUrl(“jdbc:mysql://localhost:3306/myweb”)
dataSource.setUsername(“root”);
dataSource.setDefaultAutoCommit(false);
dataSource.setMaxActive(100);
注:
<property name=”password”>
<value></value>
</property>
会将password属性设置为””,而不是null。如果设置null属性,可以使用<null/>:
<property name=”password”>
<null/>
</property>
或者干脆不设置。
6. 设置对象属性<ref>
Spring配置文件中的Bean之间可以相互引用,引用时间<ref>标签配合Bean的id属性使用。<ref/>既可以用在<property/>属性中,也可以用在<construct-arg/>构造函数的参数中,还可以用在其他的地方。例如:
<bean id=”dao” class=”com.zhangjie.spring.example.DaoImpl”></bean>
<bean id=”serviceImpl” class=”com.zhangjie.spring.example.ServiceImpl”> <!--Service à
<property name=”dao”> <!—设置属性 à
<ref bean=”dao”/> <!—属性值为DAO对象 à
</property>
</bean>
<ref>的bean属性为目标< bean>的id属性。也可以使用<property>的ref属性,这是一种简写的方式,适用于只有一个值的情况,例如:
<property name=”dao” ref=”dao”></property>
或者使用内部配置(或者内联配置),类似与Java中的匿名类对象。因为内部配置一般不会被其他的Bean引用,因此不需要配置内部Bean的id。例如:
<property name=”dao”>
<bean class=”com.zhangjie.spring.example.DaoImpl”></bean>
</property>
除了使用<ref>的bean属性,还可以使用local,parent,它们与bean属性的作用是一样的。不同的是,local只能使用本配置文件中的bean,而parent只能使用父配置文件中的bean,但bean则没有任何限制。
7. 配置List属性<list>
<list>配置java.util.List类型的属性。List属性中可配置任意类型对象。如果为Java对象,则使用ref指定,或者使用<bean>定义新实例,如果是普通类型如Spring,int,double等直接用字符串即可。<list/>里的元素会按配置的先后顺序排序。例如:
<property name=”someList”> <!—设置List类型 à
<list> <!—list标签 à
<value>String,Integer,Double,Boolean等类型对象</value><!—String类型 à
<ref bean=”myDataSource”/> <!—Java对象à
</list>
</property>
8. 配置Set属性<set>
<set>配置java.util.Set类型的属性。Set属性中可配置任意类型对象。如果为Java对象,则使用<ref/>指定,或者使用<bean>重新定义新实例。如果是普通类型如String,int,double等,直接用字符串即可。例如:
<property name=”someSet”>
<set> <!—set标签 à
<value>String,Integer,Double,Boolean等类型对象</value> <!—String类型 à
<ref bean=”myDataSource”/> <!—Java对象 à
</set>
</property>
9. 配置Map属性<map>
<map>配置java.util.Map类型的属性。<entry>配置Map里德元素,key指定索引,value指定值。如果为Java对象,则使用ref指定,或者使用<bean>定义新实例。如果key为对象,使用key-ref属性,例如:
<property name=”someMap”> <!—设置Map类型 à
<map> <!—Map标签 à
<entry key=”yup an entry”> <!—设置key属性 à
<value>just some string</value> <!—设置value属性 à
</entry>
<entry key-ref=”myDataSource”> <!—设置key属性 à
<ref bean=”serviceImpl”/> <!—设置value属性à
</entry>
</map>
</property>
10. 配置Properties属性<props>
使用<props>与<prop>配置Properties属性。<props/>配置一个Properties对象,<prop/>配置一条属性,属性key配置索引。例如:
<property name=”props”> <!—设置Properties类型 à
<props> <!—props标签 à
<prop key=”name”>dearbaba</prop> <!—设置prop属性对 à
</props>
</property>
等价于Java代码:
Properties props = new Properties(){ //定义一个Properties
{ //实例化时执行初始化代码
Put(“url”,”[url]http://www.dearbaba.com