@Autowired和@Resource

文章目录

  • 简介
  • @Autowired注解
    • 什么是@Autowired注解
    • @Autowired注解的使用方式
    • @Autowired注解的优势和不足
  • @Qualifier
    • 总结:
  • @Resource注解
    • 什么是@Resource注解
    • @Resource注解的使用方式
    • @Resource注解的优势和不足
  • @Autowired vs @Resource
    • @Autowired和@Resource的区别
    • 为什么推荐使用@Resource
    • 选择适合场景的注解
  • 总结

简介

@Autowired和@Resource是Java Spring框架中用于依赖注入的注解。本文将介绍它们的定义、使用方式以及区别,帮助读者正确使用这两个注解。

@Autowired注解

什么是@Autowired注解

@Autowired是一个Spring特有的注解,用于自动装配Bean。它可以标记在字段、构造方法、Setter方法或者普通方法上,告诉Spring容器需要自动注入相关的依赖。
@Autowired和@Resource_第1张图片

@Autowired注解的使用方式

使用@Autowired注解的方式有以下几种:

  1. 字段注入:
@Autowired
private UserService userService;
  1. 构造方法注入:
@Autowired
public UserController(UserService userService) {
    this.userService = userService;
}
  1. Setter方法注入:
private UserService userService;

@Autowired
public void setUserService(UserService userService) {
    this.userService = userService;
}
  1. 方法注入:
@Autowired
public void init(UserService userService) {
    this.userService = userService;
}

@Autowired注解的优势和不足

优势:

  • 自动生成Bean的实例,简化了代码的编写。
  • 提高了代码的可读性和可维护性。

不足:

  • 如果有多个符合条件的Bean存在,会产生歧义,需要进一步指定匹配规则。

@Qualifier

@Qualifier注解是Spring框架提供的用于解决依赖注入歧义性的注解。当存在多个符合条件的Bean时,可以结合@Autowired或@Resource注解使用@Qualifier注解来明确指定要注入的Bean的名称或限定符。

通过在@Autowired或@Resource注解上使用@Qualifier注解,可以指定要注入的特定Bean的名称或限定符。这样能够解决当有多个相同类型的Bean存在时,容器无法确定要注入哪个Bean的问题。

以下是使用@Qualifier注解的示例:

@Component
public class MyService {
    @Autowired
    @Qualifier("myBean")
    private MyBean myBean;

    // ...
}

在这个例子中,当有多个类型为MyBean的Bean存在时,通过@Qualifier(“myBean”)注解指定要注入名为"myBean"的Bean。

需要注意的是,@Qualifier注解的值对应于具体Bean的名称或限定符。如果没有定义Bean的名称或限定符,则可以使用默认的限定符,默认情况下与Bean的类名(首字母小写)相同。

总结:

@Qualifier注解是Spring框架提供的用于解决依赖注入歧义性的注解。通过结合@Autowired或@Resource注解使用@Qualifier注解,可以明确指定要注入的特定Bean的名称或限定符。这样能够解决当有多个相同类型的Bean存在时,容器无法确定要注入哪个Bean的问题。

@Resource注解

什么是@Resource注解

@Resource是Java标准的注解,也可以用于依赖注入。它可以标记在字段、构造方法、Setter方法或者普通方法上,告诉容器需要自动注入相关的依赖。
@Autowired和@Resource_第2张图片

@Resource注解的使用方式

@Resource注解可以通过name属性指定要注入的Bean名称,如果没有指定name属性,则会根据字段名或方法名进行自动装配。
(先Name后type)

@Resource
private UserService userService;

@Resource注解的优势和不足

优势:

  • 可以指定要注入的Bean名称,避免了歧义。
  • 支持注入基本类型的值。

不足:

  • 没有提供required属性,无法对注入结果进行非空验证。

@Autowired vs @Resource

@Autowired和@Resource的区别

  1. 来源:@Autowired是Spring特有的注解,而@Resource是Java标准的注解。
  2. 自动装配规则:@Autowired默认按类型进行自动装配,@Resource默认按名称进行自动装配。
  3. 使用范围:@Autowired可以用于构造方法、字段、Setter方法等,而@Resource只能用于字段和Setter方法。
  4. 注入机制:@Autowired不能注入基本类型的值,而@Resource可以。

为什么推荐使用@Resource

为什么更推荐使用 @Resource ?
Resource注解在字段上,这个注解是属于J2EE的,减少了与spring的耦合。
但是其实啊,这个问题,我觉得很多人可能对它的理解有误!
更推荐使用 @Resource ,我觉得不是因为@Resource注解性能更好之类的。
而是因为其可以指定是通过 name 还是 type 的注入方式,而@Autowired注解本身自己是不能实现这个效果的,要和@Qualifier一起用才可以!

选择适合场景的注解

  • 如果只使用Spring框架,建议使用@Autowired注解。
  • 如果需要保持代码的独立性,或者可能迁移到其他容器中,建议使用@Resource注解。

总结

@Autowired 根据类型type注入,

@Qualifier(“cusInfoService”)//一般作为@Autowired()的修饰用,

@Autowired @Qualifie(“userService”) 两个结合起来可以根据名字和类型注入

@Resource 默认根据名字name注入,其次按照类型搜索,也可以通过name和type属性进行选择性注入

一般@Autowired和@Qualifier一起用,@Resource单独用。

当然没有冲突的话@Autowired也可以单独用

你可能感兴趣的:(java,spring,注解)