策略模式实现 Bean 注入时怎么知道具体注入的是哪个 Bean?

@Autowire @Resource 的区别

1.来源不同:其中 @Autowire 是 Spring2.5 定义的注解,而 @Resource 是 Java 定义的注解

2.依赖查找的顺序不同:

复制代码
依赖注入的功能,是通过先在 Spring IoC 容器中查找对象,再将对象注入引入到当前类中。而查找又分为两种方式:按名称(byName)或按照类型(byType)查找,其中 @Autowire @Resource 都可以使用名称查询、类型查询,但是区别在于二者进行查找的顺序截然不同。
2.1 @Autowire

@Autowire 注解在查找要注入的 bean 时,首先会按照类型进行匹配,如果有多个匹配的 bean,就会按照名称进行匹配。

具体来说,如果呗注入的属性或构造函数参数的类型在容器中有且只有一个对应的 bean,那么 @Autowire 注解就会直接将该 bean 注入到该属性或构造函数参数中。例如:

java 复制代码
@Autowired
private UserService userService;

在这个例子中,如果容器中只有一个类型为 UserService 的 bean ,那么它就会被自动注入到userService 属性中。

但是,如果容器中存在多个类型为 UserService 的 bean,就需要通过名称进行匹配。此时,可以在 @Autowired 注解中使用 @Qualifier注解来指定要注入的bean的名称,如果不使用 @Qualifier 注解就会使用属性名。

例如:

java 复制代码
@Autowired
@Qualifier("userService2")
private UserService userService;

在这个例子中,如果容器中有多个类型为 UserService 的 bean,那么它会根据 @Qualifier 注解中指定的名称来匹配要注入的 bean。如果找到了名为 "userService2" 的 bean,就会将它注入到 userService 属性中

这就是多个在实现有多个实现的 bean 注入的时候指定具体的 bean 的方式

2.2 @Resource注解

在Spring中,@Resource注解可以通过名称或者类型来注入bean,具体取决于@Resource注解的两个属性:name和type。

如果@Resource注解中指定了name属性,Spring将会根据该名称来查找对应的bean,并将其注入到被注解的属性或者方法参数中。例如:

java 复制代码
@Resource(name = "myBean")
private MyBean myBean;

上述代码将会根据名称"myBean"来查找对应的bean,并将其注入到myBean属性中。

如果@Resource注解没有指定name属性,而是指定了type属性,Spring将会根据该类型来查找对应的bean,并将其注入到被注解的属性或者方法参数中。例如:

java 复制代码
@Resource(type = MyBean.class)
private MyBean myBean;

上述代码将会根据类型MyBean来查找对应的bean,并将其注入到myBean属性中。

如果@Resource注解既没有指定name属性,也没有指定type属性,那么它会默认按照名称来查找对应的bean,并将其注入到被注解的属性或者方法参数中。

3. 支持的参数不同:

@Autowired 和 @Resource 在使用时都可以设置参数,但二者支持的参数以及参数的个数完全不同,其中 @Autowired 只支持设置一个 required 的参数,而 @Resource 支持 7 个参数,支持的参数如下图所示:

4. 依赖注入的用法支持不同

@Autowired 和 @Resource 支持依赖注入的用法不同,常见依赖注入有以下 3 种实现:

1.属性注入

2.构造方法注入

3.Setter 注入

@Autowired 支持属性注入、构造方法注入和 Setter 注入,而 @Resource 只支持属性注入和 Setter 注入

小结:

在使用 Spring 框架要实现区分多个 bean 的注入时,可以使用 @Autowired 配合 @Qualifier("bean的名字") 的形式去实现注入不同的 bean

相关推荐
克拉克盖博1 小时前
chapter03_Bean的实例化与策略模式
java·spring·策略模式
小兔兔吃萝卜6 小时前
Spring 创建 Bean 的 8 种主要方式
java·后端·spring
AAA修煤气灶刘哥7 小时前
面试官: SpringBoot自动配置的原理是什么?从启动到生效,一文讲透
后端·spring·面试
qq_三哥啊9 小时前
【IDEA】设置Debug调试时调试器不进入特定类(Spring框架、Mybatis框架)
spring·intellij-idea·mybatis
别惹CC10 小时前
Spring AI 进阶之路01:三步将 AI 整合进 Spring Boot
人工智能·spring boot·spring
寒士obj10 小时前
Spring事物
java·spring
IT毕设实战小研18 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
甄超锋19 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
Java小白程序员1 天前
Spring Framework:Java 开发的基石与 Spring 生态的起点
java·数据库·spring
甄超锋1 天前
Java Maven更换国内源
java·开发语言·spring boot·spring·spring cloud·tomcat·maven