@Autowired\@Resource\@Qualifier\@Primary

本文详细解释了Spring框架中的@Autowired、@Resource、@Qualifier和@Primary注解的用法、参数、装配方式、应用范围以及它们之间的区别,帮助开发者理解和正确使用这些依赖注入注解。
摘要由CSDN通过智能技术生成

一、@Autowired

1、出处:

Spring定义,只能在spring框架使用。

2、注解内部参数:只有一个

required:默认为true,此时对应的bean必须存在;若允许不存在可以@Autowired(required=false)。

3、装配方式及顺序:

	默认按type自动装配,若发现多个bean,再按照name匹配,还有多个则报异常。支持@Primary。
	注:多个bean支持注入到一个集合中,如:
@Autowired
List<Date> dates = Collections.emptyList();

4、应用范围:

构造方法、成员变量(字段)、方法(用在方法上时会自动执行该方法,若方法有参数会在IOC容器中自动寻找同类型参数为其传值)。

5、指定bean的名称:

@Bean("name")
@Component("name")
@Qualifier("name")

6、@autowired注入失败的情况

(1)描述:静态方法无法调用@autowired标注的成员变量(该变量为一个对象)。如:
	public class CeErrorAlarm{
	   @autowired
	   private static CeAlarmDao ceAlarmDao;
	   
	   public static ceErrorAlarm(){
	          ceAlarmDao.insert();
	    }
	}

会报java.lang.NullPointerException: null异常。
(2)原因:spring注入是在容器中实例化对象,而静态方法是类方法。
(3)解决:@autowired不标注在静态变量上,而是在定义静态变量后,再写一个非静态方法,并用@autowired标注该方法,则该方法自动执行并为该方法的参数自动注入。然后在方法中将参数赋值给静态变量。此时可以在静态方法中调用该静态变量了。如:

	public class CeErrorAlarm{

    	private static CeAlarmDao  ceAlarmDao;
    	
   		@autowired
  		public CeErrorAlarm(CeAlarmDao ceAlarmDao){
      		CeErrorAlarm.ceAlarmDao=ceAlarmDao;
		}

   		public static ceErrorAlarm(){
          ceAlarmDao.insert();
   		 }
}

(@Value与此同理)

二、@Resource

1、出处:

jdk定义,可以与各种框架一起使用。

2、注解内部参数:包含七个参数

主要是name和type,分别表示bean的名称和类型,默认为“”和Object。不能配置”允许bean不存在“。

3、装配方式及顺序:

默认按name自动装配,若没有匹配再按照type;
若只指定了name则按name,只指定了type则按type;
若同时指定了name和type则匹配唯一bean。
不支持@Primary。

4、应用范围:

类、成员变量(字段)、方法。

5、指定bean的类型:

@Resource(type=Xxx.class)

三、@Qualifier

当自动注入时发现type和name都将相同时,可以使用@Qualifier指定要注入的bean。

1、直接用于bean上:

在有多个同类型bean时,只选择标了@Qualifier的bean。如:
	@Bean
	@Qualifier
	public Date curDate(){
	...
	}
	
	@Bean
	public Date nextYear(){
	...
	}
	@Autowired
	@Qualifier
	List<Date> dates = Collections.emptyList();

此时只会将curDate注入。

2、为bean标注别名:

	@Bean
	@Qualifier("nextYear")
	public Date curDate(){
	...
	}

此时可以根据名称“nextYear”将curDate注入。

3、用于自定义注解上:

在自定义注解上使用@Qualifier注解,则该注解也具备了@Qualifier的功能,如:

自定义@QualifierDate注解:

@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface QualifierDate {
}

在bean上标注该自定义注解:

@Bean
@QualifierDate
public Date nextYear(){
    Calendar ca = Calendar.getInstance();//得到一个Calendar的实例
    ca.setTime(new Date());  //设置时间为当前时间
    ca.add(Calendar.YEAR, +1); //年份+1
    return ca.getTime();
}```
注入时再使用该自定义注解指定bean:

```java
@Autowired
@QualifierDate
List<Date> dates = Collections.emptyList();

四、@Primary

定义bean时使用@Primary定义首选项,只需要在注入Bean上添加@Primary定义首选项,那么该Bean就会作为首选进行注入。​

回答: @Primary和@AutowiredSpring框架中的两个注解,用于处理依赖注入。@Primary注解用于标记一个Bean作为默认的依赖注入对象,当存在多个相同类型的Bean时,被标记为@PrimaryBean会被优先选择。而@Autowired注解用于自动装配Bean,它可以通过类型匹配或者按照Bean的名称进行注入。当使用@Autowired注解时,如果存在多个相同类型的Bean,Spring会尝试根据类型进行匹配,如果匹配失败,则会根据Bean的名称进行匹配。如果没有找到匹配的Bean,会抛出异常。因此,@Primary注解可以用来指定默认的依赖注入对象,而@Autowired注解用于自动装配Bean。 #### 引用[.reference_title] - *1* [@Autowired @Resource @Qualifier @Primary的区别](https://blog.csdn.net/weixin_44323971/article/details/113326360)[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,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Spring系列之注解实现依赖注入(@Autowired、@Resource、@Primary、@Qulifier)](https://blog.csdn.net/weixin_46228112/article/details/124582096)[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,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值