@Resource注入关键字

63 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详

大家好,我是bug郭,一名双非科班的在校大学生。对C/JAVA、数据结构、Spring系列框架、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:

@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 异常。