@Resource
和 @Autowired
是在Spring框架中用于依赖注入的两个注解。虽然它们都有助于自动注入依赖,但它们的行为和用法存在一些不同之处。下面是对这两个注解的详细对比和使用指南:
@Autowired
@Autowired
是Spring框架提供的注解,用于自动装配依赖对象。它可以用于字段、构造函数和setter方法。
特点
-
按类型注入:
@Autowired
默认按类型进行注入。如果有多个同类型的bean,可以结合@Qualifier
注解使用来指定具体的bean。
-
可选依赖:
- 可以使用
required
属性来指定依赖是否必须。默认情况下,@Autowired
会将依赖标记为必需的,如果找不到相应的bean,Spring会抛出异常。 - 设置为可选:
@Autowired(required = false)
- 可以使用
-
支持构造函数注入:
- 可以用于构造函数注入,用于在创建对象时注入依赖。
示例
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;
}
}
@Resource
@Resource
是Java标准(JSR-250)提供的注解,可以在任何支持JSR-250的容器中使用。Spring也支持该注解。
特点
-
按名称注入:
@Resource
默认按名称进行注入。如果没有找到匹配的bean,则按类型进行注入。
-
更灵活的属性:
- 可以使用
name
和type
属性来指定需要注入的bean。 name
:指定要注入的bean的名称。type
:指定要注入的bean的类型。
- 可以使用
-
与其他容器兼容:
@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;
}
}
选择使用 @Autowired 还是 @Resource
-
使用
@Autowired
:- 更符合Spring的依赖注入风格,特别是在Spring特定的应用中。
- 支持按类型注入,并且结合
@Qualifier
使用可以更灵活地控制注入的bean。 - 适合Spring特有的特性和配置,如
required
属性。
-
使用
@Resource
:- 如果需要Java标准的兼容性,或者需要在非Spring容器中使用。
- 默认按名称注入,更符合某些特定命名的需求。
- 可以通过
name
和type
属性精确指定要注入的bean。
例子总结
假设有一个 MyRepository
接口及其实现类:
import org.springframework.stereotype.Repository;
@Repository
public class MyRepositoryImpl implements MyRepository {
// 实现方法
}
在 MyService
中使用 @Autowired
注入:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MyService {
@Autowired
private MyRepository myRepository;
// 使用myRepository的方法
}
在 MyService
中使用 @Resource
注入:
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
@Service
public class MyService {
@Resource
private MyRepository myRepository;
// 使用myRepository的方法
}
总之,@Autowired
和 @Resource
都可以用于依赖注入,但它们的默认行为不同。在大多数Spring应用中,@Autowired
更常见,但在需要标准兼容性或特定命名注入时,@Resource
也是一个很好的选择。
本文来自博客园,作者:茄子_2008,转载请注明原文链接:https://www.cnblogs.com/xd502djj/p/18311008