• [06] Bean属性的注入



    之前我们提到了Bean实例化的三种方式:构造器方式、静态工厂方式、普通工厂方式。那么对于Bean中的属性,又是如何进行注入的(依赖注入),这个篇章就来提一提。

    1、先提提什么是“依赖注入”

    依赖注入,就是由外部容器动态地将依赖对象注入到另一个对象的组件中,Spring采用这种方式为Bean的属性进行赋值。

    通俗地说,Spring容器不仅可以初始化对象,也可以为对象当中的成员变量进行赋值,初始化成员变量对象以及赋值的过程,不需手动编码,而是由Spring容器去做。这种依赖容器初始化对象,并赋值给Bean全局变量的方式,叫做依赖注入。

    传统方式:
    Boy boy = new Boy(); 
    Dog dog = new Dog();
    boy.setDog(dog);

    依赖注入方式:
    <bean id="boy" class="dulk.learn.spring.Boy">
        <property name="dog" ref="dog"></property>
    </bean>
    
    <bean id="dog" class="dulk.learn.spring.Dog"></bean>

    2、Bean属性的注入方式

    Bean属性的注入方式有两种:
    • 手动注入
    • 自动匹配

    手动注入可以通过注解或者配置文件的方式,采用对象的构造方法或者setter进行注入;而自动匹配则是容器通过某种规则进行自动匹配,比如byName、byType、constructOr。手动注入相比来说代码要多一些,但是并不会产生不确定性,所以还是建议更多地使用手动注入的方式。

    2.1 手动注入

    2.1.1 setter

    Spring容器调用Bean组件中属性对应的setter方法完成属性的赋值,可以分为:
    • 基本类型注入
    • Spring组件类型注入
    • 集合类型注入

    2.1.1.1 基本注入类型

    这里的基本注入类型,泛指当前Bean组件的属性为基本数据类型(如int)、基本数据类型的封装类(如Integer)、String、StringBuffer等,容器可以读取配置文件对当前属性进行赋值。

    <bean id="dog" class="dulk.learn.spring.Dog">
        <property name="name" value="旺财"></property>
    </bean>
    如上property标签即用来注入Bean的属性,name属性对应setter的属性名称,value则对应值。即这里是指将生成的Dog对象,注入其属性name为“旺财”。

    2.1.1.2 Spring组件类型注入

    这种方式正如其名,注入的值也是Spring容器管理的Bean对象:
    <bean id="boy" class="dulk.learn.spring.Boy">
        <property name="dog" ref="dog"></property>
    </bean>
    
    <bean id="dog" class="dulk.learn.spring.Dog">
        <property name="name" value="旺财"></property>
    </bean>

    2.1.1.3 集合类型注入

    集合类型注入泛指,当前Bean组件的属性为List、Set、Map、数组、Properties等
    <bean id="boy" class="dulk.learn.spring.Boy">
        <property name="dog" ref="dog"></property>
        <property name="bookList">
            <list>
                <value type="java.lang.String">《水浒传》</value>
                <ref bean="beanName"/>
                <null></null>
            </list>
        </property>
    </bean>
    
    <bean id="dog" class="dulk.learn.spring.Dog">
        <property name="name" value="旺财"></property>
    </bean>

    List中对象的顺序,按照从上到下的赋值顺序,List当中的数据类型可以为基本类型、Spring组件类型、集合类型等

    当然,如上例中是对List举例,对于Set而言也几乎是一样的,无非是将上例中的<list>标签更换为<set>,此处便不再举例了。而对于Map而言,除了将上例中<list>标签替换为<map>,因为其为键值对形式的存储,形式稍微有点变化:
    <bean id="boy" class="dulk.learn.spring.Boy">
        <property name="dog" ref="dog"></property>
        <property name="scoreMap">
            <map>
                <entry key="数学" value="99"></entry>
                <entry key="语文" value="75"></entry>
                <entry key-ref="beanId" value-ref=""></entry>
            </map>
        </property>
    </bean>

    最后简单提下Properties注入方式:
    <property name="properties">
        <props>
            <prop key="username">zhangsan</prop>
            <prop key="password">123456</prop>
        </props>
    </property>

    2.1.2 构造器

    构造器方法注入,顾名思义,是Spring在初始化Bean组件时,调用含参数的构造函数对变量进行赋值,参数类型同setter方式一样,也可以为基本类型、Bean组件类型或者集合类型。

    实际上这种属性注入方式,在关于Bean实例化的章节中已经提到了,用到了<constructor-arg>标签,我们再看下当时的例子:
    <bean id="coder" class="dulk.learn.spring.Coder">
        <constructor-arg index="0" value="Dulk"></constructor-arg>
        <constructor-arg index="1" value="27"></constructor-arg>
    </bean>

    如果依赖的是Bean组件,这里的value换成ref属性就行了。其他和setter方式类型,这里也就不再繁琐地进行展开描述了。


    2.2 自动注入

    对于自动注入(自动装配),这里暂不推荐使用,所以大概提及一下,也很简单,所以不会详细进行展开。

    自动注入的示例格式如下:
    <bean id="beanId" class="className" autowire="${type}"></bean>

    这里的自动注入autowire属性有如下取值:
    • byType
    • byName
    • constructor

    byType(默认值):按类型装配,可以根据属性的类型,在容器中寻找跟该类型匹配的Bean,如果发现多个,那么将会抛出异常,如果没有找到,那么属性值为null

    byName:按名称装配,可以根据属性的名称,在容器中寻找跟该属性名相同的Bean(Bean的id或name),如果没有找到,即属性值为null

    constructor:与byType方式类似,不同至于在于它应用于构造函数参数。如果在容器中没有找到与构造函数参数类型一致的Bean,将会抛出异常

    以上,都是在容器中寻找Bean,请注意。


  • 相关阅读:
    安装rqalpha的日志
    从github上下载一个csv文件
    PyQt4 里的表格部件的使用方法: QTableWidget
    markdown里的多层次列表项
    打包python脚本为exe的坎坷经历, by pyinstaller方法
    Spyder docstrings文档字符串的标准
    Plot Candlestick Charts in Research of quantopian
    另类之将ipython notebook嵌入blog方法
    Jupyter Notebook Tutorial: Introduction, Setup, and Walkthrough
    爬虫视频讲座
  • 原文地址:https://www.cnblogs.com/deng-cc/p/8904203.html
Copyright © 2020-2023  润新知