@AutoWired和@Resource的区别
- 来源不同:
- @AutoWired是Spring提供的注解.
- @Resource是Java EE提供的,来源于java.annotation包,是JSR-250的一部分,所以,@Resource不是Spring特有的,它可以使用在所有遵循Java EE标准的项目中。
- 注入方式不同:
- @AutoWired默认是按照byType进行依赖注入的,也就是变量的类型,如果存在多个同样类型的Bean,Spring机会进一步使用变量名进行匹配。
- @Resource默认是按照byName进行依赖注入的,也就是变量名。
- 代码示例:
// @Autowired示例 public class BookService { @Autowired // 默认按照BookRepository进行注入依赖 private BookRepository bookRepository; } // @Resource示例 public class BookService { // 使用 @Resource 默认按照来按bookRepository(名称)注入依赖 @Resource private BookRepository bookRepository; }
- 可定制性:
- @AutoWired可以和@Qualifier一起使用,@Qualifier允许指定注入哪一个bean。
- @Resource是按照name进行注入的。
- 代码示例:
// @AutoWired和@Qualifier一起使用,@Qualifier指定注入哪一个bean。 public class BookService { @Autowired // 默认按照BookRepository进行注入依赖 @Qualifier("bookRepository") private BookRepository bookRepository; }
- 必须性
- @AutoWired默认是必须注入的,如果它在SpringIOC容器中找不到这个bean,就会抛出异常。但是可以通过将@AutoWired的required属性设置为false,就可以改变这个必须性。
- @Resource默认不是必须的,如果在IOC容器中找不到对应的Bean,会让程序继续运行,然后将该字段不会被设置,就是null。
- 代码示例:
// 设置@AutoWired的required属性为false。 public class BookService { @Autowired(required = false) private BookRepository bookRepository; }
- 兼容性:
- @AutoWired是Spring特有的,只能在Spring相关依赖的项目中使用。
- @Resource使用所有遵循javaEE规范的项目中,更加通用。
在实际使用时,你应根据自己的具体需求和环境选择两者之一。如果你完全在Spring环境中工作,@Autowired
是一个不错的选择,因为它能充分利用Spring容器的各项功能。如果你希望你的应用更加可移植,或者遵循Java EE标准,选择@Resource
可能更合适。