前言:

经常使用idea开发经常遇到@Resource注解和@Autowired注解,
本文来浅总结一下两者的异同

@Autowired

  1. @Autowired 是Spring中注入Bean所使用的注解,使用时需要导入包org.springframework.beans.factory.annotation.Autowired;

  2. 默认按照byType注入(优先根据接口类型去匹配注入 Bean (即接口的实现类))

tips: 默认情况下要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。

如想使用byName方式进行Bean注入,需要配合 @Qualifier注解使用:

eg:

 @Autowired
 @Qualifier("userMapper")
 private UserMapper userMapper; 

@Resource

  1. @Resource是JDK中的注解,使用时需要导入包javax.annotation.Resource

  2. 默认按照byName自动注入,存在两个属性:name和type

tips 如果无法通过名称(byName)匹配到对应的实现类的话,注入方式会变为byType

eg:

@Resource(name = "userMapper", type = UserMapper.class)
private UserMapper userMapper;

// 用在setter方法上
 @Resource(name="useDao")
  public void setUserDao(UserDao userDao) { 
    this.userDao = userDao;
  }

注: 最好是将@Resource放在setter方法上,更符合面向对象的思想,通过set、get去操作属性,而不是直接去操作属性。

补充:

  • 如果同时指定name和type,则从上下文中找到唯一匹配的bean进行装配注入,找不到则抛异常;
  • 如果指定name,则从上下文中查找名称匹配的bean进行装配注入,找不到则抛异常
  • 如果指定type,则从上下文中找到类型匹配的唯一bean进行装配注入,找不到或者找到多个,都会抛异常;
  • 如果既没有指定name,又没有指定type,则默认按照byName方式进行装配注入;如果不匹配,则回退为根据类型匹配,如果匹配则自动装配注入,否则抛异常

总结:

同:

  1. 都可作为上下文注入Bean所用注解

异:

    • @Autowired 是Spring的注解,使用时需要导入org.springframework.beans.factory.annotation.Autowired;

    • @Resource是jdk内置的java注解,使用时需要导入javax.annotation.Resource


    • @Autowired默认按照上下文类型匹配注入,如果没找到则抛异常

    • @Resource默认查找名称匹配注入,如果没找到则回退为根据上下文类型匹配,如果都没找到,则抛异常


    • @Autowired如果要根据名称匹配,需要配合 @Qualifier 注解使用

    • @Resource默认包含两个属性:name和type,分别指定名称和类型