1. 说明
 
 
1.1 能注入的数据的类型
 
基本类型和String其他bean类型(在配置文件或者注解中配置过的bean)复杂类型/集合类型 
1.2 注入方式
 
使用构造函数提供使用set方法提供使用注解提供 
 
 
如果是经常变化的数据,并不适用于注入的方式
 
 
2. 分类
 
 
2.1 构造函数注入(constructor-arg)
 
标签属性:
 
type:用于指定要注入的数据的数据类型,同时该数据类型也是构造函数中某个或某些参数的类型index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值(参数索引的位置从0开始),默认的排列顺序就对应构造函数中参数的顺序name:用于指定给构造函数中指定名称的参数赋值value:用于提供基本类型和String类型的数据(也可使用子节点)(如果包括特殊字符,可以使用<![CDATA[]]>,但是只能用于子节点中)ref:用于指定其他的bean类型(在spring的ioc核心容器中出现过的bean对象)数据 
特点:在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功 弊端:改变了bean对象的实例化方式,在创建对象时,如果用不到这些数据也必须提供
 
<bean id="accountService" class="com.dudu.service.impl.AccountServiceImpl">
    <constructor-arg name="name">
        <value><![CDATA[ <费渡> ]]></value>
    </constructor-arg>
    <constructor-arg name="age" value="18"></constructor-arg>
    <constructor-arg name="birthday">
        
        <bean class="java.util.Date"></bean>
    </constructor-arg>
    
    <constructor-arg><null/></constructor-arg>
    
    <constructor-arg name="person" ref="car"/>
    <property name="car.color" value="red"/>
</bean>
 
2.2 set方法注入(property)
 
标签属性:
 
name:用于指定注入时所调用的set方法名称value:用于提供基本类型和String类型的数据ref:用于指定其他的bean类型(在spring的ioc核心容器中出现过的bean对象)数据 
优势:创建对象时没有明确的限制,可以直接使用默认构造函数 弊端:如果有某个成员必须有值,则获取对象时set方法无法保证一定注入
 
<bean id="accountServiceSet" class="com.dudu.service.impl.AccountServiceImplSet">
    <property name="name" value="骆闻舟"></property>
    <property name="age" value="21"></property>
    <property name="birthday" ref="now"></property>
</bean>
<bean id="now" class="java.util.Date"></bean>
<bean id="accountServiceSet" class="com.itheima.service.impl.AccountServiceImplSet"
      p:name="骆闻舟" p:age="30" p:birthday-ref="now">
</bean>
 
2.3 集合属性
 
用于给list结构集合注入的标签有list,array,set用于给map结构集合注入的标签有map,props结构相同,标签可以互换 
<bean id="accountServiceList" class="com.dudu.service.impl.AccountServiceImplList">
    <property name="myList">
        <list>
            <value>骆闻舟
</value>
            <value>长庚
</value>
            <value>赵锦辛
</value>
            
        </list>
    </property>
    <property name="myMap">
        <map>
            <entry key="骆闻舟" value="费渡"/>
            <entry key="长庚" value="顾昀"/>
            <entry key="黎朔" value="赵锦辛"/>
        </map>
    </property>
    
    <util:list id="cars">
        <ref bean=""></ref>
    </util:list>
</bean>
 
2.4 自动装配(autowire属性)
 
<bean id="car" class="com.dudu.beans.Car">
    <property name="brand" value="Ferrari"/>
    <property name="price" value="3000000"/>
</bean>
<bean id="address" class="com.dudu.beans.Address">
    <property name="city" value="燕城"/>
    <property name="street" value="南平大道"/>
</bean>
<bean id="person" class="com.dudu.beans.Person" autowire="byName">
    <property name="name" value="费渡"/>
</bean>
<bean id="person" class="com.dudu.beans.Person" autowire="byType">
    <property name="name" value="费渡"/>
</bean>
 
缺点:
 
如果使用自动装配,Bean中的所有引用类型都要使用自动装配类型和名字只能使用一种,不可以混合使用 
2.5 配置继承(parent属性)
 
<bean id="address1" class="com.dudu.beans.Address">
    <property name="city" value="燕城"/>
    <property name="street" value="南平大道"/>
</bean>
<bean id="address2" parent="address1">
    <property name="street" value="中央大道"/>
</bean>
 
抽象Bean(不会初始化为实例,可以作为其他Bean初始化的模板)如果一个Bean的class属性没有指定,那么这个Bean必须是一个抽象Bean 
<bean id="address1" class="com.dudu.beans.Address" abstract="true">
    <property name="city" value="燕城"/>
    <property name="street" value="南平大道"/>
</bean>
 
2.6 配置依赖(depends-on属性)
 
表示依赖于car这个Bean,如果car不存在则会报错,哪怕该Bean本身并没有配置car存在多个依赖时可以用空格或逗号隔开 
<bean id="person" class="com.dudu.beans.Person" depends-on="car address1">
    <property name="name" value="费渡"/>
</bean>
 
2.7 泛型依赖注入
 
public class BaseDao<T> {
}
 
@Repository
public class UserDao extends BaseDao<User>{
}
 
public class BaseService<T> {
    @Autowired
    private BaseDao
<T> baseDao
;
    public void add(){
        System
.out
.println("BaseService ==>> add");
        System
.out
.println(baseDao
);
    }
}
 
@Service
public class UserService<User> extends BaseService<User> {
}
 
此时被注入service的类型是UserDao@3ecd23d9 引用关系是在父类之中建立的,但是在子类中也可以建立关系并且正确注入对应类型