zoukankan      html  css  js  c++  java
  • spring中Bean的注入类型

    1、属性注入
        即通过setXxx()方法注入Bean的属性值或依赖对象,由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入是实际应用中最常采用的注入方式。
        属性注入要求Bean提供一个默认的构造参数,并为需要注入的属性提供对应的Setter方法。Spring先调用Bean的默认构造参数实例化Bean对象,然后通过反射的方式调用Setter方法注入属性值。
        需要指出的是:Spring只会检查Bean中是否有对应的Setter方法,至于Bean中是否有对应的属性变量则不做要求,例如配置文件中
    <property name="brand"/>的属性配置项仅要求对应类中拥有setBrand()方法,但类中不一定要拥有brand成员变量。
        注:JavaBean的属性变量名必须满足“变量的前两个字母要么全部大写,要么全部小写”的要求。
        配置信息:
        <bean id="car" class="com.sample.domain.Car">
            <property name="brand"><value>奔驰</value></property>
        <bean>

    2、构造函数注入
        它保证一些必要的属性在Bean实例化时就得到设置,并且确保了Bean实例在实例化后就可以使用。
        1)按类型匹配入参,如果需要Car对象都必须提供brand和price的值,使用属性注入方式只能人为在配置是提供保证,而无法在语法级提供保证,而构造函数注入就可以满足这一要求。使用构造函数注入的前提是Bean必须提供带参的构造函数。
        配置信息:
        <bean id="car1" class="com.sample.domain.Car">
            <constructor-arg type="java.lang.String">
                <value>奔驰</value>
            </constructor-arg>
            <constructor-arg type="double">
                <value>20000</value>
            </constructor-arg>
        </bean>
        注:配置信息中是通过type来匹配类中的属性,与顺序无关。
        2)按索引匹配注入,由于按照类型匹配注入存在缺陷(如果构造函数中的参数类型相同,则无法正确匹配),所以提供了按照索引匹配的方法,配置信息:
        <bean id="car2" class="com.sample.domain.Car">
            <constructor-arg index="0" value="奔驰" />
            <constructor-arg index="1" value="20000"  />
        </bean>
        3)按照类型和索引综合注入,就是将1)和2)结合使用。
        配置信息:
        <bean id="car3" class="com.sample.domain.Car">
            <constructor-arg index="0" type="java.lang.String">
                <value>奔驰</value>
            </constructor-arg>
            <constructor-arg index="1" type="double">
                <value>20000</value>
            </constructor-arg>
        </bean>
        注:对于由于参数数目相同而类型不同所引起的潜在配置歧义问题,Spring容器可以正常启动且不会给出报错信息,它将随机采用一个匹配的构造函数实例化Bean,而被选择的构造函数可能并不是用户所希望的。因此,必须特别谨慎。
        4)通过自身类型反射匹配入参。如果Bean构造函数入参的类型是可辨别的(非基础数据类型且入参类型各异),由于Java反射机制可以获取构造函数入参的类型,即使构造函数注入的配置不提供类型和索引的信息,Spring依旧可以正确的完成构造函数的注入。
        配置信息:
        <bean id="boss" class="com.sample.domain.Boss">
            <constructor-arg>
                <value>John</value>
            </constructor-arg>
            <constructor-arg>
                <ref bean="car" />
            </constructor-arg>
        </bean>
        注:循环依赖问题,Spring容器能顺利实例化以构造函数注入方式配置的Bean有一个前提:Bean构造函数入参引用的对象必须已经准备就绪。由于这个机制的限制,如果相互引用的两个Bean都采用构造注入,而且都通过构造函数入参引用对方,就会发生类似线程死锁的循环依赖问题。

  • 相关阅读:
    poj 2411 Mondriaan's Dream 骨牌铺放 状压dp
    zoj 3471 Most Powerful (有向图)最大生成树 状压dp
    poj 2280 Islands and Bridges 哈密尔顿路 状压dp
    hdu 3001 Travelling 经过所有点(最多两次)的最短路径 三进制状压dp
    poj 3311 Hie with the Pie 经过所有点(可重)的最短路径 floyd + 状压dp
    poj 1185 炮兵阵地 状压dp
    poj 3254 Corn Fields 状压dp入门
    loj 6278 6279 数列分块入门 2 3
    VIM记事——大小写转换
    DKIM支持样本上传做检测的网站
  • 原文地址:https://www.cnblogs.com/ScorchingSun/p/3925150.html
Copyright © 2011-2022 走看看