Spring学习----------Spring 参数注入方式介绍
在Spring 的配置文件中,用户可以通过Bean的property元素进行参数注入。使用property,不但可以将String、int等字面值注入到Bean中,还可以将集合、Map等类型的注入到Bean中,此外还可以注入配置文件中其他定义的Bean。
在这里,注入参数的类型主要包含以下几种:
1.字面值
一般是指可用字符串表示的值,这些值可以通过<value>元素标签进行注入。
在默认情况下,基本数据类型及其封装类,String等类型都可以采取字面值注入的方式:
我们先看一个简单的小示例:
- <bean id=“car” class=“cn.lovepi.***.Car”>
- <property name=“maxSpeed”>
- <value>200</value>
- </property>
- <property name=“brand”>
- <value><![CDATA[红旗&CA72]]</value>
- </property>
- </bean>
可以看到在给brand的属性注入值的时候使用了一个![CDATA[红旗&CA72]]xml特殊处理标签。CDATA的作用是使xml解析器将标签的内容当作普通文本来对待,以防止某些字符串对xml格式造成破坏。
也可以使用转义序列来代替特殊字符,如下:
- <property name=“brand”>
- <value>
- 红旗&CA72
- </value>
- </property>
2.引用其他的Bean
Spring IoC 容器中定义的Bean 可以互相引用,IoC容器则充当了介绍人的角色:
先来观察一段示例代码:
- public class Boss{
- private Car car;
- public void setCar(Car car) {
- this.car = car;
- }
- }
- <bean id=“car” class=“***”/>
- <bean id=“boss” class=“***”>
- <property name=“car”>
- <ref bean=“car”></ref>
- </property>
- </bean>
可以看到,在property标签中使用了ref标签来引用了其他bean。
<ref>元素引用其他Bean的属性的方法:
- bean:通过该属性可以引用同一容器或者父容器中的bean
- local:通过该属性,只能引用同一容器中配置的bean
- parent:通过该属性,只能引入父类容器中的bean
3.内部bean
当Spring IoC 容器中的bean1只会被bean2引用,而不会被容器中任何其他Bean引用的时候,则可以将这个bean1以内部Bean的方式注入到bean2中:
例如下面这段代码:
- <bean id=“boss” class=“***”/>
- <property name=“car”>
- <bean class=“***” >
- <property name=“price” value=“200”>
- </bean>
- </property>
- </bean>
在这里我们将car这个bean以内部bean的方式注入到了boss这个bean当中。
其实内部bean和java中的匿名内部类是很相似的。
即同样都没有名字,也不能被其他bean所引用,只能在声明处为外部bean提供相关的实例注入。
而且内部bean提供了id、name、scope等属性也是会被忽略的。
4.null值
有时候,需要为某个bean的属性注入一个null值,在这里我们需要使用专用的<null/>元素标签,通过它可以为其他对象类型的属性注入null值:
例如下面这段代码:
错误的注入null值方式
- <bean id=“car” class=“***”/>
- <property name=“brand”>
- <value></value>
- </property
- </bean>
- <bean id=“car” class=“***”/>
- <property name=“brand”> <null/> </property>
- </bean>
5.级联属性
和Struts、Hibernate等框架一样,Spring支持级联属性的配置,例如当我们希望在定义bean1时直接为bean2的属性提供注入值,则可以采取以下的配置方式:
- <bean id=“boss” class=“***”>
- <property name=“car.brand”>
- <value>奔驰E级</value>
- </property>
- </bean>
其中属性值的操作为boss调用getCar().setBrand()方法。
此时,必须对boss类来进行改造,即在boss类中声明一个car的初始对象。
- public class Boss{
- private Car car = nea Car();
- public void setCar(Car car) {
- this.car = car;
- }
- }
注:Spring 3.0当中会自动为内置属性实例化一个对象。且级联属性的层级不受限制。
6.集合类型属性
java.util包中的集合类是最常用的数据结构类型,主要包括List、Set、Map以及Properties,
Spring为这些集合类型属性提供了专门的配置元素标签:
那么接下来我们看一看list的集合属性配置方法:
我们首先在类中创建一个list对象:
- public class Boss{
- private List favorites = new ArrayList();
- public List getFavorites() {
- return favorites;
- }
- public void setFavorites(List favorites) {
- this.favorites = favorites;
- }
- }
- <bean id=“boss” class=“***”>
- <property name=“favorites”>
- <list>
- <value>唱歌</value>
- <value>运动</value>
- <value>读书</value>
- </list>
- </property>
- </bean>
注:数组格式的属性值也可以使用list来进行注入
当属性为java.util.Set的时候,配置方式如下:
- public class Boss{
- private Set favorites;
- public Set getFavorites() {
- return favorites;
- }
- public void setFavorites(Set favorites){
- this.favorites = favorites;
- }
- }
- <bean id=“boss” class=“***”>
- <property name=“favorites”>
- <set>
- <value>唱歌</value>
- <value>运动</value>
- </set>
- </property>
- </bean>
- public class Boss{
- private Map favorites;
- public Map getFavorites() {
- return favorites;
- }
- public void setFavorites(Map favorites){
- this.favorites = favorites;
- }
- }
- <bean id=“boss” class=“***”>
- <property name=“favorites”>
- <map>
- <entry>
- <key><value>key01</value></key>
- <value>唱歌</value>
- </entry>
- <entry>
- <key><value>key02</value></key>
- <value>唱歌</value>
- </entry>
- </map>
- </property>
- </bean>
当map中的键和值都是对象时的配置方法:
- <entry>
- <key><ref bean=“keyBean”/></key>
- <ref bean=“valueBean”/>
- </entry>
当属性为java.util.Properties的时候(其实properties可以看作是map的特例,map中的键和值可以是任意元素,但properties中的键和值必须是字符串)配置方式如下:
- public class Boss{
- private Properties favorites;
- public Properties getFavorites() {
- return favorites;
- }
- public void setFavorites(Properties favorites){
- this.favorites = favorites;
- }
- }
- <bean id=“boss” class=“***”>
- <property name=“favorites”>
- <props>
- <prop key=“p01”>唱歌</prop>
- <prop key=“p02”>运动</prop>
- <prop key=“p01”>读书</prop>
- </props>
- </property>
- </bean>
根据JDK5.0提供的强类型集合功能,即允许为集合元素指定相应的类型。在配置文件中,允许为集合元素指定类型:
- public class Boss{
- private Map<Integer, String> favorites;
- public Map getFavorites() {
- return favorites;
- }
- public void setFavorites(Map favorites){
- this.favorites = favorites;
- }
- }
- <bean id=“boss” class=“***”>
- <property name=“favorites”>
- <map>
- <entry>
- <key><value>101</value></key>
- <value>唱歌</value>
- </entry>
- </map>
- </property>
- </bean>
配置文件中的集合合并的功能,允许子<bean>集成父<bean>的同名属性集合元素,并将子<bean>中配置的集合属性值和父<bean>中配置的同名属性值合并,作为最终<bean>的属性值:
我们来配置父bean
- <bean id=“parentBoss”abstract=“true”class=“***”>
- <property name=“favorites”>
- <set>
- <value>唱歌</value>
- <value>运动</value>
- <value>看书</value>
- </set>
- </property>
- </bean>
- <bean id=“childtBoss”parent=“parentBoss”>
- <property name=“favorites”>
- <set merge=“true”>
- <value>旅游</value>
- <value>睡觉</value>
- </set>
- </property>
- </bean>
注意:merge=“true”表示子父类集合合并,false则不合并
当需要配置一个集合类型的Bean,而不是一个集合类型的属性的时候,则可以通过util命名空间进行配置:
- <?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:util=http://www.springframework.org/schema/util
- xsi:schemaLocation=“
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/util
- http://www.springframework.org/schema/util/spring-util-3.0.xsd">
- <util:list id=“favoriteList1”list-class=“java.util.LikedList”>
- <value>看报</value>
- <value>赛车</value>
- <value>高尔夫</value>
- </util:list>
- <util:set id=“favoriteSet1”>
- <value>看报</value>
- <value>赛车</value>
- <value>高尔夫</value>
- </util:set>
- <util:map id=“favoriteMap1”>
- <entry key=“101” value=“看报”/>
- <entry key=“101” value=“赛车”/>
- </util:map>
前面我们采用完整配置格式的配置方式,但是显得很是拖沓,
Spring为字面值、引用Bean和集合都提供了相对简化的配置方式,
如下是字面值属性简化配置示例:
引用对象属性简化配置示例:
Spring提供一种自动装配的功能,就是不再使用ref进行手工装配Bean,这种方式可以减少配置文件的代码量,但是在大型项目中,不推荐使用,容易混乱。
自动装配类型:
- autowire=“byName”
- autowire=“ byType ”
- autowire=“ constructor ”
- autowire=“ autodetect ”
注意:
1. <beans>元素标签中的default-autowire属性可以配置全局自动匹配,其属性的默认值为no,标志不启用自动装配;
2. 在<beans>中定义的自动装配策略可以被<bean>的自动装配策略覆盖;