zoukankan      html  css  js  c++  java
  • Spring基础——在 Spring Config 文件中基于 XML 的 Bean 的自动装配

    一、Spring IOC 容器支持自动装配 Bean,所谓自动装配是指,不需要通过 <property> 或 <constructor-arg> 为 Bean 的属性注入值的过程。

    二、配置:

    在 <bean> 的 autowire 属性里指定自动装配的模式。默认为 no 。可以通过 <beans> 根元素的 default-autowire 属性改变默认值。

    三、自动装配的三种模式:

    1.byType(根据类型自动装配):若 IOC 容器中出现多个与目标 Bean 类型一致的 Bean。Spring 无法识别使用哪个,有二义性。报异常。

    2.byName(根据名称的自动装配):必须将当前 Bean 的属性名和目标 Bean 的 id 值设置为相同。

    3.construtor(根据构造器自动装配):不推荐使用。

    四、例子

    e1:之前的方式,通过 <property> 来指定。

    <bean class="com.nucsoft.spring.Address" id="address">
      <property name="addressName" value="beijing"/>
    </bean>
    
    <bean class="com.nucsoft.spring.Phone" id="phone" p:phoneNum="123456789"/>
    
    <bean id="employee" class="com.nucsoft.spring.Employee">
      <property name="empName" value="emp01"/>
      <property name="phone" ref="phone"/>
      <property name="address" ref="address"/>
    </bean>

    输出:Employee{empName='emp01', address=Address{addressName='beijing'}, phone=Phone{phoneNum='123456789'}}

    e2:根据名称的自动装配

    <bean class="com.nucsoft.spring.Address" id="address">
      <property name="addressName" value="beijing"/>
    </bean>
    
    <bean class="com.nucsoft.spring.Phone" id="phone" p:phoneNum="123456789"/>
    
    <bean id="employee" class="com.nucsoft.spring.Employee" autowire="byName">
      <property name="empName" value="emp01"/>
    </bean>

    输出:Employee{empName='emp01', address=Address{addressName='beijing'}, phone=Phone{phoneNum='123456789'}}

    e3:根据类型的自动装配

    <bean class="com.nucsoft.spring.Address" id="address">
      <property name="addressName" value="beijing"/>
    </bean>
    
    <bean class="com.nucsoft.spring.Phone" id="phone" p:phoneNum="123456789"/>
    
    <bean id="employee" class="com.nucsoft.spring.Employee" autowire="byType">
      <property name="empName" value="emp01"/>
    </bean>

    输出:Employee{empName='emp01', address=Address{addressName='beijing'}, phone=Phone{phoneNum='123456789'}}

    如果定义多个的话,首先在 idea 中,spring config 文件会报错,给出提示。另外,如果运行的话,会报一个 org.springframework.beans.factory.NoUniqueBeanDefinitionException 这样的异常。

    五、细节问题

    1.对 <bean> 的属性设置 autowire 属性进行自动装配将会装配 Bean 的所有属性。若希望只装配某个属性时,autowire 属性就不够灵活了。

    2.虽然可以通过 autowire 属性能自动装配,但是优先级要低于通过 <property> 配置的属性。如:

    <bean class="com.nucsoft.spring.Phone" id="phone02" p:phoneNum="1234567890"/>
    <bean class="com.nucsoft.spring.Address" id="address">
      <property name="addressName" value="beijing"/>
    </bean>
    
    <bean class="com.nucsoft.spring.Phone" id="phone" p:phoneNum="123456789"/>
    
    <bean id="employee" class="com.nucsoft.spring.Employee" autowire="byName">
      <property name="empName" value="emp01"/>
      <property name="phone" ref="phone02"/>
    </bean>

    3.对于 autowire 属性的两种类型:根据类型或根据名称的自动装配不能同时使用。

    4.在实际项目中很少使用基于 XML 的 Bean 的自动装配,因为明确清晰配置更易读。

  • 相关阅读:
    交叉编译fw_printenv
    解压 xxxx.cpio.gz.u-boot
    创建Uboot 环境变量 bin 文件
    Linux快速显示图片
    移动终端的GPU显卡介绍
    Video Mode Timings
    change systemd service
    device tree DTB DTC 相互转换
    如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)- 续(附demo)
    解决h5在ios 微信中 input框键盘收起 页面底部留白
  • 原文地址:https://www.cnblogs.com/solverpeng/p/5680518.html
Copyright © 2011-2022 走看看