文章目录

  • 前言
  • 一、注解区别
    • 1. @Autowired
    • 2. @Qualifier
    • 3. @Resource
  • 二、使用三个注解
  • 三、bean name默认生成规则

前言

一、注解区别

1. @Autowired

@Autowired 是Spring的注解。通过 byType 的方式去注入,仅有一个required属性,默认为true,默认装配规则如下:

  1. 先通过类型查找,找到只有一个则装配,找不到则抛出异常,
  2. 如果找到多个,则从中按照名字查找,找到则装配,找不到则抛出异常

当required为false时,最终找不到则忽略不装配。

2. @Qualifier

@Qualifier是Spring的注解。字面含义为合格者,按名称注入。用于装配时有多个候选bean时通过指定一个标识来解决冲突,仅有一个默认value属性,作为标识,定义bean时通过添加@Qualifier(“xxx”)指定。每一个bean都有一个自身名称标识的Qualifier。

一般当出现两个及以上bean时,不知道要注入哪个,作为@Autowired()的修饰用。

  1. 当value不指定时,这个标识为"",而不是bean的名称或者作用的属性名称。
  2. 当通过类型找到一个时,但是不匹配Qualifier指定标识,也会抛出异常(它不仅解决冲突,甚至有点矫枉过正)

3. @Resource

@Resource 是 J2EE 的注解。以通过 byNamebyType 的方式注入。

默认先按 byName的方式进行匹配,如果匹配不到,再按 byType的方式进行匹配。用与资源(通常是JNDI)的注入。 Spring对其进行了支持。

装配规则:

  1. 如果指定了name属性,则按照name查找,找到且类型匹配则装配,否则配抛出异常
  2. 如果指定了name和type属性,则按照name和type精确查找,找到则装配,找不到抛出异常
  3. 如果仅指定了type属性,则按照type查找,如果只找到一个则装配,否则抛出异常
  4. 如果name和type都没有指定,则默认按照作用的属性名字查找,找到则装配,找不到则按照类型找,找到一个则装配,找不到或者找到多个抛出异常

注意 : 如果不指定name 和 type。先按 byName (其name为 注入的自定义的名称,首字母大写的变为小写,后面为驼峰命名规则)。 如果匹配不到,再按 byType的方式进行匹配。

如果想减少对 Spring 的依赖建议使用 @Resource 方法。

二、使用三个注解

我拿我之前写的需求过来写一下,我接收三种不同的数据,需要放在三个堵塞队列中,然后再使用三个线程池去消费。我想把三个堵塞队列写在一个配置类中。如下:

BlockingQueueConfig.java

package com.uniview.airport.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;/*** 三个堵塞队列,分别对应三个告警类型的传递*/
@Configuration
public class BlockingQueueConfig {/***  飞机开关车门* @return*/@Bean(name = "BlockingOpenAndCloseDoor")public BlockingQueue getBlockingQueueOpenAndCloseDoor(){return new LinkedBlockingQueue(2000);}/***飞机撤侨* @return*/@Bean(name = "BlockingQueueEvacuees")public BlockingQueue getBlockingQueueEvacuees(){return new LinkedBlockingQueue(2000);}/*** 飞机入离位* @return*/@Bean(name = "BlockingQueueEntryAndExit")public BlockingQueue getBlockingQueueEntryAndExit(){return new LinkedBlockingQueue(2000);}
}

两种实现方式

@Slf4j
@RestController
@RequestMapping("objIdentify")
public class AlarmController {/***  飞机开关舱门*/@Resource(name = "BlockingOpenAndCloseDoor")private BlockingQueue blockingOpenAndCloseDoor;/***  飞机撤侨*/@Qualifier(value = "BlockingQueueEvacuees")@Autowiredprivate BlockingQueue blockingQueueEvacuees;/*** 飞机入离位*/@Resource(name = "BlockingQueueEntryAndExit")private BlockingQueue blockingQueueEntryAndExit;
}

成功运行,不报错。

三、bean name默认生成规则

在SSM 或者 springboot 项目中,会用到依赖注入。其前提是将这个类配置成bean并加入到spring容器中,也就是 IOC容器。

现在一般都是用配置式和注解式来将bean装配到容器中。

一般都使用注解 @Controller 、@Service、 @Repository、@Component、@Configuration 等注解来标注在类上,一般用 @Bean 标注方法上(一般在配置类上)。

那他们的 bean name 是多少呢????

在Spring中,当我们配置一个bean的时候,可以不指定name,这样的话,Spring会生成一个默认的beanName,生成规则:原以为只是简单的将类名首字母小写,后面为驼峰命名规则,Spring官方文档还指出——当类名的首字母和第二个字母是大写的时候,将采用原始的类名作为beanName。

例如:

  1. SysConfig - sysConfig,Tools - tools。
  2. RBACUserLog - RBACUserLog,RBACUser - RBACUser,RBACRole - RBACRole。

spring文档原文如下:

With component scanning in the classpath, Spring generates bean names for unnamed components, following the rules above: essentially, taking the simple class name and turning its initial character to lower-case. However, in the (unusual) special case when there is more than one character and both the first and second characters are upper case, the original casing gets preserved. These are the same rules as defined by java.beans.Introspector.decapitalize (which Spring is using here).

大概意思就是说spring在给未命名的组件生成bean name的时候,采用简单的类名并将其初始字符转换为小写。但在特殊情况下,当第一个和第二个字符都是大写的时候,保留原始的形式。而spring使用的就是在java.beans.Introspector类中的decapitalize方法实现的。

Bean注解括号里面的字符串就是bean的名字,也可以不加,默认bean的名字是@Bean注解所对应的方法的方法名

@Resource、@Autowired、@Qualifier区别与使用,以及bean name 的默认生成规则。相关推荐

  1. @Inject.@Resource.@Autowired 的区别

    @Inject:Struts2的注解, @Resource : J2EE提供,用于注入,( j2ee提供的 ) 默认按名称装配,@Resource(name="beanName") ...

  2. 【Spring注解系列13】Spring自动装配总结:@Autowired、@Resource、@Qualifier、@Inject

    目录 1.@Autowired.@Resource.@Qualifier.@Inject 1).@Autowired 2).@Resource与@Inject 3). @Autowired参数取值 2 ...

  3. spring 注解说明以及@Resource和@Autowired的区别

    2019独角兽企业重金招聘Python工程师标准>>> 一.spring常见的注解有 @Component.@Repository.@Service.@Controller @Aut ...

  4. @Resource和@Autowired的区别

    前言 @Resource和@Autowired都是做bean的注入时使用,@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入. 其中@Resourc ...

  5. @Autowired注解与@resource注解的区别(十分详细)

    背景: 今天下班路上看到一个大货车,于是想到了装配,然后脑海里跳出了一个注解@Autowired(自动装配),于是又想到最近工作项目用的都是@Resource注解来进行装配.于是本着学什么东西都要一钻 ...

  6. Springboot中@autowired和@resource注解的区别

    @Autowired @Autowired是Spring提供的,默认按照byType 注入,也就是按bean的类型来传入.如果需要指定名字,那么需要使@Qualifier("这是bean的名 ...

  7. 还在使用@Autowired 吗?@Autowired和@Resource有啥区别

    区别一 @Autowired 是 Spring 自带的注解 @Resource 是 J2EE提供,Spring 做了支持 区别二 @Autowired 默认按类型装配 @Resource 默认按照名称 ...

  8. @Resource与@Autowired用法区别

    spring中,@Resource和@Autowired都是做bean的注入时使用.使用过程中,有时候@Resource 和 @Autowired可以替换使用:有时,则不可以. 下面,根据自己的学习, ...

  9. Spring中@Autowired注解、@Resource注解的区别

    Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resour ...

最新文章

  1. 【hdu 6406】Taotao Picks Apples
  2. python环境的打包与加载
  3. 网络管理软件免费linux,最新Xmanager Power Suite6网络管理工具免费官方下载6.0.199 - 系统之家...
  4. 系统集成项目管理工程师目录
  5. 二级域名共享cookies
  6. 一篇文章为何能引起公众对联想那么多的争议?
  7. 洞见科技创始人姚明:隐私计算让数据穿上“防护服”的同时,还能充分释放数据价值...
  8. 输入年份和月份输出该月有多少天python_题目内容:读入一个年份和月份,输出该月有多少天(考虑闰年),用s? 爱问知识人...
  9. 唐太宗李世民14个儿子的可悲结局[高清组图]
  10. 运动斗士终南山的不老之道
  11. windows关闭休眠
  12. 在菲律宾人民币换php怎么换,菲律宾汇率换算人民币(人民币兑换比索计算器)
  13. 圆锥螺旋线matlab 画,圆锥螺旋线 - calculus的日志 - 网易博客
  14. Elasticsearch-ais使用方式
  15. Sun公司,Oracle公司(10.8)
  16. 如何在UnrealEngine虚幻引擎中进行版本管理
  17. 计算机发展历史及其前景展望,论计算机发展史及展望
  18. 一张不错的国内网络安全法规方面立法的历程图
  19. TOJ 3471.Happy XiaoXiao Guo
  20. ubuntu 安装mysql

热门文章

  1. Centos7 | NFS服务器搭建与配置
  2. Gson to json 的时候,出现nameValuePair
  3. Ubuntu之NVIDIA GeForce显卡驱动安装
  4. secureCRT使用的小问题
  5. 用量子抗量子,剑桥量子与银行和大学机构合作演示抗量子区块链技术
  6. 大连理工计算机类排名,中国理工类大学排名出炉,哈工大逆袭成黑马,大连理工无缘前5...
  7. STM32CubeIDE加CubeMX开发一——软件下载
  8. z490 linux raid,光威弈系列Pro Z490平台装机评测(含raid模式)
  9. pythonpip安装在哪_pippython库安装在哪里了
  10. 数据结构5——圆方树