Spring的依赖注入

1 依赖注入之setter注入

配置bean时为属性赋值:

<bean id="studentOne" class="com.atguigu.spring.bean.Student">
  <!-- property标签:通过组件类的setXxx()方法给组件对象设置属性 -->
  <!-- name属性:指定属性名(这个属性名是getXxx()、setXxx()方法定义的,和成员变量无关)
-->
  <!-- value属性:指定属性值 -->
  <property name="id" value="1001"></property>
  <property name="name" value="张三"></property>
  <property name="age" value="23"></property>
  <property name="sex" value="男"></property>
</bean>

2 依赖注入之构造器注入:

<bean id="studentTwo" class="com.atguigu.spring.bean.Student">
  <constructor-arg value="1002"></constructor-arg>
  <constructor-arg value="李四"></constructor-arg>
  <constructor-arg value="33"></constructor-arg>
  <constructor-arg value="女"></constructor-arg>
</bean>

注意:
constructor-arg标签还有两个属性可以进一步描述构造器参数:
index属性:指定参数所在位置的索引(从0开始)
name属性:指定参数名

3 依赖注入之特殊值处理:

①字面量赋值
什么是字面量?
int a = 10;
声明一个变量a,初始化为10,此时a就不代表字母a了,而是作为一个变量的名字。当我们引用a
的时候,我们实际上拿到的值是10。
而如果a是带引号的:'a',那么它现在不是一个变量,它就是代表a这个字母本身,这就是字面
量。所以字面量没有引申含义,就是我们看到的这个数据本身。

<!-- 使用value属性给bean的属性赋值时,Spring会把value属性的值看做字面量 -->
<property name="name" value="张三"/>

②null值

<property name="name">
  <null />
</property>

<property name="name" value="null"></property>   这样不行,会赋值为字符串“null”。

③xml实体

<!-- 小于号在XML文档中用来定义标签的开始,不能随便使用 -->
<!-- 解决方案一:使用XML实体来代替 -->
<property name="expression" value="a &lt; b"/>

④CDATA节

<property name="expression">
  <!-- 解决方案二:使用CDATA节 -->
  <!-- CDATA中的C代表Character,是文本、字符的含义,CDATA就表示纯文本数据 -->
  <!-- XML解析器看到CDATA节就知道这里是纯文本,就不会当作XML标签或属性来解析 -->
  <!-- 所以CDATA节中写什么符号都随意 -->
  <value><![CDATA[a < b]]></value>
</property>
<!--
            <:&lt;
            >:&gt;
            CDATA节其中的内容会原样解析<![CDATA[...]]>
            CDATA节是xml中一个特殊的标签,因此不能写在一个属性中
        -->

4 依赖注入之为类类型的属性赋值

方法一,引用外部的bean:

<bean id="clazzOne" class="com.atguigu.spring.bean.Clazz">
  <property name="clazzId" value="1111"></property>
  <property name="clazzName" value="财源滚滚班"></property>
</bean>

<bean id="studentFour" class="com.atguigu.spring.bean.Student">
  <property name="id" value="1004"></property>
  <property name="name" value="赵六"></property>
  <property name="age" value="26"></property>
  <property name="sex" value="女"></property>
  <!-- ref属性:引用IOC容器中某个bean的id,将所对应的bean为属性赋值 -->
  <property name="clazz" ref="clazzOne"></property>
</bean>

方法二、内部bean:

<bean id="studentFour" class="com.atguigu.spring.bean.Student">
  <property name="id" value="1004"></property>
  <property name="name" value="赵六"></property>
  <property name="age" value="26"></property>
  <property name="sex" value="女"></property>
  <property name="clazz">
    <!-- 在一个bean中再声明一个bean就是内部bean -->
    <!-- 内部bean只能用于给属性赋值,不能在外部通过IOC容器获取,因此可以省略id属性 -->
    <bean id="clazzInner" class="com.atguigu.spring.bean.Clazz">
      <property name="clazzId" value="2222"></property>
      <property name="clazzName" value="远大前程班"></property>
    </bean>
  </property>
</bean>

内部bean只能在当前bean内部使用,不能使用IOC容器获取。 

方法三、级联方式(用的少):

<bean id="clazzOne" class="com.atguigu.spring.bean.Clazz">
  <property name="clazzId" value="1111"></property>
  <property name="clazzName" value="财源滚滚班"></property>
</bean>

<bean id="studentFour" class="com.atguigu.spring.bean.Student">
  <property name="id" value="1004"></property>
  <property name="name" value="赵六"></property>
  <property name="age" value="26"></property>
  <property name="sex" value="女"></property>
  <!-- 一定先引用某个bean为属性赋值,才可以使用级联方式更新属性 -->
  <property name="clazz" ref="clazzOne"></property>
  <property name="clazz.clazzId" value="3333"></property>
  <property name="clazz.clazzName" value="最强王者班"></property>
</bean>

5 依赖注入之为数组类型的属性赋值

hobbies属性是数组类型

<bean id="studentFour" class="com.atguigu.spring.bean.Student">
  <property name="id" value="1004"></property>
  <property name="name" value="赵六"></property>
  <property name="age" value="26"></property>
  <property name="sex" value="女"></property>
  <!-- ref属性:引用IOC容器中某个bean的id,将所对应的bean为属性赋值 -->
  <property name="clazz" ref="clazzOne"></property>
  <property name="hobbies">
    <array>
      <value>抽烟</value>
      <value>喝酒</value>
      <value>烫头</value>
    </array>
  </property>
</bean>

6 依赖注入之为集合类型的属性赋值

students属性是集合类型,集合中是student类。 

<bean id="studentOne" class="com.atguigu.spring.pojo.Student"></bean>

    <bean id="studentTwo" class="com.atguigu.spring.pojo.Student">
        <property name="sid" value="1001"></property>
        <property name="sname" value="张三"></property>
        <property name="age" value="23"></property>
        <property name="gender" value="男"></property>
    </bean>
    <bean id="studentThree" class="com.atguigu.spring.pojo.Student">
        <constructor-arg value="1002"></constructor-arg>
        <constructor-arg value="李四"></constructor-arg>
        <constructor-arg value="女"></constructor-arg>
        <constructor-arg value="24" name="age"></constructor-arg>
    </bean>


<bean id="clazzTwo" class="com.atguigu.spring.bean.Clazz">
  <property name="clazzId" value="4444"></property>
  <property name="clazzName" value="最强王者班"></property>
  <property name="students">
    <list>
      <ref bean="studentOne"></ref>
      <ref bean="studentTwo"></ref>
      <ref bean="studentThree"></ref>
    </list>
  </property>
</bean
配置一个集合类型的bean,需要使用util的约束
<util:list id="studentList">
    <ref bean="studentOne"></ref>
    <ref bean="studentTwo"></ref>
    <ref bean="studentThree"></ref>
</util:list>

<bean id="clazzTwo" class="com.atguigu.spring.bean.Clazz">
  <property name="clazzId" value="4444"></property>
  <property name="clazzName" value="最强王者班"></property>
  <property name="students" ref="studentList"></property>
</bean

 7 依赖注入之为map类型的属性赋值

<bean id="teacherOne" class="com.atguigu.spring.bean.Teacher">
  <property name="teacherId" value="10010"></property>
  <property name="teacherName" value="大宝"></property>
</bean>

<bean id="teacherTwo" class="com.atguigu.spring.bean.Teacher">
  <property name="teacherId" value="10086"></property>
  <property name="teacherName" value="二宝"></property>
</bean>

<bean id="studentFour" class="com.atguigu.spring.bean.Student">
  <property name="id" value="1004"></property>
  <property name="name" value="赵六"></property>
  <property name="age" value="26"></property>
  <property name="sex" value="女"></property>
  <!-- ref属性:引用IOC容器中某个bean的id,将所对应的bean为属性赋值 -->
  <property name="clazz" ref="clazzOne"></property>
  <property name="hobbies">
    <array>
      <value>抽烟</value>
      <value>喝酒</value>
      <value>烫头</value>
    </array>
  </property>
  <property name="teacherMap">
            <map>
                <entry key="10086" value-ref="teacherOne"></entry>
                <entry key="10010" value-ref="teacherTwo"></entry>
            </map>
        </property>
</bean>

配置一个map类型的bean的使用方法和集合的用法一致。

7 依赖注入之p命名空间                ·

p是一个约束 

<bean id="studentSix" class="com.atguigu.spring.pojo.Student"
        p:sid="1005" p:sname="小明" p:teacherMap-ref="teacherMap"></bean>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值