Spring自动装配-autowire


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();
    }
}
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风儿吹吹吹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值