一文搞懂Spring中@Autowired和@Resource的区别

yizhihongxing

下面我就来详细讲解一下 “一文搞懂Spring中@Autowired和@Resource的区别”的完整攻略。

1. 背景知识

在讲解 @Autowired 和 @Resource 之前,我们先来简要了解一下Spring中的IOC和DI。IOC(Inversion of Control),即控制反转,是指将创建对象的主动权交给Spring框架,由Spring框架来创建对象和管理对象之间的依赖关系。DI(Dependency Injection),即依赖注入,是指将对象所需的依赖关系通过注入的方式来完成的。Spring中使用注解的方式来实现依赖注入,其中 @Autowired 和 @Resource 就是Spring常用的两个注解。

2. @Autowired注解

@Autowired 是 Spring 提供的注解之一,通过 @Autowired 注解可以完成自动装配功能,它是按照类型自动装配的。

2.1 自动装配类型

@Autowired 注解有两种自动装配类型:

  • by Type:按照类型自动装配
  • by Name:按照名称自动装配

其中,按照类型自动装配是默认选择的方式,如果要按照名称自动装配,则需要通过 @Qualifier 注解指定要装配的实例名称。

2.2 示例说明

接下来我们通过实例来说明 @Autowired 的使用。

首先,我们定义两个接口:

public interface IStudent {
    void study();
}

public interface ITeacher {
    void teach();
}

然后,创建两个实现类:

@Component("student1")
public class Student implements IStudent {
    @Override
    public void study() {
        System.out.println("学生正在学习...");
    }
}

@Component("teacher1")
public class Teacher implements ITeacher {
    @Override
    public void teach() {
        System.out.println("老师正在讲课...");
    }
}

在代码中,@Component("student1") 表示将 Student 类注入Spring容器,并取一个别名为 student1。@Component("teacher1") 同理。

接下来,我们通过 @Autowired 注解将 IStudent 接口注入到 ITeacher 接口中。

@Service
public class TeacherService {
    @Autowired
    private IStudent student;

    public void teach() {
        student.study();
        System.out.println("老师正在讲课...");
    }
}

在代码中,@Service 注解表示将 TeacherService 类注入Spring容器。

最后,我们来验证一下:

public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    TeacherService teacherService = (TeacherService) context.getBean("teacherService");
    teacherService.teach();
}

运行结果如下:

学生正在学习...
老师正在讲课...

从结果可以看出,TeacherService 类成功注入了 IStudent 接口,并成功调用了 Student 类中的 study() 方法,说明 @Autowired 注解的使用是正确的。

3. @Resource注解

@Resource 是 JSR-250 规范中的注解,也是Spring提供的注解之一,通过 @Resource 注解可以完成自动装配功能,它是按照名称自动装配的。

3.1 自动装配类型

@Resource 注解有两种自动装配类型:

  • by Name:按照名称自动装配
  • by Type:按照类型自动装配

其中,按照名称自动装配是默认选择的方式,如果要按照类型自动装配,则需要通过 @Resource 的 type 属性指定要装配的类型。

3.2 示例说明

接下来我们通过实例来说明 @Resource 的使用。

首先,我们创建一个接口:

public interface IHello {
    void sayHello();
}

然后,创建两个实现类:

@Service
public class HelloChina implements IHello {
    @Override
    public void sayHello() {
        System.out.println("你好,中国!");
    }
}

@Service
public class HelloAmerica implements IHello {
    @Override
    public void sayHello() {
        System.out.println("Hello, America!");
    }
}

在代码中,@Service 表示将 HelloChina 和 HelloAmerica 类注入Spring容器。

接下来,我们在一个新的类中使用 @Resource 注解来进行自动装配,并指定要装配的名称。

@Service
public class HelloService {
    @Resource(name = "helloChina")
    private IHello hello;

    public void sayHello() {
        hello.sayHello();
    }
}

在代码中,@Service 表示将 HelloService 类注入Spring容器。

最后,我们来验证一下:

public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    HelloService helloService = (HelloService) context.getBean("helloService");
    helloService.sayHello();
}

运行结果如下:

你好,中国!

从结果可以看出,HelloService 类成功注入了 HelloChina 类,并成功调用了 HelloChina 类中的 sayHello() 方法,说明 @Resource 注解的使用是正确的。

4. 总结

通过对 @Autowired 和 @Resource 进行详细的讲解和示例说明,我们可以得出如下结论:

  • @Autowired 是按照类型自动装配的,而 @Resource 是按照名称自动装配的;
  • @Autowired 默认按照类型自动装配,如果要按照名称自动装配,则需要通过 @Qualifier 注解指定要装配的实例名称;
  • @Resource 默认按照名称自动装配,如果要按照类型自动装配,则需要通过 @Resource 的 type 属性指定要装配的类型;
  • 两种注解的使用场景不同,应根据实际需要进行选择。

希望本文对大家对于 @Autowired 和 @Resource 的区别有所了解,谢谢!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文搞懂Spring中@Autowired和@Resource的区别 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 正则替换replace中$1的用法w3c

    当然,我可以为您提供有关“正则替换replace中$1的用法w3c”的完整攻略,以下是详细说明: 什么是正则替换replace? 正则替换replace是一种JavaScript字符串方法,用于在字符串中查找并替换匹配的文本。它使用正则表达式来匹配文本,并使用替换字符串来替换匹配的文本。 $1的用法 在正则替换replace中,$1表示正则表达式中第一个捕获…

    other 2023年5月7日
    00
  • VS2015编译Qt5.7.0生成支持XP的静态库(很不错)

    VS2015编译Qt5.7.0生成支持XP的静态库(很不错) 在使用Qt进行开发时,有时需要生成静态库以供其他开发者使用,同时为了兼容Windows XP系统,可以使用以下步骤在VS2015中编译Qt5.7.0生成支持XP的静态库。 步骤一:下载Qt5.7.0源码包并解压 在官网下载Qt5.7.0源码,解压到本地的一个路径下,例如 C:\Qt\qt-ever…

    其他 2023年3月28日
    00
  • 三星S4怎么查看内存?三星Galaxy S4手机内存使用情况查看教程

    三星S4怎么查看内存?三星Galaxy S4手机内存使用情况查看教程 1. 打开设置菜单 首先,我们需要打开三星S4手机的设置菜单。可以通过以下步骤完成: 在主屏幕上找到并点击应用程序图标(通常是一个方形的图标,上面有一个小格子)。 在应用程序列表中,向上或向下滚动,找到并点击“设置”图标(通常是一个齿轮形状的图标)。 2. 进入存储设置 一旦你打开了设置菜…

    other 2023年8月2日
    00
  • PHP框架laravel的.env文件配置教程

    下面是关于PHP框架laravel的.env文件配置教程的完整攻略,主要包括.env文件的作用、.env文件的配置方法和相关示例说明: .env文件的作用 .env文件是laravel框架中的一个配置文件,用于存储应用程序的环境变量,比如数据库连接信息、API密钥、邮件服务信息等。这些环境变量可以在应用程序中通过env()函数读取和使用。通过使用.env文件…

    other 2023年6月25日
    00
  • C#教程(1) — .Net与C#简介

    C#教程(1)–.Net与C#简介的完整攻略 本文将为您提供C#教程(1)–.Net与C#简介的完整攻略,包括.Net和C#的定义、.Net和C#的关系、C#的特点、C#的开发环境、C#的示例说明等内容。 .Net和C#的定义 .Net是一个由微软公司开发的软件框架,用于开发和运行各种类型的应用程序。.Net框架包括一个运行时环境、一个类库和一组工具,可…

    other 2023年5月6日
    00
  • realtekrtl8111内建网卡-黑苹果之路

    Realtek RTL8111内建网卡-黑苹果之路 当安装黑苹果系统时,一些硬件设备可能无法正常工作,例如内建网卡。在这篇文章中,我们将介绍如何使用Realtek RTL8111内建网卡在黑苹果系统上实现网络连接。 确定系统版本 首先,你需要确定你安装的黑苹果系统的版本号。在这里我们以macOS High Sierra为例。 下载相关驱动程序 接下来,你需要…

    其他 2023年3月28日
    00
  • js为鼠标添加右击事件防止默认的右击菜单弹出

    你好,下面是关于“js为鼠标添加右击事件防止默认的右击菜单弹出”的完整攻略: 简述 在使用JavaScript开发网页时,我们常常需要对用户的操作进行一些限制或自定义,比如防止用户通过鼠标右键打开默认的右键菜单。在这种情况下,我们可以用JavaScript为鼠标添加右击事件,并阻止默认的右键菜单弹出。 实现步骤 阻止默认右键菜单 为了阻止默认的右键菜单弹出,…

    other 2023年6月27日
    00
  • 前端算法题解leetcode114二叉树展开为链表

    关于前端算法题解leetcode114二叉树展开为链表,我给出完整的攻略如下: 问题概述 给定一个二叉树,原地将它展开为一个单链表。其中,展开后的单链表应该符合如下要求: 单链表的右节点指针为原先的二叉树中序遍历的后继节点。 单链表的左节点应该为空(因为右节点指针已经代替了左右子树指针)。 例如,给定如下二叉树: 1 / \ 2 5 / \ \ 3 4 6 …

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部