当前位置: 首页 > 工具软件 > Autowire > 使用案例 >

Spring自动装配-autowire

淳于烈
2023-12-01


1.自动装配-autowire

使用基于 XML 的配置bean时,可以使用<bean / > 元素的autowire属性为 bean 定义指定自动装配模式。

自动装配具有以下优点:

  • 自动装配可以大大减少指定属性或构造函数参数的需要
  • 随着对象的 Developing,自动装配可以更新配置。

但是也有些局限性和缺点:

  • property和constructor-arg设置中的显式依赖项始终会覆盖自动装配。
  • 自动装配不如显式接线精确。
  • 接线信息可能不适用于可能从 Spring 容器生成文档的工具。
  • 容器内的多个 bean 定义可能与要自动装配的 setter 方法或构造函数参数指定的类型匹配。对于数组,集合或Map实例,这不一定是问题。但是,对于需要单个值的依赖项,不会任意解决此歧义。如果没有唯一的 bean 定义可用,则引发异常。

2.autowire的四种模式

模式解释
no(默认)无自动装配。
byName按属性名称自动装配
byType如果容器中恰好存在一个该属性类型的 bean,则使该属性自动装配。
constructor类似于byType,但适用于构造函数参数。

常用的为byName和byType
通俗来说:

byName:需要保证所有bean的id唯一,并且需要和自动装配的属性的set方法的值一致。

byType:需要保证所有的bean的calss唯一,并且这个bean需要和自动装配的属性类型一致。

3.使用自动装配

3.1 使用byName自动装配

  <bean id="cat" class="com.tang.pojo.Cat"/>
  
  <!-- 注意此时的id不一样 -->
    <bean id="dog22222" class="com.tang.pojo.Dog"/>

<!--    自动装配-->
    <bean id="people" class="com.tang.pojo.People" autowire="byName">
        <property name="name" value="一个人" />
    </bean>

注意:
byName会在上下文中查找和自己对象set后面的方法一致的beanid,如果不一致,就会报空指针异常

3.2 使用byType自动装配

<bean id="cat" class="com.tang.pojo.Cat"/>
    <bean id="dog22222" class="com.tang.pojo.Dog"/>

<!--    自动装配-->
    <bean id="people" class="com.tang.pojo.People" autowire="byType">
        <property name="name" value="一个人" />
    </bean>

注意:
byType会在上下文中查找和自己对象属性类型相同的bean

资源类和配置文件

实体类:

public class Cat {
    public void shout(){
        System.out.println("喵喵~");
    }
}
public class Dog {
    public void shout(){
        System.out.println("汪汪~");
    }
}
public class People {
    private Cat cat;
    private Dog dog;
    private String name;

    public Cat getCat() {
        return cat;
    }

    public void setCat(Cat cat) {
        this.cat = cat;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "People{" +
                "cat=" + cat +
                ", dog=" + dog +
                ", name='" + name + '\'' +
                '}';
    }
}

beans.xml:

<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">

    <bean id="cat" class="com.tang.pojo.Cat"/>
    <bean id="dog22222" class="com.tang.pojo.Dog"/>

<!--    自动装配-->
    <bean id="people" class="com.tang.pojo.People" autowire="byType">
        <property name="name" value="一个人" />
    </bean>

</beans>

测试类:

public class MyTest {
    @Test
    public void test01(){
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        People people = context.getBean("people", People.class);
        people.getCat().shout();
        people.getDog().shout();
    }
}
 类似资料: