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注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 图文教程教你IDEA中的Spring环境搭建+简单入门

    图文教程教你IDEA中的Spring环境搭建+简单入门

    这篇文章主要介绍了图文教程教你IDEA中的Spring环境搭建+简单入门,Spring的环境搭建使用Maven更加方便,需要的朋友可以参考下
    2023-03-03
  • java判断回文数示例分享

    java判断回文数示例分享

    这篇文章主要介绍了java判断回文数示例,需要的朋友可以参考下
    2014-03-03
  • 详解Java实现单例的五种方式

    详解Java实现单例的五种方式

    这篇文章主要介绍了详解Java实现单例的五种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • sharding-jdbc中的事务详细解读

    sharding-jdbc中的事务详细解读

    这篇文章主要介绍了sharding-jdbc中的事务详细解读,sharding-jdbc在分库分表方面提供了很大的便利性,在使用DB的时候,通常都会涉及到事务这个概念,而在分库分表的环境上再加上事务,就会使事情变得复杂起来,需要的朋友可以参考下
    2023-12-12
  • Java Swing实现QQ登录页面

    Java Swing实现QQ登录页面

    这篇文章主要为大家详细介绍了Java Swing实现QQ登录页面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Jenkin邮件收发实现原理及过程详解

    Jenkin邮件收发实现原理及过程详解

    这篇文章主要介绍了Jenkin邮件收发实现原理及过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Springboot打包代码,反编译后代码混淆方式(防止还原代码)

    Springboot打包代码,反编译后代码混淆方式(防止还原代码)

    文章主要介绍了如何对Spring Boot项目进行jar包混淆,以防止反编译还原原始代码,通过在项目中添加proguard.cfg文件并配置Maven插件,可以实现代码混淆,从而增加反编译的难度
    2024-11-11
  • mybatis的insert插入后获取自增id的方法详解(从controller到mapper)

    mybatis的insert插入后获取自增id的方法详解(从controller到mapper)

    这篇文章主要介绍了mybatis的insert插入后获取自增id的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-10-10
  • java Web实现用户登录功能图文教程

    java Web实现用户登录功能图文教程

    这篇文章主要给大家介绍了关于java Web实现用户登录功能的相关资料,在开发Web应用程序中,用户登录是一个常见的功能,文中通过代码以及图文介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • SpringBoot自定义实现内容协商的三种策略

    SpringBoot自定义实现内容协商的三种策略

    内容协商是HTTP协议中的一个重要概念,允许同一资源URL根据客户端的偏好提供不同格式的表示,这篇文章主要介绍了SpringBoot自定义实现内容协商的三种策略,希望对大家有一定的帮助
    2025-04-04

最新评论