Spring笔记 04:依赖注入

1. 说明


1.1 能注入的数据的类型

  1. 基本类型和String
  2. 其他bean类型(在配置文件或者注解中配置过的bean)
  3. 复杂类型/集合类型

1.2 注入方式

  1. 使用构造函数提供
  2. 使用set方法提供
  3. 使用注解提供

如果是经常变化的数据,并不适用于注入的方式

2. 分类


2.1 构造函数注入(constructor-arg)

标签属性:

  1. type:用于指定要注入的数据的数据类型,同时该数据类型也是构造函数中某个或某些参数的类型
  2. index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值(参数索引的位置从0开始),默认的排列顺序就对应构造函数中参数的顺序
  3. name:用于指定给构造函数中指定名称的参数赋值
  4. value:用于提供基本类型和String类型的数据(也可使用子节点)(如果包括特殊字符,可以使用<![CDATA[]]>,但是只能用于子节点中)
  5. 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 不能被外部引用-->
        <bean class="java.util.Date"></bean>
    </constructor-arg>
    <!-- 赋值为null -->
    <constructor-arg><null/></constructor-arg>
    <!-- 支持级联赋值,但是不能直接为属性赋值,需要对象已经创建出来了才可以 -->
    <constructor-arg name="person" ref="car"/>
    <property name="car.color" value="red"/>
</bean>

2.2 set方法注入(property)

标签属性:

  1. name:用于指定注入时所调用的set方法名称
  2. value:用于提供基本类型和String类型的数据
  3. 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-->
<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><!-- 标签可以换成array或set -->
            <value>骆闻舟</value>
            <value>长庚</value>
            <value>赵锦辛</value>
            <!-- <ref bean="now"><bean></bean></ref> -->
        </list>
    </property>
    <property name="myMap">
        <map><!-- 标签可以换成props -->
            <entry key="骆闻舟" value="费渡"/><!-- 标签可以换成prop -->
            <entry key="长庚" value="顾昀"/><!-- <prop key="骆闻舟">费渡</prop> -->
            <entry key="黎朔" value="赵锦辛"/>
        </map>
    </property>
    <!-- 配置独立的list -->
    <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的名字进行自动装配,根据set方法后面的字符串作为名字来寻找Bean -->
<bean id="person" class="com.dudu.beans.Person" autowire="byName">
    <property name="name" value="费渡"/>
</bean>
<!-- 按照Bean的类型进行自动装配,此时Bean的id无所谓,但Bean要是单例的,同类型的Bean有两个会报错 -->
<bean id="person" class="com.dudu.beans.Person" autowire="byType">
    <property name="name" value="费渡"/>
</bean>

缺点:

  1. 如果使用自动装配,Bean中的所有引用类型都要使用自动装配
  2. 类型和名字只能使用一种,不可以混合使用

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
引用关系是在父类之中建立的,但是在子类中也可以建立关系并且正确注入对应类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值