spring全家桶之springIOC篇 —— (6)、配置文件配置bean自动装配

自动装配类型

1、byName

通过属性的setter方法名和配置的bean的ID自动匹配,注意是用setter方法和bean匹配,不是属性去匹配。

  • Person类
package com.yusys.spring;


public class Person {
    private String name;
    private int age;
    private Car car;

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

    public void setAge(int age) {
        this.age = age;
    }

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

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

}
  • 配置文件:

<bean id="car" class="com.yusys.spring.Car">
    <property name="brand" value="BMW"></property>
    <property name="price" value="1000"></property>
</bean>

<bean id="person" class="com.yusys.spring.Person" autowire="byName">
    <property name="name" value="小明"></property>
    <property name="age" value="10"></property>
    <!-- 如果手动装配,这里有要配置car属性  -->

</bean>

上面配置了一个id为car的bean和一个设置了自动装配为byName的person。
而在Person类中,对于car属性有个setCar方法,这时候set后面的Car和car匹配到。

  • 测试类:
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Person p = (Person) ctx.getBean("person");
System.out.println(p);

结果:
这里写图片描述

如何证明是使用setter方法匹配而不是用属性匹配的呢?

  • 改造Person类
package com.yusys.spring;

public class Person {
    private String name;
    private int age;
    private Car car1;

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

    public void setAge(int age) {
        this.age = age;
    }

    public void setCar(Car car1) {
        this.car1 = car1;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", car=" + car1 + "]";
    }
}

将car属性该为car1,只有setCar不修改。再运行测试,结果一样。
如果保持car属性名不变,修改setter方法,将setCar该为setCar1,再运行测试,结果匹配不到car:
这里写图片描述

2、ByType

根据类型匹配,这种方式时根据定义的属性的类型进行匹配,如果容器中定义了class和属性类型一样的bean就匹配上了。这时候id可以省略不写。

<bean id="car" class="com.yusys.spring.Car">
    <property name="brand" value="BMW"></property>
    <property name="price" value="1000"></property>
</bean>


<bean id="person" class="com.yusys.spring.Person" autowire="byType">
    <property name="name" value="小明"></property>
    <property name="age" value="10"></property>
    <!-- 如果手动装配,这里有要配置car属性  -->

</bean>

这种方式有个很大的缺陷:如果配置了多个Car的bean,就会出错

总结:这种在配置文件中使用的自动装配还是有很多缺陷的,一般不会用。这里只是讲解下byName和byType自动装配的概念而已。在后面会有基于注解的自动装配方式也会涉及到这方面的概念。

猜你喜欢

转载自blog.csdn.net/abc997995674/article/details/80278813