spring学习之自动装配

来源:互联网 发布:原生js实现todo list 编辑:程序博客网 时间:2024/06/05 01:06

上篇文章我们已经讲了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的注入的。

原创粉丝点击