Spring自动装配(Autowired)原理,不是自动配置!!!即@Autowired与@Resource的区别

本文详细介绍了Spring中的自动装配(Autowired)原理,包括其依赖注入机制、@Autowired注解的工作流程,以及与@Resource注解的区别。同时讨论了构造函数注入的优点和Spring对循环依赖的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.首先本文介绍的是Spring自动装配(Autowired)原理,而不是自动配置(Auto-configuration)!!!

自动配置请查看:

        SpringBoot自动配置原理,@SpringBootApplication-优快云博客

        首先我们要明白这是两个概念,Spring框架的两个核心特性是“自动配置”和“自动装配”,尽管这两个概念在帮助开发者自动管理Bean生命周期和依赖关系方面有所重叠,但它们的用途、作用域以及实现机制有着本质的区别。自动装配通过@Autowired等注解实现,侧重于依赖注入,自动配置通过@EnableAutoConfiguration@SpringBootApplication注解实现,侧重于基于条件的配置逻辑。

2.下面讲解Spring自动装配(Autowired):

        Spring通过依赖注入(DI)实现的,它允许开发者在声明Bean时不必手动编写代码来注入依赖,Spring容器会自动完成。以下是依赖注入和容器管理机制。

依赖注入(DI)

依赖注入是一种设计模式,用于实现控制反转(IoC),即将组件间的依赖关系从程序内部转移到容器外部进行管理。在Spring框架中,Bean的依赖项通过容器在运行时自动注入,而不是由对象本身创建或查找其依赖项。

@Autowired工作原理

  1. 启动时扫描:Spring应用启动时,Spring容器会扫描项目中所有的类,查找带有@Component及其衍生注解(如@Service@Repository@Controller等)的类,并将它们作为Bean定义注册到容器中

  2. 处理@Autowired注解:在这个过程中,Spring容器也会查找类中带有@Autowired注解的属性、构造函数或方法。对于这些位置的依赖,Spring容器会尝试进行自动装配

  3. 依赖解析:当容器发现一个@Autowired注释时,它会尝试根据类型匹配在Spring上下文中已注册的Bean。如果找到匹配的Bean,Spring容器则会自动注入这个Bean;如果找到多个匹配的Bean,则会根据名称、@Primary注解或@Qualifier注解进一步确定要注入的Bean。

  4. 单一类型匹配:如果容器中只有一个匹配的Bean类型,Spring会自动将其注入。

  5. 多个类型匹配:如果有多个相同类型的Bean,可以使用@Qualifier注解指定Bean的名称来选择需要注入的具体实例。

  6. 无匹配处理:如果没有找到匹配的Bean,根据@Autowired注解的required属性(默认为true),Spring要么抛出异常,要么忽略这个依赖项。

细节补充

  • 类型安全@Autowired的自动装配是类型安全的,意味着如果类型不匹配,Spring在启动阶段就会报错,这有助于提前发现问题。

  • 构造函数注入:Spring团队推荐使用构造函数注入,因为它可以保证依赖项的不可变性和必要性。从Spring 4.3开始,如果类只有一个构造函数,那么这个构造函数的@Autowired注解可以省略。

  • 循环依赖@Autowired可能会导致循环依赖问题,但Spring有机制处理单例作用域Bean的循环依赖。对于原型作用域的Bean,Spring无法处理循环依赖,开发者需要自己设计来避免这种情况。

以上便是spring中自动装配的原理。

3.以下是通过javax.annotation包下的@Resource注解在Spring中实现自动装配的过程。

@Resource注解是JavaEE的一部分,用于在Spring以及其他容器中进行依赖注入。Spring框架支持@Resource注解。与Spring自身的@Autowired注解相比,@Resource的装配方式略有不同。

基于名称的自动装配

默认情况下,@Resource注解按照名称进行自动装配。如果没有指定名称,它会使用被注解的字段或方法的名称作为查找bean的依据。也可以像下面这样显示的指定名字:

@Resource(name = "specificBean")
private AnotherBean anotherBean;

  

4.@Resource@Autowired的区别

  • 依赖解析@Autowired默认按类型装配依赖,如果有多个相同类型的bean,则可以结合@Qualifier注解指定名称。@Resource默认按名称装配,如果按名称无法找到,再回退到按类型装配。
  • 所属规范@Autowired是Spring特有的注解,而@Resource来自javax.annotation,因此@Resource更加适合需要遵循JavaEE标准的应用。
  • @Resource注解是实现依赖注入的有效手段之一,尤其适合那些希望或需要遵循JavaEE标准的应用。然而,在Spring中,@Autowired@Qualifier的组合使用可能更加灵活和强大,尤其是在处理复杂的自动装配场景时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

One day️

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值