zoukankan      html  css  js  c++  java
  • 自动装配

    【XML配置里的Bean自动装配】

    1.Spring IOC容器可以自动装配Bean。需要做的就是仅仅在<bean>的autowire属性里指定自动装配的模式

    --byType(根据类型自动装配):若IOC容器中有多个与目标Bean类型一致的Bean。在这种情况下,Spring将无法判断哪个Bean最合适该属性,所以不能执行自动装配。

    --byName(根据名称自动装配):必须将目标Bean的名称和属性名设置的完全相同。

    --constructor(通过构造器自动装配):当Bean中存在多个构造器时,此种自动装配方式将会很复杂。不推荐使用

    (1)当使用p标签配置时:

    配置文件代码:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:p="http://www.springframework.org/schema/p"
     5     xsi:schemaLocation="http://www.springframework.org/schema/beans
     6         http://www.springframework.org/schema/beans/spring-beans.xsd">
     7 
     8   <bean id="address" class="com.hk.beans.autowire.Address"
     9         p:city="Beijing" p:street="GuoMao"></bean>
    10         
    11   <bean id="car" class="com.hk.beans.autowire.Car"
    12         p:brand="Audi" p:price="300000"></bean>
    13  
    14   <bean id="person" class="com.hk.beans.autowire.Person"
    15         p:name="Tom" p:address-ref="address" p:car-ref="car"></bean>
    16 
    17 </beans>

    运行结果:

    1 Person [name=Tom, address=Address [city=Beijing, street=GuoMao], car=Car [brand=Audi, price=300000.0]]

    (2)当用自动装配时:

    (i)byName方式:根据bean的名字和当前bean的setter风格的属性名进行自动装配。若有匹配的,则进行自动装配,没有匹配的则不装配。

    配置文件代码:

    运行结果:

    1 Person [name=Tom, address=Address [city=Beijing, street=GuoMao], car=Car [brand=Audi, price=300000.0]]

    注意:在配置文件中配置bean时,id属性的值必须和javabean代码的变量名相同。

    否则:

    配置文件中:

    运行结果:

    (ii)byType方式:根据bean的类型和当前bean的属性的类型进行自动装配。

    配置文件代码:

    1   <bean id="person" class="com.hk.beans.autowire.Person"
    2         p:name="Tom" autowire="byType"></bean>

    运行结果:

    1 Person [name=Tom, address=Address [city=Beijing, street=GuoMao], car=Car [brand=Audi, price=300000.0]]

    注:但是,当配置文件中由两个及以上的相同类型的bean时,会发生错误。

    如:

    配置文件中有:

    1   <bean id="address" class="com.hk.beans.autowire.Address"
    2         p:city="Beijing" p:street="GuoMao"></bean>
    3 
    4   <bean id="address2" class="com.hk.beans.autowire.Address"
    5         p:city="Shanghai" p:street="Songjianglu"></bean>

    运行时会出现以下错误:

     No qualifying bean of type [com.hk.beans.autowire.Address] is defined: expected single matching bean but found 2: address,address2

    【自动装配的缺点】

    1.在Bean配置文件里设置autowire属性进行自动装配将会配置Bean的所有属性。然而,若只希望装配个别属性时,autowire属性就不够灵活了。

    2.autowire属性要么根据类型自动装配,要么根据名称自动装配,不能两者兼而有之。

    3.一般情况下,在实际项目中很少使用自动装配因为和自动装配所带来的好处相比,明确清晰的配置文档更有说服力。

    【附录】

    Address.java:

     1 package com.hk.beans.autowire;
     2 
     3 public class Address {
     4     private String city;
     5     private String street;
     6     
     7     public String getCity() {
     8         return city;
     9     }
    10     public void setCity(String city) {
    11         this.city = city;
    12     }
    13     public String getStreet() {
    14         return street;
    15     }
    16     public void setStreet(String street) {
    17         this.street = street;
    18     }
    19     @Override
    20     public String toString() {
    21         return "Address [city=" + city + ", street=" + street + "]";
    22     }
    23 }

    Car.java:

     1 package com.hk.beans.autowire;
     2 
     3 public class Car {
     4     private String brand;
     5     private double price;
     6     
     7     public String getBrand() {
     8         return brand;
     9     }
    10     public void setBrand(String brand) {
    11         this.brand = brand;
    12     }
    13     public double getPrice() {
    14         return price;
    15     }
    16     public void setPrice(double price) {
    17         this.price = price;
    18     }
    19     @Override
    20     public String toString() {
    21         return "Car [brand=" + brand + ", price=" + price + "]";
    22     }
    23 }

    Person.java:

     1 package com.hk.beans.autowire;
     2 
     3 public class Person {
     4     private String name;
     5     private  Address address;
     6     private Car car;
     7     
     8     public String getName() {
     9         return name;
    10     }
    11     public void setName(String name) {
    12         this.name = name;
    13     }
    14     public Address getAddress() {
    15         return address;
    16     }
    17     public void setAddress(Address address) {
    18         this.address = address;
    19     }
    20     public Car getCar() {
    21         return car;
    22     }
    23     public void setCar(Car car) {
    24         this.car = car;
    25     }
    26     @Override
    27     public String toString() {
    28         return "Person [name=" + name + ", address=" + address + ", car=" + car
    29                 + "]";
    30     }
    31 }
    每接触一个新领域,我就像一块掉进水里的海绵,四面八方的养分都让我不断充实。O(∩_∩)O~
  • 相关阅读:
    GDB调试汇编堆栈过程分析
    20145335郝昊 《信息安全系统设计基础》第11周学习总结
    20145335郝昊 《信息安全系统设计基础》第10周学习总结
    信息安全系统设计基础》实验五实验报告
    《信息安全系统设计基础》实验四实验报告
    《信息安全系统设计基础》实验二实验报告
    20145335郝昊 《信息安全系统设计基础》第9周学习总结
    20145335《信息安全系统设计基础》实验一实验报告
    20145335郝昊 《信息安全系统设计基础》期中总结
    20145334 《信息安全系统设计基础》第十二周学习总结
  • 原文地址:https://www.cnblogs.com/zhzcode/p/9603540.html
Copyright © 2011-2022 走看看