Spring 的属性注入

作者: 希希里之海 | 来源:发表于2019-06-17 21:13 被阅读2次

    Spring 的属性注入

    Spring 的属性注入,我们可以理解成之前说过的 DI (依赖注入)。

    注入方式

    对于类成员变量,注入方式有三种:

    • 构造函数注入
    • 属性 setter 注入
    • 接口注入

    spring 支持前两种注入方式


    1. 构造方法注入

    • 通过构造方法注入 Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用
    • 构造器注入在 ```<constructor-agr> 元素里声明的属性

    举个例子:

    <!-- Bean 的构造方法的属性注入 -->
    <bean id="user" class="com.test.ioc.demo4.User">
        <constructor-arg name="name" value="张三" />
        <constructor-arg name="age" value="23" />
    </bean>
    

    具体代码:SpringDemo4.demo1()


    2. set 方法注入

    • 使用 set 方法注入,在 Spring 配置文件中,通过 <property> 设置注入的属性

    举个例子:

    <!-- Bean 的 set 方法的属性注入 -->
    <bean id="person" class="com.test.ioc.demo4.Person">
        <property name="name" value="张三" />
        <property name="age" value="23" />
        <property name="cat" ref="cat" />
    </bean>
    
    <bean id="cat" class="com.test.ioc.demo4.Cat">
        <property name="name" value="ketty" />
    </bean>
    

    其中:

    ref 用来引入其他 bean 的 id 或 name

    普通类型的值使用 value

    对象类型的值使用 ref

    具体代码:SpringDemo4.demo2()


    3. p 名称空间注入

    • 使用 p 命名空间
    • 为了简化 XML 文件配置,Spring 从 2.5 开始引入一个新的 p 名称空间
    • p:<属性名>="xxx" 引入常量值
    • p:<属性名>-ref="xxx" 引入其他 Bean 对象

    举个例子:

    <!-- Bean 的 p 名称空间的属性注入 -->
    <bean id="person" class="com.test.ioc.demo4.Person" p:name="张三" p:age="23" p:cat-ref="cat" />
    <bean id="cat" class="com.test.ioc.demo4.Cat" p:name="阿黄"/>
    

    具体代码:SpringDemo4.demo2()

    注意:
    如果使用 p 名称空间注入,我们需要在 xml 文件开头的加入一句:

    xmlns:p="http://www.springframework.org/schema/p"
    

    表示引入 p 名称空间注入方式。


    4. SpEL 注入

    • SpEL:spring expression language,spring 表达式语言,对依赖注入进行简化
    • 语法:#{表达式}
    • <bean id="" value="#{表达式}">

    SpEL 表达式语言:

    语法:#{}
    
    #{'hello'}:使用字符串
    
    #{topicId3}:使用另一个 bean
    
    #{topicId4.content.toUpperCase()}:使用指定名属性,并使用方法
    
    #{T(java.lang.Math).PI}:使用静态字符或方法
    

    举个例子:

    <!-- Bean 的 SpEL 的属性注入 -->
    <bean id="category" class="com.test.ioc.demo4.Category">
        <property name="name" value="#{'服装'}" />
    </bean>
    
    <bean id="productInfo" class="com.test.ioc.demo4.ProductInfo" />
    
    <bean id="product" class="com.test.ioc.demo4.Product">
        <property name="name" value="#{'男装'}" />
        <property name="price" value="#{productInfo.calculatePrice()}" />
        <property name="category" value="#{category}" />
    </bean>
    

    具体代码:SpringDemo4.demo3()


    5. 复杂类型的属性注入

    • 数组类型的属性注入
    • List 集合类型的属性注入
    • Set 集合类型的属性注入
    • Map 集合类型的属性注入
    • Properties 类型的属性注入

    举个例子:

    <!-- 集合类型的属性注入 -->
    <bean id="collectionBean" class="com.test.ioc.demo5.CollectionBean">
        <!-- 数组类型 -->
        <property name="arrs">
            <list>
                <value>aaa</value>
                <value>bbb</value>
                <value>ccc</value>
            </list>
        </property>
        <!-- List 类型 -->
        <property name="list">
            <list>
                <value>111</value>
                <value>222</value>
                <value>333</value>
            </list>
        </property>
        <!-- Set 类型 -->
        <property name="set">
            <set>
                <value>ddd</value>
                <value>eee</value>
                <value>fff</value>
            </set>
        </property>
        <!-- Map 类型 -->
        <property name="map">
            <map>
                <entry key="aaa" value="111" />
                <entry key="bbb" value="222" />
                <entry key="ccc" value="333" />
            </map>
        </property>
        <!-- Properties 类型 -->
        <property name="properties">
            <props>
                <prop key="username">root</prop>
                <prop key="password">1234</prop>
            </props>
        </property>
    </bean>
    

    具体代码:SpringDemo5.demo1()

    复杂类型的属性注入,主要是在 Spring 整合其他框架的时候,会比较常用到。

    相关文章

      网友评论

        本文标题:Spring 的属性注入

        本文链接:https://www.haomeiwen.com/subject/dwttqctx.html