@Resource@Autowired 是在Spring框架中用于依赖注入的两个注解。虽然它们都有助于自动注入依赖,但它们的行为和用法存在一些不同之处。下面是对这两个注解的详细对比和使用指南:

@Autowired

@Autowired 是Spring框架提供的注解,用于自动装配依赖对象。它可以用于字段、构造函数和setter方法。

特点
  1. 按类型注入
  • @Autowired 默认按类型进行注入。如果有多个同类型的bean,可以结合 @Qualifier 注解使用来指定具体的bean。
  1. 可选依赖
  • 可以使用 required 属性来指定依赖是否必须。默认情况下,@Autowired 会将依赖标记为必需的,如果找不到相应的bean,Spring会抛出异常。
  • 设置为可选:@Autowired(required = false)
  1. 支持构造函数注入
  • 可以用于构造函数注入,用于在创建对象时注入依赖。
示例
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MyService {

    @Autowired
    private MyRepository myRepository;

    // 或者使用构造函数注入
    private final MyRepository myRepository;

    @Autowired
    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    // 或者使用setter注入
    private MyRepository myRepository;

    @Autowired
    public void setMyRepository(MyRepository myRepository) {
        this.myRepository = myRepository;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.

@Resource

@Resource 是Java标准(JSR-250)提供的注解,可以在任何支持JSR-250的容器中使用。Spring也支持该注解。

特点
  1. 按名称注入
  • @Resource 默认按名称进行注入。如果没有找到匹配的bean,则按类型进行注入。
  1. 更灵活的属性
  • 可以使用 nametype 属性来指定需要注入的bean。
  • name:指定要注入的bean的名称。
  • type:指定要注入的bean的类型。
  1. 与其他容器兼容
  • @Resource 是一个标准的Java注解,不仅限于Spring,可以在其他支持JSR-250的容器中使用。
示例
import javax.annotation.Resource;
import org.springframework.stereotype.Component;

@Component
public class MyService {

    @Resource(name = "myRepository")
    private MyRepository myRepository;

    // 或者只按类型注入
    @Resource
    private MyRepository myRepository;

    // 或者使用setter注入
    private MyRepository myRepository;

    @Resource
    public void setMyRepository(MyRepository myRepository) {
        this.myRepository = myRepository;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

选择使用 @Autowired 还是 @Resource

  • 使用 @Autowired
  • 更符合Spring的依赖注入风格,特别是在Spring特定的应用中。
  • 支持按类型注入,并且结合 @Qualifier 使用可以更灵活地控制注入的bean。
  • 适合Spring特有的特性和配置,如 required 属性。
  • 使用 @Resource
  • 如果需要Java标准的兼容性,或者需要在非Spring容器中使用。
  • 默认按名称注入,更符合某些特定命名的需求。
  • 可以通过 nametype 属性精确指定要注入的bean。

例子总结

假设有一个 MyRepository 接口及其实现类:

import org.springframework.stereotype.Repository;

@Repository
public class MyRepositoryImpl implements MyRepository {
    // 实现方法
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

MyService 中使用 @Autowired 注入:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    @Autowired
    private MyRepository myRepository;

    // 使用myRepository的方法
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

MyService 中使用 @Resource 注入:

import javax.annotation.Resource;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    @Resource
    private MyRepository myRepository;

    // 使用myRepository的方法
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

总之,@Autowired@Resource 都可以用于依赖注入,但它们的默认行为不同。在大多数Spring应用中,@Autowired 更常见,但在需要标准兼容性或特定命名注入时,@Resource 也是一个很好的选择。