@AutoWired注解

本文详细介绍了Spring框架中的@Autowired注解,包括其默认按类型装配的特性,以及如何通过@Qualifier和@Primary进行精确匹配。同时,对比了@Resource注解,强调了其按名称装配的默认行为。此外,还探讨了自动装配的各种场景和可能遇到的问题,如多个匹配项时的处理策略。

目录

一、@AutoWired注解是什么?

一、注解用法

二、自动装配

三、@Autowired和@Resource注解的区别


一、@AutoWired注解是什么?

        @AutoWired 是Spring提供的注解,默认注入方式为byType(按类型自动注入)。       

替换:autowire属性,自动装配(按照类型装配,通过set方法,且方法可以省略)

<property></property>

<constructor-age></constructor-age>

位置:修饰属性,set方法

语法:@Autowired(required="true")

autowire=“属性值”=======》局部

default-autowire=“属性值”=======》全局

注意:1.如果容器中没有一个可以与之匹配且required属性为true则会报异常

                    NoSuchBeanDefinitionException

          2.如果容器中有多个可以类型可以与之匹配,则自动切换为按照名称装配

          3.如果容器中有多个可以类型可以与之匹配,则自动切换为按照名称装配,如果名称也没有匹配,则报异常 NoUniqueBeanDefinitionException

一、注解用法

根据@Autowired注解的源码,可以看到该注解可以作用在构造器、参数、方法、属性,都是从容器中获取参数组件的值

标注在方法上:@Bean+方法参数,参数从容器中获取,默认不写@Autowired效果是一样的,都能自动装配
标注在构造器上:如果组件上只有一个有参构造,这个有参构造的@Autowired可以省略,参数位置的组件还是可以自动从容器中获取
标注在参数位置
标注在属性位置

二、自动装配

Spring利用依赖注入(DI)完成对IOC容器中各个组件的依赖关系赋值

@Autowired自动注入(Spring提供的):

默认优先按照去容器中找对应的组件:applicationContext.getBean()
如果找到多个相同类型的组件,再将属性的名称作为组件的ID去容器中查找
@Qualifier()注解:该注解指定需要装配的组件ID,而不是使用属性名
自动装配默认必须要对属性赋值,没有就会报错,可以使用@Autowired(required = false)指定非必须就不会报错
@Primary注解:自动装配时当出现多个bean候选者时,被注解为@Primary的bean将作为首选者,否则将抛出异常,如果使用了@Qualifier()指定装配的bean,则还是使用明确指定装配的bean
@Resource(JSR250)和@Inject(JSR330)(JDK提供的)

@Resource:

默认按照组件名称进行装配,也可以指定名称进行装配
当找不到与名称匹配的bean会按类型装配
不支持@Primary和@Autowired(required = false)功能
如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
@Inject:

需要导入javax.inject的包,和Autowired功能一样,但是没有required=false功能


三、@Autowired和@Resource注解的区别

@Autowired由Spring提供,只按照byType注入;@Resource由J2EE提供,默认按照byName自动注入,当找不到与名称匹配的bean会按类型装配
@Autowired默认按类型装配,默认情况下必须要求依赖对象存在,如果要允许null值,可以设置它的required属性为false。如果想使用名称装配可以结合@Qualifier注解进行使用。
@Resource,默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行名称查找。如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。


 

### 关于 `@Autowired` 注解的使用说明 #### 功能概述 `@Autowired` 是 Spring 框架提供的用于自动装配依赖的一种方式。当一个 bean 需要注入另一个或多个依赖时,Spring 容器会根据类型查找合适的 bean 并执行注入操作[^2]。 #### 自动装配机制 自 Spring 2.5 版本起引入了基于注解的依赖注入功能,其中核心注解即为 `@Autowired` 。此注解允许开发者简化配置文件中的 XML 设置,并让 Spring 能够解析并注入协作对象到当前定义的对象中去[^3]。 #### 构造函数注入 从 Spring 4.3 开始,对于只有单个构造函数的目标 Bean 来说,不再强制要求显式地标记 `@Autowired` ,因为此时框架可以默认识别唯一的构造参数作为待注入点;然而,在存在多构造函数的情况下,则仍然需要至少在一个构造函数上声明该注解以便指示具体的注入路径[^1]。 ```java public class MyService { private final MyRepository repository; // 单一构造函数场景下可省略 @Autowired public MyService(MyRepository repository) { this.repository = repository; } } ``` #### Setter 方法注入 除了构造函数外,还可以在 setter 方法上面应用 `@Autowired` 实现属性级别的依赖注入: ```java public class AnotherService { private MyRepository myRepository; @Autowired public void setMyRepository(MyRepository myRepository) { this.myRepository = myRepository; } } ``` #### 解决冲突的方法 当有超过一种相同类型的候选者可供选择时(比如项目中有两个实现了同一接口的不同实现类),可以通过配合使用 `@Qualifier` 或者命名空间限定等方式来精确控制应该选用哪个实例参与注入过程[^5]。 #### 原理剖析 为了深入理解 `@Autowired` 的工作流程,可以从研究如下两类组件入手: - **AbstractAutowiredCapableBeanFactory**: 处理基本的依赖关系管理逻辑; - **AutowiredAnnotationBeanPostProcessor**: 对带有特定注解(如 `@Autowired`)的字段、方法或构造函数进行处理[^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值