一、Xml装配Bean属性含义
1.id:指定该Bean 的唯一标识。
2.class:指定该Bean 的全限定名。
3.name:为该Bean 指定一到多个别名。多个别名可以用“,”和“;”分割。
4.autowire:指定该Bean 的属性的装配方式。
所谓自动装配是指在<BEAN>标签中不用指定其依赖的BEAN,而是通过配置的自动装配来自动注入依赖的BEAN,这种做法让我们的配置更加简单
1)no:不使用自动装配。必须通过ref 元素指定依赖,这是默认设置。由于显式指定协作者可以使配置更灵活、更清晰,因此对于较大的部署配置,推荐采用该设置。而且在某种程度上,它也是系统架构的一种文档形式。
2)byName:根据属性名自动装配。此选项将检查容器并根据
名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在
bean 定义中将autowire 设置为by name,而该bean 包含master 属性(同时提供setMaster(..)方法),Spring 就会查找名为master 的bean 定义,并用它来装配给master 属性。
<bean id=”bean” class=”cn.lpq.service.Bean”
scope=”singleton” autowire=”byName”/>
3)byType:如果容器中存在一个与指定属性类型相同的
bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么
将会抛出异常,并指出不能使用byType 方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置dependency-check=”objects”让Spring 抛出异常。
备注:spring3.0 以上不抛异常。
<bean id=”bean” class=”cn.lpq.service.Bean”
scope=”singleton” autowire=”byType”/>
4)Constructor:与byType 的方式类似,不同之处在于它应用
于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。
<bean id=”bean” class=”cn.lpq.service.Bean”
scope=”singleton”autowire=”constructor”/>
5)autodetect:通过bean 类的自省机制(introspection)来决定是使用constructor 还是byType 方式进行自动装配。如果发现默认的
构造器,那么将使用byType 方式。
<bean id=”bean” class=”cn.lpq.service.Bean”
scope=”singleton” autowire=”autodetect”/>
二、scope:指定该Bean 的生存范围
scope用来声明IOC容器中的对象应该处的限定场景或者说该对象的存活空间,即在IOC容器在对象进入相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象。
1) singleton类型的bean定义,在一个容器中只存在一个实例,所有对该类型bean的依赖都引用这一单一实例
2) scope为prototype的bean,容器在接受到该类型的对象的请求的时候,会每次都重新生成一 个新的对象给请求方,虽然这种类型的对象的实例化以及属性设置等工作都是由容器负责的,但是只要准备完毕,并且对象实例返回给请求方之后,容器就不在拥有 当前对象的引用,请求方需要自己负责当前对象后继生命周期的管理工作,包括该对象的销毁
3) request ,session和global session
这三个类型是spring2.0之后新增的,他们只适用于web程序,通常是和XmlWebApplicationContext共同使用
request:
<bean id =”requestPrecessor” class=”…RequestPrecessor” scope=”request” />
Spring容器,即XmlWebApplicationContext 会为每个HTTP请求创建一个全新的RequestPrecessor对象,当请求结束后,,该对象的生命周期即告结束
session
<bean id =”userPreferences” class=”…UserPreferences” scope=”session” />
Spring容器会为每个独立的session创建属于自己的全新的UserPreferences实例,他比request scope的bean会存活更长的时间,其他的方面真是没什么区别。
global session:
<bean id =”userPreferences” class=”…UserPreferences” scope=”globalsession” />
global session只有应用在基于porlet的web应用程序中才有意义,他映射到porlet的global范围的session,如果普通的servlet的web 应用中使用了这个scope,容器会把它作为普通的session的scope对待。
1.init-method:指定该Bean 的初始化方法。destroy-method:指定该Bean 的销毁方法。这个就像servlet中init和destroy方法一样,只不过这里在配置文件配置的
2.abstract:指定该Bean 是否为抽象的。如果是抽象的,则
spring 不为它创建实例。
3.parent
如果两个Bean 的属性装配信息很相似,那么可以利用继
承来减少重复的配置工作。
<!– 装配Bean 的继承
父类作为模板,不需要实例化,设置abstract=”true”–>
` <bean id=”parent” class=”cn.csdn.service.Parent”
abstract=”true”>
<property name=”name” value=”z_xiaofei168”/>
<property name=”pass” value=”z_xiaofei168”/>
</bean>
<!– 装配Bean 的继承
子类中用parent 属性指定父类标识或别名
子类可以覆盖父类的属性装配,也可以新增自己的属性装配
–>
` <bean id=”child” class=”cn.csdn.service.Chlid”
parent=”parent”>
<property name=”pass” value=”123123”/>
<property name=”age” value=”22”/>
</bean>
三、装配Bean 的各种类型属性值
1..简单类型属性值的装配
1 2 3 4 5 6 | <bean id="bean" class="cn.lpq.domain.Bean"> <property name="name" value="lpq"/> <property name="age"> <value>22</value> </property> </bean> |
2.引用其他Bean 的装配
1 2 3 4 5 6 7 | <bean id="bean1" class="cn.csdn.domain.Bean1"> ... </bean> <bean id="bean2" class="cn.csdn.domain.Bean2"> <!-- 引用自其他Bean 的装配--> <property name="bean1" ref="bean1"/> </bean> |
3.集合的装配
其实集合的装配并不是复杂,反而感觉到很简单,用一个例子来说明问题吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | package com.lpq.dao.impl; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import com.lpq.dao.UserDAO; import com.lpq.model.User; public class UserDAOImpl implements UserDAO { private Set<String> sets; private List<String> lists; private Map<String, String> maps; private Properties props; public Set<String> getSets() { return sets; } public void setSets(Set<String> sets) { this.sets = sets; } public List<String> getLists() { return lists; } public void setLists(List<String> lists) { this.lists = lists; } public Map<String, String> getMaps() { return maps; } public void setMaps(Map<String, String> maps) { this.maps = maps; } public Properties getProps() { return props; } public void setProps(Properties props) { this.props = props; } public void save(User u) { System.out.println("a user saved!"); } @Override public String toString() { return "sets.size:" + sets.size() + " lists.size:" + lists.size() + " maps.size:" + maps.size() + " props.size:" + props.size(); } } |
配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" > <!-- a service object; we will be profiling its methods --> <bean name="u" class="com.lpq.dao.impl.UserDAOImpl"> <!-- set --> <property name="sets"> <set> <value>1</value> <value>2</value> </set> </property> <!-- list --> <property name="lists"> <list> <value>a</value> <value>b</value> </list> </property> <!-- map --> <property name="maps"> <map> <entry key="1" value="aa"></entry> <entry key="2" value="bb"></entry> </map> </property> <!-- properties --> <property name="props"> <props> <prop key="a">haha</prop> <prop key="b">hi</prop> </props> </property> </bean> <bean id="userService" class="com.lpq.service.UserService" scope="prototype"> <constructor-arg> <ref bean="u" /> </constructor-arg> </bean> <!-- this switches on the load-time weaving --> <!-- <context:load-time-weaver /> --> </beans> |
代码
除非注明,Coder文章均为原创,转载请以链接形式标明本文地址