spring学习之自动装配

上篇文章我们已经讲了IOC和DI的一些基本概念以及 配置bean的两种 方式,其中bean配置还有一些细节性的东西,还是需要我们花点时间找相关的文档去学习了解的,例如null值配置、特殊字符配置和p命名空间等等。接下来,我们开始讲一下bean的自动装配,都将用到前面的知识。

还是先上代码吧:
一个人有名字有车有住址:

public class Person {
    private Car car;
    private String name;
    private Adress adress;
    public Car getCar() {
        return car;
    }
    public void setCar(Car car) {
        this.car = car;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Adress getAdress() {
        return adress;
    }
    public void setAdress(Adress adress) {
        this.adress = adress;
    }
    @Override
    public String toString() {
        return "Person [car=" + car + ", name=" + name + ", adress=" + adress + "]";
    }
}

车有品牌和价格:

package com.yixingu.autowire;

public class Car {
    private String brand;
    private String sprice;
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brand) {
        this.brand = brand;
    }
    public String getSprice() {
        return sprice;
    }
    public void setSprice(String sprice) {
        this.sprice = sprice;
    }
    @Override
    public String toString() {
        return "Car [brand=" + brand + ", sprice=" + sprice + "]";
    }
}

住址有城市和街道:

package com.yixingu.autowire;

public class Adress {
    private String city;
    private String street;
    @Override
    public String toString() {
        return "Adress [city=" + city + ", street=" + street + "]";
    }
    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 Adress(String city, String street) {
        super();
        this.city = city;
        this.street = street;
    }
}

接下来就是我们的配置文件了:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
    xmlns:p="http://www.springframework.org/schema/p">

    <bean id="car" class="com.yixingu.autowire.Car">
        <property name="brand" value="audi"/>
        <property name="sprice" value="300000"/>
    </bean>

    <bean id="adress" class="com.yixingu.autowire.Adress">
        <constructor-arg value="YangJiang" type="String"/>
        <constructor-arg value="XiTou" type="String"/>
    </bean>

    <bean id="person" class="com.yixingu.autowire.Person" 
    p:name="yixingu" autowire="byName">
    </bean>

</beans>

配置文件中用到了属性注入,构造器注入,p命名空间以及今天的自动装配:autowire属性。
自动装配有两种方式:byName和byType。
其中byName是根据bean的set方法属性名来配置的,如果我将配置文件中的id car改成car1,那么autowire将无法为我们自动配置到car。

byType是根据bean的属性类型来配置,如果一个配置文件中有多个同类型的bean时将抛异常,如果我们再配置一个car2,那么运行时将抛出异常。

这也是自动装配的局限性:byName和byType只能选其一;不能选择性自动装配个别bean,一旦使用了autowire属性,那么只能装配所有的属性值,不够灵活。

当然autowire还是有它的优点的,如果我们不考虑上面的局限性的话,autowire还是可以很方便地为我们实现bean的注入的。

猜你喜欢

转载自blog.csdn.net/lks1139230294/article/details/76101002
今日推荐