在spring容器内拼凑bean叫作装配装配bean的时候你是在告诉容器需要哪些bean以及容器如何使用依赖注入将它们配合在一起
理论上bean装配可以从任何资源获得包括属性文件关系数据库等但xml是最常见的spring 应用系统配置源Spring中的几种容器都支持使用xml装配bean包括
XmlBeanFactory
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
XmlWebApplicationContext
基本的xml配置包括如下几个方面
添加一个bean
设置bean的属性
手动设置
通过Setter方法
通过构造器
自动设置
其中bean的属性即为bean里的成员变量这些成员变量值的获得可以通过setter方法例如某个属性为name则setter方法为setName(String name)或者通过构造器在类被实例化时初始化Setter方法(例如setName方法)或者构造器的调用都可以通过在xml文件里进行配置从而实现让spring容器来自动进行
添加一个bean
以下是一个例子
<bean
id = mybean
Class = blogspringMyBean
Singleton = false
initmethod = initMethod
destroymethod = destroyMethod
autowire = autowire type
/>
下面是对该标签里各个属性的解释
Id 标识该bean的名称通过factorygetBean(id)来获得实例
Class 该bean的类路径
Singleton 默认为true即单实例模式每次getBean(id)时获取的都是同
一个实例如果设置为false即原型模式则每次获取的是新创建的实例
Initmethod 在bean实例化后要调用的方法(bean里定义好的方法)
Destroymethod bean从容器里删除之前要调用的方法
Autowire 其属性要通过何种方法进行属性的自动装配
对于上述的各个属性id和class是必要的其他的则可以省略例如如果设置了autowire的值则表明需要自动装配否则是手动装配
通过Setter方法手动设置bean里的属性
Bean里的属性通过<property>标签来标识有以下几种情况
● 简单类型属性
<bean id = mybean class = blogspringMyBean>
<property name = name>
<value>springTest</value>
</property>
</bean>
● 引用其他bean <bean id = mybean class = blogspringMyBean />
<bean id = mybean class = blogspringMyBean />
<bean id = mybean class = blogspringMyBean>
<property name = name>
<ref bean = mybean />
</property>
</bean>
也可以将<ref>改为 <bean class = ……>
这样叫做内部bean缺点是无法在其他地方重用这个bean的实例
● 装配集合
共有以下几种集合的装配 ****装配List和数组****
****装配List和数组****
<property name = nameList>
<list>
<value>something</value>
<ref bean = blogspringMyBean />
<value>otherThing</value>
</list>
</property>
****装配Set****
<property name = nameList>
<set>
<value>something</value>
<ref bean = blogspringMyBean />
<value>otherThing</value>
</set>
</property>
****装配Map****
<property name = nameList>
<map>
<entry key = key>
<value>value</value>
</entry>
<entry key = key>
<ref bean = mybean />
</entry>
</map>
</property>
****装配Properties****
<property name = nameList>
<props>
<prop key = prop>value</prop>
<prop key = prop>value</prop>
</props>
</property>
● 设置null
要将一个属性null需要通过<null />标签如果不设置则属性为默认值(在实例化时)而不是null
<property name=name> <null /> </property>
通过构造器手动设置bean里的属性
假设有如下一个bean
Public class MyBean {
Public MyBean( String arg MyBean arg String arg )
}
则可以在xml里这样配置该bean
<bean id = mybean class = blogspringMyBean>
<constructorarg index = >
<value>springTest</value>
<constructorarg>
<constructorarg index = >
<ref bean = mybean />
<constructorarg>
</bean>
其中的index是用来标识该参数在构造函数里的位置的并从开始
让spring完成自动装配
例如
<bean
id = mybean
class = blogspringMyBean
autowire = autowire type
/>
下面是几种autowire type的说明
● byname 试图在容器中寻找和需要自动装配的属性名相同的bean或id如果没有找到相应的bean则这个属性未被装配上
● byType 试图在容器中寻找一个与需要自动装配的属性类型相同的bean或id如果没有找到则该属性未被装配上
● constructor 试图在容器中寻找与需要自动装配的bean的构造函数参数一致的一个或多个bean如果没找到则抛出异常
● autodetect 首先尝试使用constructor来自动装配然后再使用byType方式
从上面可以看出如果某个bean不手动设置autowire属性则默认为手动装配如果需要将所有bean都设置为自动装配时可以通过在<beans>标签中设置defaultautowire属性<beans>标签是整个xml文档的根在它下面就是一个个的<bean>
其中defaultautowire的值也有byNamebyTypeconstructorautodetect四种
例如配置如下
<beans defaultautowire = byName>
</beans>
自动装配可能带来不确定性问题例如使用byType时可能同时发现两个相同的类型则不知道该采用哪一个所以可能混合采用自动和手动装配例如对某个bean设置为自动装配而对其某个属性则手动明确的设置其值例如
<bean id = mybean class = blogspringMyBean
Autowire = byType
>
<property name = name>
<ref bean = myBean>
</property>
</bean>
通过这样的配置对mybean里的name属性进行手动装配而对除name外的其他属性就进行自动装配