从@Resource到@Autowired:依赖注入中的两大战将,该选择哪一个

createh52周前 (03-04)技术教程2

Spring Framework是一款广泛应用于Java开发的轻量级框架。Spring Framework提供了很多核心功能,如依赖注入(Dependency Injection)和面向切面编程(Aspect-Oriented Programming),这些功能大大简化了应用程序的开发和维护。在Spring Framework中,@Resource和@Autowired是两个重要的注解,它们都可以用来进行依赖注入,但在使用时却存在一些差异。那么,既生@Resource,何生@Autowired?这是本文要探讨的问题。

一、@Resource和@Autowired的区别

@Resource和@Autowired都是Spring Framework中用来进行依赖注入的注解,但它们在使用时有一些不同点。

  1. 名称匹配规则不同

@Autowired 先根据接口的类型注入 , 如果对应的类找不到 , 会扫描容器中Bean的名字进行注入

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
}

在上面的代码中,@Autowired会寻找名为"userDao"的bean并将其注入到userDao字段中。如果有多个名为"userDao"的bean,则会按照类型进行匹配。

而@Resource则默认按照名称进行注入,如果名称匹配多个bean,则抛出异常。例如:

@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserDao userDao;
}

在上面的代码中,@Resource会寻找名为"userDao"的bean并将其注入到userDao字段中。如果有多个名为"userDao"的bean,则会抛出异常。

如果要使用@Resource进行按类型匹配,则需要设置其name属性。例如:

@Service
public class UserServiceImpl implements UserService {
    @Resource(name="userDaoImpl")
    private UserDao userDao;
}

在上面的代码中,@Resource会寻找类型为UserDao的bean并将其注入到userDao字段中。如果有多个类型为UserDao的bean,则需要通过name属性来指定要注入的bean。

  1. 支持的注入方式不同

@Autowired支持按照类型、名称、构造函数进行注入。例如:

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
    }
}

在上面的代码中,@Autowired会将UserDao类型的bean注入到构造函数中。

而@Resource只支持按照名称进行注入。例如:

@Service
public class UserServiceImpl implements UserService {
    @Resource(name="userDaoImpl")
    private UserDao userDao;
}

在上面的代码中,@Resource会将名为"userDaoImpl"的bean注入到userDao字段中。

  1. @Autowired可以为null,@Resource必须存在

@Autowired可以标注在字段或者方法上,如果没有匹配的bean,则该字段或方法的值为null。例如:

@Service
public class UserServiceImpl implements UserService {
    @Autowired(required=false)
    private UserDao userDao;
}

在上面的代码中,如果没有名为"userDao"的bean,则userDao的值为null。

而@Resource必须存在匹配的bean,否则会抛出异常。例如:

@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserDao userDao;
}

在上面的代码中,如果没有名为"userDao"的bean,则会抛出异常。

二、@Resource和@Autowired的使用场景

@Resource和@Autowired都可以用来进行依赖注入,但在使用时应根据实际情况选择。

  1. @Autowired的使用场景

@Autowired适用于按照类型注入的场景,例如:

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
}

在上面的代码中,@Autowired会将类型为UserDao的bean注入到userDao字段中,这种方式比较简洁。

另外,@Autowired还适用于按照名称注入的场景,例如:

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    @Qualifier("userDaoImpl")
    private UserDao userDao;
}

在上面的代码中,@Autowired会将名为"userDaoImpl"的bean注入到userDao字段中,@Qualifier用来指定要注入的bean。

  1. @Resource的使用场景

@Resource适用于按照名称注入的场景,例如:

kotlinCopy code@Service
public class UserServiceImpl implements UserService {
    @Resource(name="userDaoImpl")
    private UserDao userDao;
}

在上面的代码中,@Resource会将名为"userDaoImpl"的bean注入到userDao字段中。

如果需要按照类型注入,则需要设置其name属性,例如:

@Service
public class UserServiceImpl implements UserService {
    @Resource(name="userDaoImpl")
    private UserDao userDao;
}

在上面的代码中,@Resource会将类型为UserDao的bean注入到userDao字段中。

四、使用建议

  • 如果项目只使用了Spring Framework,建议使用@Autowired注解。
  • 如果项目同时使用了Java EE和Spring Framework,建议使用@Resource注解。
  • 如果需要按照名称进行注入,则建议使用@Resource注解。
  • 如果需要按照类型进行注入,则建议使用@Autowired注解。
  • 在使用@Autowired注解时,建议搭配使用@Qualifier注解,来指定需要注入的bean的名称。

五、结论

综上所述,@Autowired和@Resource都是Spring Framework中用来进行依赖注入的注解,它们的作用类似,但是它们之间还是有一些区别的。在实际开发中,应根据实际情况选择使用哪种注解,以达到最佳的效果。

相关文章

解决maven依赖冲突,这篇就够了

一、前言什么是依赖冲突依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成了包版本冲突。依赖冲突的原因我们在maven项目的pom中 一般会引用许许多多的dependency。例如,项目A...

大厂面试必问之Spring的循环依赖

面试的重点,大厂必问之一:循环依赖1. 什么是循环依赖看下图image.png??上图是循环依赖的三种情况,虽然方式有点不一样,但是循环依赖的本质是一样的,就你的完整创建要依赖与我,我的完整创建也依赖...

Java项目中启动报错循环依赖问题解决

项目启动时候失败,有时候经常看到这样的错误信息:Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationExceptio...

彻底搞懂Spring依赖注入(一)Bean实例创建过程

上一章介绍了Bean的加载过程(IOC初始化过程),加载完成后,紧接着就要用到它的依赖注入(IOC 依赖注入)。那什么是依赖注入呢?所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到...

Spring之IOC&依赖注入

0x01、Spring1什么是Spring Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的(解耦)。? 框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时...

手把手教你解决循环依赖,一步一步地来窥探出三级缓存的奥秘

先不去管Spring中的循环依赖,我们先实现一个自定义注解,来模拟@Autowired的功能。一、自定义注解模拟@Autowired自定义Load注解,被该注解标识的字段,将会进行自动注入/** *...