• Spring注解驱动之@Autowired、@Qualifier、@Primary


    概述

    @Autowired注解

    @Autowired注解可以对类成员变量、方法和构造函数进行标注,完成自动装配的工作。
    下面我们来看一下@Autowired注解的源码,如下所示。
    在这里插入图片描述
    说明:

    1. @Autowired注解默认是优先按照类型去容器中找对应的组件,相当于是调用了如下方法:
    applicationContext.getBean(类名.class);
    
    • 1
    1. 如果找到多个相同类型的组件,那么就将属性名称作为组件id,到IOC容器中进行查找,这是就相当于是调用了如下方法。
    applicationContext.getBean("组件的id");
    
    • 1

    @Qualifier注解

    @Autowired是根据类型进行自动装配的,如果需要按照名称进行装配,那么就需要配置@Qualifier注解来使用了。
    下面我们来看一下@Qualifier注解的源码,如下所示。
    在这里插入图片描述

    @Primary注解

    在Spring中使用注解时,常常会使用@Autowired注解,它默认是根据类型Type来自动注入的。但有些特殊情况,对同一个接口而言,可能会有几种不同的实现类,而在默认只会采取其中一种实现的情况下,就可以使用@Primary注解来标注优先使用哪个实现类。
    下面我们来看一下@Primary注解的源码,如下所示。
    在这里插入图片描述

    自动装配

    在进行项目实战之前,我们先来说说什么是Spring组件的自动装配。Spring组件的自动装配就是Spring利用依赖注入,也就是我们通常所以说的DI,完成IOC容器中各个组件的依赖关系复杂。

    项目实战

    测试@Primary注解

    在Spring中,对同一个接口而言,可能会有几种不同的实现类,而默认只会采用其中一种实现的情况下,就可以使用@Primary注解来标注优先使用哪个实现类。
    @Primary相当于在一个接口多个实现类的情况下,默认注入的类型。
    如果IOC容器中相同类型的组件有多个,那么我们不可避免的就要来回用@Qualifier注解来指定要装配哪个组件,这还是比较麻烦的,Spring正是帮我们考虑到了这样一种情况,就提供了这样一搞比较强大的注解@Primary。我们可以利用这个注解让Spring进行自动装配的时候,默认使用首选的bean。
    首先,我们在MainConfigOfAutowired配置类的bookDao()方法上添加上@Primary注解,如下所示。

    package com.meimeixia.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    
    import com.meimeixia.dao.BookDao;
    
    @Configuration
    @ComponentScan({"com.meimeixia.service", "com.meimeixia.dao", "com.meimeixia.controller"})
    public class MainConfigOfAutowired {
    	
    	@Primary
    	@Bean("bookDao2")
    	public BookDao bookDao() {
    		BookDao bookDao = new BookDao();
    		bookDao.setLable("2");
    		return bookDao;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    注意:此时,我们需要注释掉BookService类中bookDao字段上的@Qualifier注解,这是因为@Qualifier注解为显示指定装配哪个组件,如果使用了@Qualifier注解,无论是否使用了@Primary注解,都会装配@Qualifier注解标注的对象。

    package com.meimeixia.service;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Service;
    
    import com.meimeixia.dao.BookDao;
    
    @Service
    public class BookService {
    
    //	@Qualifier("bookDao") // 要让首选装配起效果,@Qualifier自然就不能用了
    	@Autowired
    	private BookDao bookDao;
    	
    	public void print() {
    		System.out.println(bookDao);
    	}
    
    	@Override
    	public String toString() {
    		return "BookService [bookDao=" + bookDao + "]";
    	}	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    那我们非要装配bookDao,可不可以呢?当然可以了,我们只须使用@Qualifier(“bookDao”)来显示指定装配bookDao即可。也就是说如果是在没有明确指定的情况下,那么就装配优先级最高的首选的那个bean,如果是在明确指定了的情况下,那么自然就是装配指定的那个bean了。
    因此,我们可以为BookService类中的bookDao字段再次添加@Qualifier注解,如下所示。

    package com.meimeixia.service;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Service;
    
    import com.meimeixia.dao.BookDao;
    
    @Service
    public class BookService {
    
    	@Qualifier("bookDao")
    	@Autowired(required=false)
    	private BookDao bookDao;
    	
    	public void print() {
    		System.out.println(bookDao);
    	}
    
    	@Override
    	public String toString() {
    		return "BookService [bookDao=" + bookDao + "]";
    	}	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    参考

    [Spring注解驱动开发第20讲——使用@Autowired、@Qualifier、@Primary这三大注解自动装配组件,你会了吗?(https://liayun.blog.csdn.net/article/details/110492582)

  • 相关阅读:
    spring中的@Configuration配置类和@Component
    MySQL索引相关知识整理学习
    计算机的体系与结构
    vue-cli创建自定义preset预设项目
    6、链表和数组,哪个实现队列更快?
    车牌号识别易语言代码
    【MySQL】SQL常用函数总结
    redis之变慢了该如何排查?
    QT 完成登陆界面跳转到聊天室+完成学生管理系统的查找和删除功能
    Web阶段一 静态网页
  • 原文地址:https://blog.csdn.net/tianzhonghaoqing/article/details/126711241