注解Autowired与Resource的区别

注解来源

@Autowired是Spring框架所定义的注解,而@Resource是JSR-250规范定义的注解,你可以在spring中同时使用这两个注解

@Autowired

  • 由Spring提供,只按照byType注入

  • 只有一个属性required,默认值为true,表示注入时对应的bean必须存在,找不到则抛出异常,为false时,找不到就跳过并赋值为null

  • 按照类型进行查找,如果对应类型的bean不唯一,将抛出异常

    • 可通过组合注解解决

      1
      2
      3
      @Autowired
      @Qualifier("userMapperImpl")
      private UserMapper userMapper;

@Resource

@Resource有两个常用属性:name、type,因此存在四种注入情况

  1. 都不指定,即默认情况下:先通过name作为key去查找,如果找不到再通过type去查找,如果找不到或结果不唯一则抛出异常
  2. 指定name:通过name找到唯一的bean,找不到将抛出异常
  3. 指定type:通过type找到唯一的bean,如果不唯一或找不到则抛出异常
  4. 指定name和type:通过name找到唯一的bean,找不到抛出异常;如果type和字段类型不一致,也会抛出异常

相同点

  1. Spring都支持
  2. 都可以作用在字段和setter方法上

不同点

  1. Resource是JDK提供的,而Autowired是Spring提供的
  2. Resource不允许找不到bean的情况,而Autowired可以允许@Autowired(required = false)
  3. 指定name的方式不一样
    • @Resource(name = "baseDao")
    • @Autowired()@Qualifier("baseDao")
  4. Resource默认通过name查找,而Autowired默认通过type查找

推荐使用@Resource注解在字段上,这样就不用写setter方法了,并且这个注解是属于J2EE的,减少了与Spring的耦合。