一、对象的创建

<?xml version="1.0" encoding="UTF-8"?>
<beans 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://www.springframework.org/schema/beans" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">

    <!-- 
    name:取名
    class:类的全路径
    scode:“内存范围”,有singleton(默认)、prototype(与Structs2结合的时候使用)、request、session。后两个不怎么用
    init-method:配置初始化方法
    destroy-method:配置销毁方法   
     -->
    <bean name="user" class="com.xanthuim.spring.User" scope="singleton"
    init-method="init" destroy-method="destroy"></bean>

    <!-- 静态工厂创建 -->
    <bean name="userFactory" class="com.xanthuim.spring.UserFactory"
        factory-method="createUserS">
    </bean>

    <!-- 动态工厂创建 -->
    <bean name="userF" class="com.xanthuim.spring.UserFactory"></bean>  
    <bean name="userFD" factory-bean="userF" factory-method="createUserD"></bean>
</beans>

二、属性的注入(set方法)

<!--
    类的属性注入,通过set方法注入的。
    name:属性名称
    value:属性值
    ref:另一个bean的名称
     -->
    <bean name="user" class="com.xanthuim.spring.User">
        <property name="id" value="19" />
        <property name="name" value="xanthuim" />
        <property name="age" value="20" />
        <property name="car" ref="car" />
    </bean>


    <bean name="car" class="com.xanthuim.spring.Car">
        <property name="name" value="兰博基尼" />
        <property name="color" value="土豪金" />
    </bean>

三、构造方法注入

首先一个User类

public class User {
    //属性省略

    //构造1
    public User(String name, Car car) {
        System.out.println("构造方法1:User(String name, Car car)");
        this.name = name;
        this.car = car;
    }

    //构造2
    public User(Car car, String name) {
        System.out.println("构造方法2:(Car car, String name)");
        this.name = name;
        this.car = car;
    }

    //构造3
    public User(Car car, Integer name) {
        System.out.println("构造方法2:(Car car, String name)");
        this.age = name;
        this.car = car;
    }
}
  • 构造方法注入1
    注意上面的构造1和构造2方法,虽然是类似的,但是如果再配置中怎么配置呢?哪个先执行呢?
<bean name="car" class="com.xanthuim.spring.Car">
    <property name="name" value="兰博基尼" />
    <property name="color" value="土豪金" />
</bean>

<!--index:就是注入的顺序,数字小的先执行-->
<bean name="user1" class="com.xanthuim.spring.User">
    <constructor-arg name="name" value="xanthuim" />
    <constructor-arg name="car" ref="car" index="0" />
</bean>
  • 构造方法注入2
    还有一种情况是构造方法的参数名一样,但类型不一样(构造方法3),那该怎么注入呢?
<!--type:指定属性的类型,注意是类全路径 -->
<bean name="user1" class="com.xanthuim.spring.User">
    <constructor-arg name="name" value="10" type="java.lang.Integer" />
    <constructor-arg name="car" ref="car" index="0" />
</bean>

四、p名称空间注入

这个是新引入的方式,但是感觉这种方式比较怪异,只是相对比较简单,用的人不多

<!--
p名称空间注入,本质还是set方法而已
1.导入p名称空间 xmlns:p="http://www.springframework.org/schema/p"
2.使用p:属性完成注入
   值类型:p:属性名="值"
   引用类型:p:属性名-ref="bean名称"
-->
<bean name="user2" class="com.xanthuim.spring.User" p:name="xanthu" p:age="19" p:car-ref="car" />

五、SPEL注入(Spring Expression Language)

<!--
SPEL还是基于属性、构造来获取数据的,因此它的值从别的bean中来。
其实它的用法就类似EL表达式,只不过使用的#号(吐槽:搞不懂老外一会儿#号一会儿$)-->
<bean name="user3" class="com.xanthuim.spring.User">
    <property name="name" value="#{user1.name}"/>
    <property name="age" value="#{user2.age}" />
    <property name="car" ref="car" />
</bean>

注意car还是需要使用ref来引用注入。

六、复杂类型注入(Array、List、Map、Properties)

  • Array
<!-- 如果数组中只有一个值的情况,可以直接使用下面的方式 -->
<property name="arr" value|ref="xanthuim" />

<!-- 多个值的注入 -->
<property  name="arr">
    <array>
        <value>huang</value>
        <value>19</value>
        <ref bean="tomcat" />
    </array>
</property>
  • List
    同Array,array改为list即可。
  • Map
<property  name="map">
    <map>
        <entry key="username" value="xanthuim" />
        <!-- value是引用 -->
        <entry key="password" value-ref="pwd" />
        <!-- key是引用,value也是引用 -->
        <entry key-ref="tomcat" value-ref="apache" />
    </map>
</property>
  • Properties
    比如应用再配置数据库连接参数
<property name="prop">
    <props>
        <prop name="driverClass">com.jdbc.mysql.Driver</prop>
        <prop name="username">root</root>
        <prop name="password">123456</root>
    </props>
</property>

不过事实上在XML中这么写还是挺繁琐的,大多数时候还是使用注解来做。