@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:
- 首先按照类型(byType)在 Spring 容器中查找匹配的 Bean。
- 若找到多个相同类型的 Bean,会结合
@Qualifier
注解指定的名称进行匹配。 - 若未使用
@Qualifier
注解,会尝试按照属性名作为 Bean 的名称进行匹配。
- @Resource:
- 先根据
name
属性指定的名称查找对应的 Bean。 - 若
name
属性未指定,会使用属性名作为 Bean 的名称进行查找。 - 如果按名称查找不到,再按照类型(byType)进行查找。
- 先根据
参数使用
- @Autowired:有一个
required
参数,其默认值为true
,表示该依赖必须存在,如果容器中没有匹配的 Bean,会抛出异常。若将required
设置为false
,当容器中没有匹配的 Bean 时,会将该依赖设置为null
。示例代码如下:
@Service
public class UserService {
@Autowired(required = false)
private UserDao userDao;
}
- @Resource:有
name
和type
两个重要参数。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的名称