1.根据属性的set方法注入
①.Bean对象的属性必须要有对应的set方法,get方法可以没有
2.构造器注入
①.以下两种方式是等效的,可以指定是构造器的第几个参数
<bean id="car1" class="com.ly.spring.model.Car">
<constructor-arg value="宝马"></constructor-arg>
<constructor-arg value="1000000"></constructor-arg>
<constructor-arg value="武汉"></constructor-arg>
<constructor-arg value="300"></constructor-arg>
</bean>
<bean id="car1" class="com.ly.spring.model.Car">
<constructor-arg value="宝马" index="0"></constructor-arg>
<constructor-arg value="1000000" index="1"></constructor-arg>
<constructor-arg value="武汉" index="2"></constructor-arg>
<constructor-arg value="300" index="3"></constructor-arg>
</bean>
②.构造器匹配问题
public Car(String brand, double maxSpeed ,String location)
{
this.brand = brand;
this.location = location;
this.maxSpeed = maxSpeed;
}
public Car(String brand, int price, String location)
{
this.brand = brand;
this.price = price;
this.location = location;
}
<bean id="car1" class="com.ly.spring.model.Car">
<constructor-arg value="宝马"></constructor-arg>
<constructor-arg value="500000"></constructor-arg>
<constructor-arg value="上海"></constructor-arg>
</bean>
此时原则上讲这种配置对于以上两个构造器都配置,但实际上它会匹配上第二个构造器,这跟这两个构造器出现的先后顺序有关,会匹配到后面的那个构造器。
为了能更好的匹配上,我们可以使用type属性来区分:
<bean id="car1" class="com.ly.spring.model.Car">
<constructor-arg value="宝马"></constructor-arg>
<constructor-arg value="500000" type="double"></constructor-arg>
<constructor-arg value="上海"></constructor-arg>
</bean>
3.Bean属性字面值注入还可以使用<value/>子标签,以下两种方式是等效的
<bean id="car1" class="com.ly.spring.model.Car">
<constructor-arg value="宝马"></constructor-arg>
<constructor-arg value="500000" type="double"></constructor-arg>
<constructor-arg value="上海"></constructor-arg>
</bean>
<bean id="car1" class="com.ly.spring.model.Car">
<constructor-arg>
<value>宝马</value>
</constructor-arg>
<constructor-arg type="double">
<value>5000</value>
</constructor-arg>
<constructor-arg>
<value>上海</value>
</constructor-arg>
</bean>
4.此时注入的值为"宝马"和"上海",引号被原样输出了
<bean id="car1" class="com.ly.spring.model.Car">
<constructor-arg>
<value>"宝马"</value>
</constructor-arg>
<constructor-arg type="double">
<value>5000</value>
</constructor-arg>
<constructor-arg>
<value>"上海"</value>
</constructor-arg>
</bean>
5.如果字面值有特殊字符,使用<![CDATA[属性值]]>,此时注入的值为<上海**>
<bean id="car1" class="com.ly.spring.model.Car">
<constructor-arg>
<value>"宝马"</value>
</constructor-arg>
<constructor-arg type="double">
<value>5000</value>
</constructor-arg>
<constructor-arg>
<value><![CDATA[<上海**>]]></value>
</constructor-arg>
</bean>
6.Bean的引用,以下两种方式等效
<bean id="person" class="com.ly.spring.model.Person">
<property name="age" value="26"></property>
<property name="name" value="tom"></property>
<property name="car" ref="car1"></property>
</bean>
<bean id="person" class="com.ly.spring.model.Person">
<property name="age" value="26"></property>
<property name="name" value="tom"></property>
<property name="car">
<ref bean="car1"/>
</property>
</bean>
7.内部Bean不可以被引用,也不可以通过getBean方法来获取
<bean id="person" class="com.ly.spring.model.Person">
<property name="age" value="20"></property>
<property name="name" value="tom"></property>
<property name="car">
<bean id="car2" class="com.ly.spring.model.Car">
<constructor-arg value="宝马"></constructor-arg>
<constructor-arg value="5000" type="double"></constructor-arg>
<constructor-arg value="上海"></constructor-arg>
</bean>
</property>
</bean>
8.级联属性注入,必须先实例化car(也可以在Person的构造器中实例化),而且Car这个类里面对于属性brand必须要有set方法
<bean id="person" class="com.ly.spring.model.Person">
<property name="age" value="25"></property>
<property name="name" value="Tom"></property>
<property name="car" ref="car1"></property>
<property name="car.brand" value="奥迪"></property>
</bean>