Spring——自动装配的三种实现方式

Posted Arno_vc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring——自动装配的三种实现方式相关的知识,希望对你有一定的参考价值。

依赖注入的本质是装配,装配是依赖注入的具体行为

1.测试环境搭建
public class Cat {
    public void bark(){
    	System.out.println("miao...");
    }
}
public class Dog {
    public void bark(){
    	System.out.println("wang...");
    }
}
public class People {
    Cat cat;
    Dog dog;

    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;
    }
}
2.byName:会自动在容器上下文中,通过set方法中的参数名去查找相同id的<bean>
<bean id="dog" class="com.guan.bean.Dog"></bean>
<bean id="cat" class="com.guan.bean.Cat"></bean>

<bean id="people" class="com.guan.bean.People" autowire="byName"></bean>
3.byType:会自动在容器上下文中,通过自己对象属性类型相同的bean
<bean id="dog" class="com.guan.bean.Dog"></bean>
<bean id="cat" class="com.guan.bean.Cat"></bean>

<bean id="people" class="com.guan.bean.People" autowire="byType"></bean>

注意

  • byName需要保证<bean>的id唯一
  • byType需要保证<bean>的type唯一
4.使用注解实现自动装配

使用:

  1. 导入约束

  2. 配置注解的支持

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

常用注解:

  1. @Autowired:需要配置spring,直接在属性上使用.先使用byType,再使用byName?

    required(default true):默认不需Null

    public class People {
        @Autowired
        Cat cat;
        @Autowired
        Dog dog;
    }
    

    @Qualifier:当属性名和容器中<bean>中的id不同时,可以通过该注解为属性"起别名"

    public class People {
        @Autowired
        @Qualifier("cat12")
        Cat cat;
        @Autowired
        Dog dog;
    }
    
  2. @Resource:jdk注解

    name:用于起别名

区别:

  1. 实现方式:

    (1).@Autoword先通过byType实现,如果有重复再通过byName,而且默认要求对象存在

    表现:同一个类型,不同名称,<bean id="dog123" class="com.guan.bean.Dog"></bean>,可以匹配;同一个名称,类型不匹配时,<bean id="dog" class="com.guan.bean.Cat"></bean>,如果只要一个对应的类型可以自动匹配,如果有多个对应的类型会报错

    (2).@Resource默认通过byName实现,如果找不到name,才通过byType,否则报错

    表现:如果有一个同名的不同类型<bean id="cat" class="com.guan.bean.Dog"></bean>,会直接报错对应的类型不匹配;如果有一个同类型的,但是不同名的,可以匹配;如果有多个同类型且不同名,无法匹配

总结:实际上xml文件中一般存放的核心配置文件,一般的配置可以用其它方式

以上是关于Spring——自动装配的三种实现方式的主要内容,如果未能解决你的问题,请参考以下文章

Spring提供的三种装配Bean方式

装配Bean的三种方式

Spring笔记03(创建对象,DI设值注入,自动装配(autowire))

Spring5依赖注入常用的三种方法:构造注入Setter注入自动装配

spring自动装配有几种方式

spring 装配bean的三种方式