6、引用类型的自动装配 和 使用注解实现自动装配

一、Bean的自动装配(AutoWired):

  • 自动装配是Spring满足bean依赖一种方式! 
  •  Spring会在上下文中自动寻找,并自动给bean装配属性!

在Spring中有三种装配的方式

  1. 在xmI中显示的配置(前面的博客都是用的这种)
  2. 在java中显示配置
  3. 隐式的自动装配bean [重要 ! ]

1、配置环境

  一个人有两个宠物!

pojo实体类:

public class Cat {
    public void call(){
        System.out.println("猫在叫~");
    }
}
public class Dog {
    public void call(){
        System.out.println("狗在叫~");
    }
}
public class Person {
    private Cat cat;
    private Dog dog;
    private String name;

    @Override
    public String toString() {
        return "Person{" +
                "cat=" + cat +
                ", dog=" + dog +
                ", name='" + 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;
    }
}

beans.xml

    <bean id="cat" class="com.zhixi.pojo.Cat"/>
    <bean id="dog" class="com.zhixi.pojo.Dog"/>

    <bean id="person" class="com.zhixi.pojo.Person">
        <property name="name" value="张志喜"/>
        <property name="cat" ref="cat"/>
        <property name="dog" ref="dog"/>
    </bean>

测试文件:

    @Test
    public void test1(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bens.xml");
        Person person = (Person) context.getBean("person");
        person.getCat().call();
        person.getDog().call();

    }

猫在叫~
狗在叫~

2、aotowire属性

  byName:

    <bean id="cat" class="com.zhixi.pojo.Cat"/>
    <bean id="dog" class="com.zhixi.pojo.Dog"/>
    <!--
        byName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanid!
    -->
    <bean id="person" class="com.zhixi.pojo.Person" autowire="byName">
        <property name="name" value="张志喜"/>
    </bean>

  byType:

    <!--即使没有设置id属性,通过byType也能够找到对应的bean-->
    <bean class="com.zhixi.pojo.Cat"/>
    <bean class="com.zhixi.pojo.Dog"/>
    <!--
        byType:会自动在容器上下文中查找,和自己对象属性类型相同的bean!
    -->
    <bean id="person" class="com.zhixi.pojo.Person" autowire="byType">
        <property name="name" value="张志喜"/>
    </bean>

小结: 

 

byName:java类中的引用类型名称(Cat cat)跟bean的id是一样的 <bean id="cat"> spring能够赋值给引用类型。

bytype:java类中引用类型的数据类型和spring容器中(配置文件),<bean>的class属性是同源关系的,这样的bean能够赋值给引用类型
  同源:
    1. java类中引用类型的数据类型和bean的class的值是一样的。
    2. java类中引用类型的数据类型和bean的class的值父子类关系的。
    3. java类中引用类型的数据类型和bean的class的值接口和实现类关系的

 

二、注解实现自动装配

使用须知:不需要再xml文件中再进行配置bea了、

1、导入约束

2、配置注解的支持:<context:annotation-config/>

<?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:component-scan base-package="com.zhixi.pojo"/>
<context:annotation-config/> </beans>

注解的使用:

@AutoWired

  加到属性上面,也可以加到setter方法,或者直接加到属性上甚至set方法可以不要了、

public class Person {
    @Autowired
    private Cat cat;
    @Autowired
    private Dog dog;
    private String name;

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

@Qualifier

  如果@Autowired自动装配的环境比较复杂【比如多个bean对象】,自动装配无法通过一个注解[@Autowired] 完成的时候、我们可以

  使用@Qualifier(value="xx")去配置@Autowired的使用,指定一个唯一 的bean对象注入!

xml文件:
   <bean id="dog" class="com.zhixi.pojo.Dog"/> <bean id="dog2" class="com.zhixi.pojo.Dog"/>

  pojo实体类:
@Autowired
@Qualifier(value = "dog2")
private Dog dog;

@Resouece

    @Resource(name = "dog2")
    private Dog dog;

小结:

  @AutoWired和@Resource 的区别:

  1. 都是用来自动装配的,都可以放在属性字段上
  2. @ Autowired 通过byType的方式实现,而且必须要求这个对象存在! [常用]
  3. @ Resource默认通过byname的方式实现,如果找不到名字,则通过byType实现! 如果两个都找不到的情况下,就报错! [常用]
posted @ 2021-01-02 19:46  Java小白的搬砖路  阅读(197)  评论(0编辑  收藏  举报