zoukankan      html  css  js  c++  java
  • (II)第十二节:基于XML的自动装配

    一、自动装配概念

      自动赋值(自动装配):仅限于对自定义类型的属性有效;自动的为属性赋值

      1)手动装配:以 value 或 ref 的方式 明确指定属性值都是手动装配;
            2)自动装配:根据指定的装配规则,不需要明确指定, Spring 自动将匹配的属性值注入到 bean 中。

    二、手动赋值

        <bean id="car" class="com.njf.spring.bean.Car">
            <property name="carName" value="宝马"></property>
            <property name="color" value="白色"></property>
        </bean>
    
        <!--
            为 Person 里面的自定义类型的属性赋值
            property:手动赋值
        -->
        <bean id="person01" class="com.njf.spring.bean.Person">
            <property name="car" ref="car"></property>
        </bean>

    三、自动赋值

      1、装配模式

      1)根据类型自动装配:将类型匹配的 bean 作为属性注入到另一个 bean 中。
                  注意:若 IOC 容器中有多个与目标 bean 类型一致的 bean,会把 NoUniqueBeanDefinitionException 的错误,这时 Spring 将无法判定哪个 bean 最合适该属性,所以不能执行自动装配;
            2)根据名字自动装配:必须将目标 bean 的名称(id属性)和属性名设置的完全相同
            3)通过构造器自动装配:当 bean 中存在多个构造器时,此种自动装配方式将会很复杂,不推荐使用;
            4)default:不采用自动装配
            5)no:不采用自动装配

      2、自动装配

      在 <bean> 里面添加上 autowire 属性可以实现自动装配
            autowire:根据某种策略自动为非字面量属性赋值(注入)
            autowire= "byName" | "byType" | "constructor" | "default" | "no"
       byName:通过要装配的bean的属性名和 Spring IOC容器中 bean 的 id 进行比较,若一致可以赋值;
            byType:spring 容器中的 bean 的类型与自动装配的 bean 的属性类型一致,就会赋值,
                            兼容性:Spring IOC 容器中的 bean 的类型也可以是自动装配 bean 的 属性的子类或实现类,可以给 父类或父接口 的 属性进行赋值(兼容性赋值)
                            
                            注意:在使用 byType 的过程中,要求 Spring IOC 容器中只能有一个匹配类型的 bean 来给属性赋值,如果有多个同类型的 bean ,会报 NoUniqueBeanDefinitionException 错。
            如果使用了自动装配,但是在 IOC 容器中没有匹配到对应的 bean ,那么该属性就会为 null。

      3、选用建议

      1)相对于使用注解的方式实现的自动装配,在 XML 文档中进行的自动装配略显笨拙臃肿,在项目中更多的是使用注解的方式实现的。
            2)在 XML 中采用自动装配的方式,会给 bean 的所有属性进行赋值(会作用于该bean中所有的非字面量属性),但如果一个 bean 有多个属性,而我们只想给其中某几个属性赋值,这时再设置 autowire 属性就极不划算了,所以这种方式开发中极少用到。

      4、代码示例

      <!--
            自动赋值(仅限于对自定义类型的属性有效)
            autowire="default/no" :不自动装配,不自动为属性赋值
    
            //按照某种规则自动装配
            autowire="byName":按照名字
                    private Car car;以属性名(car)作为 id 去容器中找到这个组件,给他赋值;
                                    如果找不到就装配 null。
                                    car = ioc.getBean("car");
    
            autowire="byType":按照类型
                    private Car car;以属性的类型作为查找依据去容器中找到这个组件,给他赋值;
                                    car = ioc.getBean(Car.class);
                                    (1)如果容器中有多个这个类型的组件,报错:NoUniqueBeanDefinitionException;
                                    (2)如果没有找到,装配 null。
    
            autowire="constructor":按照构造器进行赋值
                    public Person(Car car)
                                    (1)先按照有参构造器参数类型进行装配,没有就直接为组件装配 null 即可;
                                    (2)如果按照类型找到了多个,参数的名作为 id 继续匹配,找到就装配,找不到就装配 null,不会报错
    
            自动的为属性赋值。
    
            private List<Book> books; 容器可以把容器中所有的 Book 封装List赋值给这个属性
        -->
        <bean id="person02" class="com.njf.spring.bean.Person" autowire="byName">
        </bean>

     

     

  • 相关阅读:
    html5 to jsp
    java通过springMail发送邮件
    solr配置-Solrconfig.xml
    solr配置-Schema.xml
    solr连接数据库导入数据
    log4j 1.2 配置总结
    1-12 ARP协议
    1-11 ICMP协议
    1-10 网际层
    1-9 TCP/IP参考模型
  • 原文地址:https://www.cnblogs.com/niujifei/p/15417688.html
Copyright © 2011-2022 走看看