持续创造,加快成长!这是我参与「日新方案 10 月更文应战」的第29天,点击检查活动概略

前语

写过Spring结构的同学应该都知道,Spring傍边运用字段注入的时分既可以用 @Autowired 又可以用 @Resource,可是当我运用 @Autowired,idea会提示我说,不建议运用字段注入:

浅谈 @Autowired 和 @Resource 的差异

但假设我用的是 @Resource,就不会有这样的提示:

浅谈 @Autowired 和 @Resource 的差异

所以在好奇心的驱使下,我探求了一下他们两者的差异,并了解了为什么idea会对 @Autowired 宣告弱警告,在这里分享给我们。

默许注入办法不同

  1. @Autowired 默许的注入办法为byType(根据类型进行匹配),也就是说会优先根据接口类型去匹配并注入 Bean (接口的完结类),假设想要指定称谓,可以通过 @Qualifier 配合运用。

    @Autowired
    private UserSafetyMapper userSafetyMapper;
    // 或
    @Autowired @Qualifier("userSafetyMapper")
    private UserSafetyMapper userSafetyMapper;
    
  2. @Resource 默许注入办法为 byName(根据命名进行匹配)。假设无法通过称谓匹配到对应的完结类的话,注入办法会变为byType。

    • 假设同时指定了name和type,则从Spring上下文中找到仅有匹配的bean进行装置,找不到则抛出反常;
    • 假设指定了name,则从上下文中查找称谓(id)匹配的bean进行装置,找不到则抛出反常;
    • 假设指定了type,则从上下文中找到类型匹配的仅有bean进行装置,找不到或许找到多个,都会抛出反常;
    • 假设既没有指定name,又没有指定type,则主动依照byName办法进行装置;假设没有匹配,则回退为一个原始类型进行匹配,假设匹配则主动装置。
    // 1.默许注入办法
    @Resource
    private UserSafetyMapper userSafetyMapper;
    // 2.指定注入办法
    @Resource(name = "userSafetyMapper", type = UserSafetyMapper.class)
    private UserSafetyMapper userSafetyMapper;
    

供应者不同

@Autowired 是spring供应的注解,@Resource 是JDK供应的注解。其实这也是为什么idea会对 @Autowired 宣告警告,而不会对@Resource宣告警告的原因。


根据我查阅的一些资源和一点个人理解,得出以下剖析:

@Autowired 是Spring供应的,它只能适用于Spring,是特定IOC供应的特定注解,这就导致了程序和结构的强耦合,一旦换用了其他的IOC结构,就会导致失效,无法支撑注入。而 @ResourceJava供应的一种标准,一般的IOC容器应该去主动对 @Resource 做兼容,这样我们即使换了其他的结构,也可以正常运用字段注入的功用。

不过话又说回来,我们在建立一个项目的时分,刚开始选好结构了,今后很大或许就不会再去更换为其他的结构了,即使字段注入松耦合了,但其实还有其他更多的东西需要去修正,所以我个人认为用这两个都可以,具体运用哪个还得看公司的编码标准,个人项目的话,一致运用一个就好了。