Linux ·

Spring autowire 自动装配简介

Spring autowire 自动装配简介

注意本文与一般spring 标注@Autowire 无关

如下例子定义了3个类 Dperson Dcar & Daddress
其中Dperson 要引用另外两个类

Dperson

package com.home.autowire;

public class Dperson {
    private String name;
    private Dcar car;
    private Daddress address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Dcar getCar() {
        return car;
    }

    public void setCar(Dcar car) {
        this.car = car;
    }

    public Daddress getAddress() {
        return address;
    }

    public void setAddress(Daddress address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Dperson [name=" + name + ", car=" + car + ", address="
                + address + "]";
    }

}

Dcar

package com.home.autowire;

public class Dcar {
    private String brand;
    private int price;

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Dcar [brand=" + brand + ", price=" + price + "]";
    }

}

Daddress

package com.home.autowire;

public class Daddress {
    private String city;
    private String street;
    private int number;

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    @Override
    public String toString() {
        return "Daddress [city=" + city + ", street=" + street + ", number="
                + number + "]";
    }

}

一般的bean定义方法(xml)

注意下面引用了p Namespace

<bean id="car" class="com.home.autowire.Dcar" p:brand="Audi" p:price="10000"/>

<bean id="address" class="com.home.autowire.Daddress" p:city="Canton" p:street="teenho" p:number="103"/>

<!--  normal assemble -->
<bean id="person1" class="com.home.autowire.Dperson" p:name="Bill" p:car-ref="car" p:address-ref="address"/>

上面这个方法是最常用的, 也是最清晰的, 一般项目也推荐上面的方法。

autowire 自动装配

在这个例子种, 所谓autowire 自动装配就是指 不用在Dperson类的bean中手动指定每个属性的值, spring会根据ByName或者ByType去找

ByName:


    <bean id="car" class="com.home.autowire.Dcar" p:brand="Audi" p:price="10000"/>

    <bean id="address" class="com.home.autowire.Daddress" p:city="Canton" p:street="teenho" p:number="103"/>

  <!--  auto wire-->
  <bean id="person2" class="com.home.autowire.Dperson" p:name="Lily" autowire="byName"/>

上面的例子例子, bean person2 会在spring xml种查找有没有 跟属性名一样名字的bean, 有就装配, 没有则赋值null

ByType:


    <bean id="car1" class="com.home.autowire.Dcar" p:brand="Audi" p:price="10000"/>

    <bean id="address1" class="com.home.autowire.Daddress" p:city="Canton" p:street="teenho" p:number="103"/>

  <!--  auto wire byType-->
    <bean id="person3" class="com.home.autowire.Dperson" p:name="Jessie" autowire="byType"/>

万一找不到跟属性名一样的bean, 也可以通过byTime来自动装配的

小结

autowire会令到spring 配置文件更加简介, 但���可读性下降了, 一般情况下其实不建议使用, 但是某些特殊情况, 例如spring 嵌入其他framework(strurt2 hibernate), autowire有时的确会使程序猿更加方便。

参与评论