一、@Resource和@Autowire注解的区别

@Resource和@Autowired都是用来进行依赖注入的注解,但是它们有一些不同之处。

@Autowired是Spring框架中的注解,它可以用来标注字段、构造函数、方法等,表示需要自动装配。它可以用来注入依赖的bean。如果有多个bean符合条件,可能会抛出异常。

@Resource是Java自带的注解,它可以用来标注字段、方法等,表示需要自动装配。它可以用来注入依赖的bean。如果有多个bean符合条件,会按照名称进行匹配。

总结:

  • @Autowired 是 Spring 框架中的注解,用来标注需要自动装配的 bean。
  • @Resource 是 Java 自带的注解,用来标注需要自动装配的 bean。
  • @Autowired 是按类型装配,如果有多个同类型的 bean,会抛出异常; @Resource 是按名称装配,如果名称不存在,会使用类型装配。

二、详细说明

下面是一个使用@Autowired和@Resource注解进行依赖注入的示例:
代码如下(示例):

// 定义一个服务类
@Service
public class MyService {
    // 使用@Autowired注入一个Dao
    @Autowired
    private MyDao myDao;
}

// 定义一个Dao类
@Repository
public class MyDao {
    // 使用@Resource注入一个DataSource
    @Resource
    private DataSource dataSource;
}

使用@Autowired 注解,会按类型装配,如果有多个同类型的 bean,会抛出异常。
使用@Resource 注解,会按名称装配,如果名称不存在,会使用类型装配。

  • 如果你的项目中没有多个同类型的bean,那么@Autowired和@Resource是可以互换使用的,如果有多个同类型的bean,那么就要使用@Resource进行指定名称注入。
  • 如果有多个同类型的bean,但是你没有使用@Resource进行名称指定,就会抛出异常,所以在使用@Autowired注解时,要确保只有一个同类型的bean。

什么是同类型的Bean

在上面的示例中,同类型的bean指的是有多个类型为MyDao的bean存在于Spring容器中,如果使用@Autowired注解进行注入的话,Spring容器并不知道应该注入哪一个MyDao类型的bean,因此会抛出异常。

换句话说就是如果你在项目中有多个类都是实现了同一个接口或者继承了同一个类,并且这些类都被标记为了@Service,@Repository等等,并且你在其他地方使用了这个接口或者类进行了注入,那么就会出现多个同类型的bean的情况。

比如说你有两个类A和B都是实现了接口I,并且都是被标记为了@Service的,那么当你在其他地方使用I进行注入的时候,就会出现多个同类型的bean的情况。


总结

总的来说,@Autowired和@Resource都是用来进行依赖注入的注解,但是它们有一些不同之处:

  • @Autowired 是 Spring 框架中的注解,用来标注需要自动装配的 bean,默认按类型装配,如果有多个同类型的 bean,会抛出异常。
  • @Resource 是 Java 自带的注解,用来标注需要自动装配的 bean,按照名称进行装配,如果名称不存在,会使用类型装配。

如果你的项目中没有多个同类型的bean,那么@Autowired和@Resource是可以互换使用的,如果有多个同类型的bean,那么就要使用@Resource进行指定名称注入。

提示:更多内容可以访问Clang’s Blog:https://www.clang.asia

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐