@Resource与@Autowired

`@Resource` 是 Java 持久化 API(JPA)中的一个注解,用于声明一个实体类(Entity)的属性或字段与数据库表记录的映射关系。当使用 JPA 进行数据库操作时,`@Resource` 注解可以帮助 JPA 提供者(如 Hibernate)识别实体类与数据库表之间的映射。

 

**作用**:

1. **实体与表的映射**:`@Resource` 注解用于指定实体类与数据库中的表之间的映射关系。它告诉 JPA 提供者,带有此注解的类代表数据库中的一个表。

2. **字段与列的映射**:`@Resource` 还可以用于指定实体类字段与数据库表列之间的映射关系,包括字段名、数据类型等。

3. **主键指定**:通过`@Id`属性,`@Resource` 注解可以标识实体类中的某个字段作为记录的主键。

4. **关联关系定义**:`@Resource` 可以与其他 JPA 注解一起使用,如`@OneToOne`、`@OneToMany`等,来定义实体之间的关联关系。

 

**具体例子**:

 

假设我们有一个用户表(users),我们想要创建一个实体类`User`来表示这个表的记录。

 

```java

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

 

@Entity // 标记这是一个 JPA 实体

public class User {

    @Id // 指定这个字段为主键

    @GeneratedValue(strategy = GenerationType.IDENTITY) // 主键生成策略

    private Long id;

 

    @Resource(name = "username") // 指定字段名与数据库列的映射关系

    private String username;

 

    @Resource(name = "email", nullable = false) // 指定字段名与数据库列的映射关系,并标记为非空

    private String email;

 

    // 省略其他字段、getter 和 setter 方法

}

```

 

在这个例子中,`User`类使用`@Entity`注解标记为一个 JPA 实体。`id`字段使用`@Id`注解标记为主键,并使用`@GeneratedValue`注解指定主键的生成策略。`username`和`email`字段使用`@Resource`注解来指定它们在数据库中的列名。

 

请注意,`@Resource`注解通常与 JPA 提供的 ORM(对象关系映射)功能一起使用,而不是单独使用。此外,`@Resource` 注解在 Spring 框架中也有不同的用途,例如用于注入 Spring 管理的 bean。在 JPA 语境下,`@Entity`和相关的 JPA 注解是更常见的选择。

 

 

 

`@Resource`注解在JPA(Java Persistence API)中并没有定义,它实际上是JDO(Java Data Objects)API中的一个注解,用于持久化。然而,在日常使用中,`@Resource`注解通常与Spring框架关联,用于依赖注入。

在Spring框架中,`@Resource`注解与`@Autowired`注解有类似的功能,它们都用于依赖注入。但是,它们的来源和行为略有不同:

1. **@Autowired**:
   - 是Spring框架提供的注解。
   - 默认按照类型(byType)进行自动装配。如果找到多个相同类型的bean,则可以通过`@Qualifier`注解结合使用,指定需要注入的具体bean。
   - 可以在构造函数、字段、setter方法上使用。
   - 是Spring 4.3之后推荐使用的依赖注入方式。

2. **@Resource**:
   - 是由JSR-250规范定义的注解,与特定的框架无关。
   - 默认按照名称(byName)进行注入。如果没有指定名称,那么会回退到按照类型(byType)进行注入。
   - 可以在字段、setter方法上使用,但不能用于构造函数。
   - 在多个相同类型的bean存在时,需要指定`name`属性来明确要注入的bean的名称。

**具体例子**:

使用`@Autowired`进行依赖注入:
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MyService {
    @Autowired
    private MyRepository myRepository;
}
```

使用`@Resource`进行依赖注入:
```java
import javax.annotation.Resource;

@Service
public class MyService {
    @Resource(name = "myRepository")
    private MyRepository myRepository;
}
```

在上述例子中,`MyService`类需要注入一个`MyRepository`类型的依赖。使用`@Autowired`时,Spring会自动寻找匹配的bean进行注入。而使用`@Resource`时,我们可以通过`name`属性指定要注入的具体bean的名称。如果没有指定`name`属性,`@Resource`也会按照类型进行注入,但这是在找不到按名称匹配的bean时的备选方案。

 

`@Resource`和`@Autowired`之间有几个主要区别:

1. 来源不同:`@Resource`是Java EE提供的注解,而`@Autowired`是Spring框架提供的注解。

2. 注入方式不同:`@Resource`可以按照名称或类型进行注入,而`@Autowired`主要按照类型进行注入。

3. 兼容性不同:`@Resource`可以注入任何对象,包括Java EE组件、Spring管理的bean等,而`@Autowired`主要用于自动装配Spring管理的bean。

4. 需要导入的包不同:`@Resource`需要导入`javax.annotation.Resource`包,而`@Autowired`需要导入`org.springframework.beans.factory.annotation.Autowired`包。 总的来说,虽然两者都可以用于依赖注入,但是`@Autowired`更常用于Spring应用中,因为它提供了更多的功能和灵活性。

 

 

 

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tin9898

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值