【Spring实战】28 @Autowired 和 @Resource注解的区别与使用

发布时间:2024年01月14日

Spring 框架是一个强大的 Java 企业应用开发框架,提供了多种依赖注入的方式。其中,@Autowired@Resource 是两个常用的注解,用于实现依赖注入。本文将介绍这两个注解的区别以及在实际应用中如何进行选择。

1. 区别

1)匹配方式

  • @Autowired 是由 Spring 框架提供的注解,用于实现自动装配。它是根据类型进行匹配的,可以用在构造方法、Setter 方法、字段上,甚至可以用在方法参数上。

    @Autowired
    private DemoService DemoService;
    
  • @Resource 是 Java EE 提供的注解,Spring 框架也对其提供支持。它是根据名称进行匹配的,可以用在字段、Setter 方法上,也可以用在方法参数上。

    @Resource(name = "demoService")
    private DemoService DemoService;
    

2)属性名称

  • @Autowired 没提供明确的属性名称指定,它是根据类型进行匹配的,没有类似于 name 属性的指定方式

3)处理方式

  • @Autowired 按照类型匹配进行注入,如果有多个类型匹配,Spring 会选择最匹配的 bean 进行注入。如果没有匹配的bean,会抛出异常

  • @Resource 按照名称匹配进行注入,首先按照指定的名称查找 bean,如果没有找到,则按照类型查找

4)支持类型

  • @Autowired 是 Spring 提供的注解,更加特定于 Spring 框架

  • @Resource 是 Java EE 提供的注解,因此在不使用 Spring 框架时也可以使用

    ? 但是,在 Spring 中更推荐使用 @Autowired

2. 如何选择

在选择使用 @Autowired 还是 @Resource 时,可以根据具体情况考虑以下几点:

  • 项目框架选择:

    如果是纯 Spring 项目,建议使用 @Autowired,因为它更加灵活,是 Spring 框架本身提供的特性。如果需要与非 Spring 框架的组件进行整合,或者在非 Spring 项目中使用,可以考虑使用 @Resource

  • 依赖注入方式:

    如果注重类型匹配,而不关心名称,使用 @Autowired。如果需要根据名称进行匹配,使用 @Resource

  • 项目约定:

    在团队中建议使用一致的注解,以便统一代码风格。可以根据项目的实际情况,选择一种注解作为主要的依赖注入方式

3. 代码示例

使用@Autowired注解的示例:

DemoService.java

package com.cheney.demo.service;

import org.springframework.stereotype.Service;

@Service
public class DemoService {

    public void syaHello(){
        System.out.println("Hello");
    }
}

DemoController.java

package com.cheney.demo.controller;

import com.cheney.demo.service.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {

    @Autowired
    private DemoService demoService;

    public void hello() {
        demoService.syaHello();
    }
}

使用@Resource注解的示例:

DemoService.java

package com.cheney.demo.service;

import org.springframework.stereotype.Service;

@Service
public class DemoService {

    public void syaHello(){
        System.out.println("Hello");
    }
}

DemoController.java

package com.cheney.demo.controller;

import com.cheney.demo.service.DemoService;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {

    @Resource(name = "demoService")
    private DemoService demoService;

    public void hello() {
        demoService.syaHello();
    }
}

在以上示例中,DemoService 是一个服务类,DemoController 是一个控制器类。通过 @Autowired@Resource 注解,实现了 DemoService 的依赖注入。选择使用哪种注解取决于项目的具体需求和约定。

文章来源:https://blog.csdn.net/yanyc0411/article/details/135576044
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。