Spring中的@Autowired、@Qualifier和@Primary注解详解

 更新时间:2023年11月02日 10:24:28   作者:桐花思雨  
这篇文章主要介绍了Spring中的@Autowired、@Qualifier和@Primary注解详解,@Autowired 注解,可以对类成员变量、方法和构造函数进行标注,完成自动装配的工作,@Autowired 是默认根据 byType 进行自动装配的,需要的朋友可以参考下

1. @Autowired 注解

1.1. @Autowired 注解的使用

@Autowired 注解,可以对类成员变量、方法和构造函数进行标注,完成自动装配的工作

1.1.1. 类成员变量上(较为常用)

@Controller
public class SoakController {
 
	@Autowired
	private SoakService soakService;
}

1.1.2. 用在方法上

@Controller
public class SoakController {
 
	private SoakService soakService;
	
	@Autowired 
	public void setSoakService(SoakService soakService) {
		this.soakService = soakService;
	}
}

1.1.3. 用在构造器上

@Controller
public class SoakController {
 
	private SoakService soakService;
	
	@Autowired 
	public SoakController(SoakService soakService) {
		this.soakService = soakService;
	}
}

1.1.4. 用在参数上

@Controller
public class SoakController extends BaseController {
 
	private SoakService soakService;
	
	public SoakController(@Autowired SoakService soakService) {
		this.soakService = soakService;
	}
}

1.2. @Autowired 注解的说明

  • 默认优先按照 byType 去容器中找对应的组件,找到就赋值
  • 如果找到多个相同类型的组件,再通过 byName 来到 IOC 容器中进行查找
  • 默认情况下,它具有强制契约特性,其所标注的属性必须是可装配的。如果没有 bean 可以装配到 @Autowired 所标注的属性或参数中,那么你会看到 org.springframework.beans.factory.NoSuchBeanDefinitionException 的异常信息

2. @Autowired 配合 @Qualifier

  • @Autowired 是默认根据 byType 进行自动装配的,如果需要按 byName 进行装配,则需要配合 @Qualifier 注解使用
  • 如果容器中存在多个相同类型的组件,此时需要通过 byName 来进行装配,则需要配合 @Qualifier 注解使用

组件 1

@Service
public class BookService {// 类型为 BookService,name 为 bookService

}

组件 2

@Configuration
public class MainConfigOfAutowired {

	// 类型为 BookService,name 为 bookService01
    @Bean
    public BookService bookService01() {
        return new BookService();
    }
}

测试

@Autowired
@Qualifier("bookService01")
private BookService bookService;

@Test
public void MyTest() {
	System.out.println(bookService);
}

由于容器中存在 bookService01 和 bookService 两个类型相同的组件 bean,那么此时可以使用 @Qualifier(“bookService01”) 明确指定 bean 的 name 后,@Autowired 不再根据 byType 自动装配了,而用 bookService01 作为组件的 name 去容器中查找,找到组件 2,装配成功

3. @Autowired 配合 @Primary

  • Spring 在进行自动装配的时候,会 优先 使用用 @Primary 标注指定的 bean
  • 如果容器中有多个组件 Type 类型相同,注入的 bean 的 Name 名称也相同,那么此时就可以使用 @Primary 注解,将某一个组件 优先 注入
  • 不能把多个 bean 都标注为 @Primary,不然你会得到 NoUniqueBeanDefinitionException 这个异常

组件 1

@Service
public class BookService { // 类型为 BookService,name 为 bookService

}

组件 2

@Configuration
public class MainConfigOfAutowired {

	// 类型为 BookService,name 为 bookService01
    @Primary
    @Bean
    public BookService bookService01() {
        return new BookService();
    }
}

测试 1

@Autowired
private BookService bookService;

@Test
public void MyTest() {
	System.out.println(bookService);
}

因为组件 2 使用了 @Primary 注解标注,所以 @Autowired 会优先使用 name 为 bookService01 进行装配

测试 2

@Qualifier("bookService")
@Autowired
private BookService bookService;

@Test
public void MyTest() {
	System.out.println(bookService);
}

虽然组件 2 使用了 @Primary 注解标注,但是 @Qualifier 比 @Primary 的优先级要高,所以使用注解 @Qualifier 标注指定后, @Primary 就不起作用了,所以还是直接用指定的 bookService 作为组件的 name 去容器中装配

到此这篇关于Spring中的@Autowired、@Qualifier和@Primary注解详解的文章就介绍到这了,更多相关@Autowired、@Qualifier和@Primary注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker容器使用宿主机上的mongod/redis等服务详解

    Docker容器使用宿主机上的mongod/redis等服务详解

    这篇文章主要介绍了Docker容器使用宿主机上的mongod/redis等服务详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • springboot 热启动的过程图解

    springboot 热启动的过程图解

    这篇文章主要介绍了springboot 热启动的过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java 使用 FFmpeg 处理视频文件示例代码详解

    Java 使用 FFmpeg 处理视频文件示例代码详解

    这篇文章主要介绍了Java 使用 FFmpeg 处理视频文件示例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • Java生成条形码code128(亲测有效)

    Java生成条形码code128(亲测有效)

    这篇文章主要介绍了Java生成条形码code128,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • swagger3.0实现https接口请求全过程

    swagger3.0实现https接口请求全过程

    文章描述了在开发过程中遇到Swagger拦截器配置错误的问题,并通过自定义Swagger拦截器解决了该问题,最后重启项目以应用更改
    2026-01-01
  • 学习Java之IO流的基础概念详解

    学习Java之IO流的基础概念详解

    这篇文章主要给大家介绍了Java中的IO流,我们首先要搞清楚一件事,就是为什么需要IO流这个东西,但在正式学习IO流的使用之前,小编有必要带大家先了解一下IO流的基本概念,需要的朋友可以参考下
    2023-09-09
  • Springboot错误处理机制实现原理解析

    Springboot错误处理机制实现原理解析

    这篇文章主要介绍了springboot错误处理机制实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java 自定义注解及利用反射读取注解的实例

    Java 自定义注解及利用反射读取注解的实例

    下面小编就为大家带来一篇Java 自定义注解及利用反射读取注解的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • SpringBoot yml配置敏感信息加密的实现

    SpringBoot yml配置敏感信息加密的实现

    本文主要介绍了SpringBoot yml配置敏感信息加密的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • Java中的cglib原理解析

    Java中的cglib原理解析

    这篇文章主要介绍了Java中的cglib原理解析,由于代理类继承了被代理类,所以调用sayHello()方法时会直接调用代理类的sayHello()方法,而在代理类的方法中,调用了Callback的逻辑,需要的朋友可以参考下
    2023-10-10

最新评论