1.首先本文介绍的是Spring自动装配(Autowired)原理,而不是自动配置(Auto-configuration)!!!
自动配置请查看:
SpringBoot自动配置原理,@SpringBootApplication-优快云博客
首先我们要明白这是两个概念,Spring框架的两个核心特性是“自动配置”和“自动装配”,尽管这两个概念在帮助开发者自动管理Bean生命周期和依赖关系方面有所重叠,但它们的用途、作用域以及实现机制有着本质的区别。自动装配通过@Autowired
等注解实现,侧重于依赖注入,自动配置通过@EnableAutoConfiguration
或@SpringBootApplication
注解实现,侧重于基于条件的配置逻辑。
2.下面讲解Spring自动装配(Autowired):
Spring通过依赖注入(DI)实现的,它允许开发者在声明Bean时不必手动编写代码来注入依赖,Spring容器会自动完成。以下是依赖注入和容器管理机制。
依赖注入(DI)
依赖注入是一种设计模式,用于实现控制反转(IoC),即将组件间的依赖关系从程序内部转移到容器外部进行管理。在Spring框架中,Bean的依赖项通过容器在运行时自动注入,而不是由对象本身创建或查找其依赖项。
@Autowired
工作原理
-
启动时扫描:Spring应用启动时,Spring容器会扫描项目中所有的类,查找带有
@Component
及其衍生注解(如@Service
、@Repository
、@Controller
等)的类,并将它们作为Bean定义注册到容器中。 -
处理@Autowired注解:在这个过程中,Spring容器也会查找类中带有
@Autowired
注解的属性、构造函数或方法。对于这些位置的依赖,Spring容器会尝试进行自动装配。 -
依赖解析:当容器发现一个
@Autowired
注释时,它会尝试根据类型匹配在Spring上下文中已注册的Bean。如果找到匹配的Bean,Spring容器则会自动注入这个Bean;如果找到多个匹配的Bean,则会根据名称、@Primary
注解或@Qualifier
注解进一步确定要注入的Bean。 -
单一类型匹配:如果容器中只有一个匹配的Bean类型,Spring会自动将其注入。
-
多个类型匹配:如果有多个相同类型的Bean,可以使用
@Qualifier
注解指定Bean的名称来选择需要注入的具体实例。 -
无匹配处理:如果没有找到匹配的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
的组合使用可能更加灵活和强大,尤其是在处理复杂的自动装配场景时。