@Autowired、@Qualifier

本文详细解释了Spring框架中的@Autowired注解如何实现自动装配bean,以及@Qualifier注解在处理多例bean歧义中的作用。介绍了字段注入、构造器注入和方法注入的区别,以及如何使用@Qualifier指定特定bean实例。
摘要由CSDN通过智能技术生成

@Autowired

概念:

@Autowired是Spring框架中的注解,用于自动装配bean;

当Spring容器创建bean时,它可以自动将依赖的bean注入到使用@Autowired注解的字段或方法中,
这使得开发者可以专注于业务逻辑,而无需手动配置和注入依赖。


字段注入
	import org.springframework.beans.factory.annotation.Autowired;  
	import org.springframework.stereotype.Component;  
	  
	@Component  
	public class MyService {  
	  
	    @Autowired  
	    private MyDependency myDependency;  
	  
	    // ... 其他方法 ...  
	}
	

	"MyDependency类型的bean",会被自动注入到myDependency字段中,
	
	因为,关于bean的id,在这里并没有直接涉及到,
	
	又因为,字段注入是基于类型的,而不是基于id的,
	
	所以,Spring会查找所有类型为MyDependency的bean,并尝试注入。
	
	如果,容器中只有一个MyDependency类型的bean,那么Spring会成功地将它注入到myDependency字段中;
	
	如果,容器中有多个MyDependency类型的bean,你需要通过其他方式来解决歧义,
		
	比如,使用@Qualifier注解来指定具体的bean名称(id),或者通过其他方式来配置bean的注入。


构造器注入
	import org.springframework.beans.factory.annotation.Autowired;  
	import org.springframework.stereotype.Component;  
	  
	@Component  
	public class MyService {  
	  
	    private final MyDependency myDependency;  
	  
	    @Autowired  
	    public MyService(MyDependency myDependency) {  
	        this.myDependency = myDependency;  
	    }  
	  
	    // ... 其他方法 ...  
	}

	使用构造器注入可以确保 `MyDependency` 在`MyService`的整个生命周期中都是可用的,并且是不可变的。


方法注入(这种方法较少使用)
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Component;  
  
@Component  
public class MyService {  
  
    private MyDependency myDependency;  
  
    @Autowired  
    public void setMyDependency(MyDependency myDependency) {  
        this.myDependency = myDependency;  
    }  
  
    // ... 其他方法 ...  
}


注意:
1、
如果 Spring 容器中有多个相同类型的 bean,那么 @Autowired 可能无法确定要注入哪个 bean,从而导致异常,
为了避免这种情况,
可以使用 @Primary 注解来指定首选的 bean,
或者使用 @Qualifier 注解来明确指定要注入的 bean 的名称。
2、
从 Spring 4.3 开始,@Autowired 注解不再是必须的,因为如果你只有一个构造器,Spring 会自动使用它进行依赖注入。


@Qualifier

概念:

@Qualifier注解,在Spring框架中用于消除多个相同类型bean的歧义,

即,当存在多个相同类型的bean时,可以使用@Qualifier注解来指定注入哪一个bean,

配合@Autowired使用时,@Qualifier注解可以指定bean的名称或者其他的限定符。

举例

首先,定义多个相同类型的bean:

	@Component  
	public class MyDependencyA implements MyDependency {  
		// ...  
	}  
	  
	@Component  
	public class MyDependencyB implements MyDependency {  
		// ...  
	}

1、使用@Autowired@Qualifier 注入特定的bean

	import org.springframework.beans.factory.annotation.Autowired;
	import org.springframework.beans.factory.annotation.Qualifier;
	import org.springframework.stereotype.Component;

	@Component
	public class MyService {

		private final MyDependency myDependencyA;
		private final MyDependency myDependencyB;

		@Autowired
		public MyService(
			@Qualifier("myDependencyA") MyDependency myDependencyA,
			@Qualifier("myDependencyB") MyDependency myDependencyB
		) {
			this.myDependencyA = myDependencyA;
			this.myDependencyB = myDependencyB;
		}
		// ... 其他方法 ...
	}

	MyService类的构造函数,接受两个 MyDependency 类型的参数,
	使用@Qualifier 注解来明确指定注入哪一个bean,
	Spring容器会查找名称为 "myDependencyA""myDependencyB" 的bean,并将它们分别注入到"myDependencyA""myDependencyB"字段中。

2、使用 @Qualifier 注解在字段注入

	import org.springframework.beans.factory.annotation.Autowired;  
	import org.springframework.beans.factory.annotation.Qualifier;  
	import org.springframework.stereotype.Component;  
	  
	@Component  
	public class MyService {  
	  
		@Autowired  
		@Qualifier("myDependencyA")  
		private MyDependency myDependencyA;  
	  
		@Autowired  
		@Qualifier("myDependencyB")  
		private MyDependency myDependencyB;  
	  
		// ... 其他方法 ...  
	}
	
	这里,@Autowired@Qualifier 注解被一起用在了字段上,效果与使用在构造函数上是一样的。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
@Qualifier和@Autowired是Spring框架中的注解,用于实现依赖注入。@Autowired注解可以单独使用,它按照类型进行装配。但是如果容器中存在多个相同类型的bean,@Autowired无法确定要注入哪个bean,会出现问题。这时可以使用@Qualifier注解与@Autowired一起使用,通过指定bean的名称来明确要注入的bean。例如,可以使用@Qualifier("baseDao")来指定要注入的BaseDao类型的bean。\[2\] @Qualifier和@Autowired是Spring框架中的弹簧注解,而@Resource是标准的Java注解(来自JSR-250)。此外,@Resource只支持字段和setter方法的注入,而@Autowired支持字段、setter方法、构造函数和多参数方法的注入。\[3\] #### 引用[.reference_title] - *1* [看完让你吊打面试官-@Autowired注解到底怎么实现的?](https://blog.csdn.net/qq_33589510/article/details/105071416)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Spring中@Autowired、@Qualifier、@Resource的区别](https://blog.csdn.net/riemann_/article/details/103755251)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值