开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详
大家好,我是bug郭,一名双非科班的在校大学生。对C/JAVA、数据结构、Spring系列框架、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流
作者简介:
- CSDN java领域新星创作者blog.csdn.net/bug..
- 掘金LV3用户 juejin.cn/user/bug..
- 阿里云社区专家博主,星级博主,developer.aliyun.com/bug..
- 华为云云享专家 bbs.huaweicloud.com/bug..
@Resource注入关键字
在进行类注入时,我们还可以通过@Resource注解进行注入!
我们只需要将@Autowired注解换成@Resource即可!
@Autowired和@Resource区别
- 出身不同:
@Autowired注解是Spring提供的,@Resource是来自JDK下的注解 - 使用设置的参数不同:相比
@Autowired注解,@Resource注解 支持更多的参数设置 例如name设置,根据name获取对象
注入同一类型多个Bean对象
我们在Users类中注册了2个相同类型的Bean对象!
@Component
public class Users {
@Bean(name = "user1")
public User user1(){
User user = new User("java",666);
return user;
}
@Bean(name = "user2")
public User user2(){
User user = new User("MySQL",666);
return user;
}
}
当我们直接注入到Controller类中!
@Controller
public class UserController {
@Resource
private User user;
public User getUser(){
return user;
}
}
因为我们在
Spring中注册了2个相同类型的User对象,所以进行对象装配时,也需要通过name属性进行声明你要装配的对象名!
@Controller
public class UserController {
@Resource(name = "user2")
private User user;
public User getUser(){
return user;
}
}
注意:
@Resource注解才提供了name属性,如果用@Autowried需要加上@Qualifier注解定义名称
@Controller
public class UserController {
// @Resource(name = "user2")
@Autowired
@Qualifier(value = "user1")
private User user;
public User getUser(){
return user;
}
}
类型注入冲突
Spring 容器中的 Bean 依赖可以通过名称注入,或者类型注入。
通过名称注入
名称注入会指定一个明确的 Bean 名称,容器不允许注册相同名称的 Bean,所以不会有任何问题。
通过类型注入
通过类型注入的时候,有时会因为多个 Bean 的类型相同而产生冲突。例如:
同一类型注册多个不同名称的 Bean 抽象类型注册多个不同实现类的 Bean 这种情况下,容器不知道该注入哪个会抛出 NoUniqueBeanDefinitionException 异常。