Bootstrap

@Autowired和@Resource什么区别

@Autowired@Resource 都是 Java Spring 框架中用于实现依赖注入的注解,不过它们存在一些区别,以下将从来源、注入方式、查找顺序、参数使用等方面展开详细介绍:

来源

  • @Autowired:它是 Spring 框架提供的注解,用于实现基于类型(byType)的依赖注入,这意味着 Spring 会根据依赖对象的类型来进行匹配和注入。
  • @Resource:属于 JSR-250 规范,是 Java 标准的注解,并非 Spring 特有的。这使得它在使用时具有更好的可移植性,在非 Spring 项目里也可以使用。

注入方式

  • @Autowired:默认采用按类型(byType)的方式进行注入。当 Spring 容器中存在多个相同类型的 Bean 时,它会抛出 NoUniqueBeanDefinitionException 异常。不过,你可以结合 @Qualifier 注解来指定具体要注入的 Bean 的名称,从而实现按名称(byName)的注入。示例代码如下:
@Service
public class UserService {
    @Autowired
    @Qualifier("userDaoImpl1")
    private UserDao userDao;
}
  • @Resource:默认按照名称(byName)进行注入。它会先根据指定的名称去查找对应的 Bean,如果找不到,再尝试按类型(byType)进行查找。示例代码如下:
@Service
public class UserService {
    @Resource(name = "userDaoImpl1")
    private UserDao userDao;
}

查找顺序

  • @Autowired
    1. 首先按照类型(byType)在 Spring 容器中查找匹配的 Bean。
    2. 若找到多个相同类型的 Bean,会结合 @Qualifier 注解指定的名称进行匹配。
    3. 若未使用 @Qualifier 注解,会尝试按照属性名作为 Bean 的名称进行匹配。
  • @Resource
    1. 先根据 name 属性指定的名称查找对应的 Bean。
    2. name 属性未指定,会使用属性名作为 Bean 的名称进行查找。
    3. 如果按名称查找不到,再按照类型(byType)进行查找。

参数使用

  • @Autowired:有一个 required 参数,其默认值为 true,表示该依赖必须存在,如果容器中没有匹配的 Bean,会抛出异常。若将 required 设置为 false,当容器中没有匹配的 Bean 时,会将该依赖设置为 null。示例代码如下:
@Service
public class UserService {
    @Autowired(required = false)
    private UserDao userDao;
}
  • @Resource:有 nametype 两个重要参数。name 用于指定要注入的 Bean 的名称,type 用于指定要注入的 Bean 的类型。通常情况下,只需要使用 name 参数即可。示例代码如下:
@Service
public class UserService {
    @Resource(name = "userDaoImpl1", type = UserDao.class)
    private UserDao userDao;
}

总结

  • 如果项目更强调遵循 Java 标准规范,且希望代码具有更好的可移植性,建议使用 @Resource
  • 如果项目是基于 Spring 框架开发,更倾向于使用 Spring 特有的功能和特性,@Autowired 是一个不错的选择,并且结合 @Qualifier 注解可以灵活地控制注入的 Bean。
  • Bean在注册的时候如果使用的方式是@Component及其衍生注解,使用的是类名首字母小写作为Bean的名称,如果使用@Bean注解,使用的是方法名作为Bean的名称