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)一起使用。

发表评论

后才能评论