spring 构造方法注入和setter方法注入的XML表达
1.构造方法注入
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" > 3 <beans> 4 <bean id="person" class="com.thief.demo.Person"> 5 <constructor-arg value="1"/> 6 <constructor-arg value="Tom"/> 7 <constructor-arg ref="friend"/> 8 </bean> 9 10 <bean id="friend" class="com.thief.demo.Friend"> 11 <constructor-arg value="Jack"/> 12 </bean> 13 </beans>
2.setter方法注入
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" > <beans> <bean id="person" class="com.thief.demo.Person"> <property name="id" value="1"/> <property name="name" value="Tom"/> <property name="friend" ref="friend"/> </bean> <bean id="friend" class="com.thief.demo.Friend"> <property name="name" value="Jack"/> </bean> </beans>
3.<property>和<constructor-arg>中可用的配置项。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" > 3 <beans> 4 <!-- <value>:为对象注入String类型、基本数据类型和它们的包装器类型的数据 --> 5 <!-- 示例一 --> 6 <bean id="person" class="com.thief.demo.Person"> 7 <constructor-arg> 8 <value>11111</value> 9 </constructor-arg> 10 <property name="id"> 11 <value>11111</value> 12 </property> 13 </bean> 14 <!-- 示例二 --> 15 <bean id="person2" class="com.thief.demo.Person"> 16 <constructor-arg value="11111"/> 17 <property name="id" value="11111"/> 18 </bean> 19 20 21 <!-- <ref>:引用容器中其他的对象实例 --> 22 <bean id="person2" class="com.thief.demo.Person"> 23 <constructor-arg ref="friend"/> 24 <property name="friend" ref="friend"/> 25 </bean> 26 <bean id="friend" class="com.thief.demo.Friend"> 27 <property name="name" value="Jack"/> 28 </bean> 29 30 31 <!-- 内部<bean>:如果所依赖的对象只有当前一个对象引用,或者某个对象定义不想其他对象通过<ref>引用到它,这时候就可以使用内部<bean> --> 32 <bean id="person3" class="com.thief.demo.Person"> 33 <constructor-arg> 34 <bean class="com.thief.demo.Friend"/> 35 </constructor-arg> 36 </bean> 37 38 39 <!-- <list>:<list>对应注入对象类型为java.util.List及其子类或者数组类型的依赖对象 --> 40 <bean id="person4" class="com.thief.demo.Person"> 41 <property name="list"> 42 <list> 43 <value>11111</value> 44 <ref bean="friend"/> 45 <bean class="com.thief.demo.Friend"/> 46 </list> 47 </property> 48 </bean> 49 50 51 <!-- <set>:<set>对应注入Java Collection中类型为java.util.Set或者其子类的依赖对象 --> 52 <bean id="person5" class="com.thief.demo.Person"> 53 <property name="set"> 54 <set> 55 <value>11111</value> 56 <ref bean="friend"/> 57 <bean class="com.thief.demo.Friend"/> 58 </set> 59 </property> 60 </bean> 61 62 63 <!-- <map>:<map>对应注入对象类型为java.util.Map或者其子类类型的依赖对象 --> 64 <bean id="person6" class="com.thief.demo.Person"> 65 <property name="map"> 66 <map> 67 <entry key="id"> 68 <value>11111</value> 69 </entry> 70 <entry key="friend"> 71 <ref bean="friend"/> 72 </entry> 73 </map> 74 </property> 75 </bean> 76 77 78 <!-- <props>: <props>对应配置类型为java.util.Properties的对象依赖 --> 79 <bean id="person7" class="com.thief.demo.Person"> 80 <property name="props"> 81 <props> 82 <prop key="id">11111</prop> 83 <prop key="name">Tom</prop> 84 </props> 85 </property> 86 </bean> 87 </beans>
4.autowire
除了可以通过配置明确指定bean之间的依赖关系,Spring还提供了根据bean定义的某些特点将相互依赖的某些bean直接自动绑定的功能。通过bean的autowire属性,可以指定当前bean定义采用某种类型的自动绑定模式。这样就无需手工明确指定该bean定义相关的依赖关系,从而也可免去一些手工输入的工作量。
Spring提供了5种自动绑定模式,即no,byName,byType,constructor和autodetect。
• no
容器默认的自动绑定模式,也就是不采用任何形式的自动绑定,完全依赖手工明确配置各个bean之间的依赖关系。
• byName
按照类中声明的实例变量的名称,与XML配置文件中声明的bean定义的beanName的值进行匹配,相匹配的bean定义将被自动绑定到当前实例变量上。
• byType
如果指定当前bean定义的autowire模式为byType,那么,容器会根据当前bean定义类型,分析其相应的依赖对象类型,然后到容器所管理的所有bean定义中寻找与依赖对象类型相同的bean定义,然后将找到的符合条件的bean自动绑定到当前bean定义。
如果找不到,则不做设置。但如果找到多个,容器无法解决“该选用哪一个”的问题,需要你对该问题进行修正。所以,byType只能保证,在容器中只存在一个符合条件的依赖对象的时候才会发挥最大的作用。
• constructor
byName和byType类型的自动绑定模式是针对property的自动绑定,而constructor类型则是针对构造方法参数的类型而进行的自动绑定,它同样是byType类型的绑定模式。不过,constructor是匹配构造方法的参数类型,而不是实例属性的类型。与byType模式类似,如果找到不止一个符合条件的bean定义,那么,容器会返回错误。
• autodetect
这中模式是byType和constructor的结合体,如果对象拥有默认无参数的构造方法,容器会优先考虑byType的自动绑定模式。否则,会使用constructor模式,当然,如果通过构造方法注入绑定后还有其他属性没有绑定,容器也会使用byType对剩余的对象属性进行绑定。