Spring 中使用 @Resource,@Autowired,@lnject 的区别有哪些?
@Autowired
, @Resource
, 和 @Inject
都是用于依赖注入的注解,它们在功能上相似,但有一些关键的区别:
@Autowired
是Spring框架的注解。它可以对类成员变量、方法及构造函数进行标注,实现自动装配的功能。默认按类型进行装配(by type),如果想按名称进行装配(by name),可以结合@Qualifier
注解进行使用。-
@Resource
是来自JSR-250规范的注解。默认按名称(by name)进行装配,如果没有指定 name 属性,那么按类型(by type)进行装配。只能标注在字段和setter方法上,不能标注在构造函数上。 -
@Inject
是来自JSR-330规范的注解,它的功能和@Autowired
类似,但它不支持required=false
选项。
这三个注解的使用取决于具体的需求和个人的选择。如果你正在使用Spring框架,并且需要使用 required=false
选项,那么 @Autowired
可能是最好的选择。如果你正在编写能与多种DI框架(如Guice)兼容的代码,那么 @Inject
是一个好的选择。如果你的代码需要遵循JSR-250规范,那么应该使用 @Resource
。
以下是这些注解的使用示例:
@Service
public class MyService {
@Autowired
private MyDao myDao; // Spring will inject a MyDao instance by type
@Resource(name="myOtherDao")
private MyDao myOtherDao; // Spring will inject a MyDao instance by name
@Inject
private MyThirdDao myThirdDao; // Spring or Guice will inject a MyThirdDao instance by type
}
在这个例子中,@Autowired
、@Resource
和@Inject
都被用来注入 MyDao
的实例。但是,@Autowired
是按类型注入,@Resource
是按名称注入,@Inject
是按类型注入并且可以与其他DI框架(如Guice)一起使用。