【Spring Boot 初识丨六】依赖注入

news2024/11/27 14:45:49

上一篇讲了 Spring Boot 的beans
本篇来讲一讲 依赖注入
Spring Boot 初识:
【Spring Boot 初识丨一】入门实战
【Spring Boot 初识丨二】maven
【Spring Boot 初识丨三】starter
【Spring Boot 初识丨四】主应用类
【Spring Boot 初识丨五】beans

依赖注入

  • 一、 定义
  • 二、 实现
    • 2.1 @Autowired
    • 2.2 @Resource
    • 2.3 @Inject
    • 2.4 @ComponentScan

一、 定义

  Spring Boot 依赖注入(Dependency Injection,DI)是 Spring
框架提供的一种解耦方式,它允许将对象之间的依赖关系通过外部配置文件或注解进行管理,从而实现松散耦合。

二、 实现

2.1 @Autowired

  @Autowired 注解:这是 Spring 框架中最常用的依赖注入方式。通过在需要注入的字段或方法上添加 @Autowired 注解,Spring Boot 会自动将对应的 bean 注入到该字段或方法中。

示例:


@Service

public class UserServiceImpl implements UserService {

    @Autowired

    private UserRepository userRepository;



    // ...其他代码

}



Autowired

在这里插入图片描述
  将构造函数、字段、setter 方法或配置方法标记为由 Spring 的依赖注入工具自动装配。 这是 JSR-330 Inject注释的替代方法,添加了必需与可选的语义。

自动装配构造函数
  任何给定 bean 类的只有一个构造函数可以声明此注释并将属性 required()设置为true,指示构造函数在用作 Spring bean 时自动装配。此外,如果该required 属性设置为true,则只能使用 @Autowired。
  注释一个构造函数如果多个非必需构造函数声明注解,它们将被视为自动装配的候选者。将选择 Spring 容器中匹配 beans 可以满足的依赖项数量最多的构造函数。如果没有一个候选者可以满足,那么将使用主/默认构造函数(如果存在)。
  同样,如果一个类声明了多个构造函数,但没有一个被注释为 @Autowired,然后将使用主/默认构造函数(如果存在)。如果一个类一开始只声明了一个构造函数,那么它将始终被使用,即使没有注释。带注释的构造函数不必是公共的。

自动装配字段
  在构造 bean 之后,在调用任何配置方法之前,立即注入字段。这样的配置字段不必是公开的。

自动装配方法
  配置方法可以有任意名称和任意数量的参数;这些参数中的每一个都将与 Spring 容器中的匹配 bean 自动装配。
  Bean 属性设置方法实际上只是这种通用配置方法的特例。这样的配置方法不必是公开的。

自动装配数组、集合和映射
  在数组、Collection或Map 依赖类型的情况下,容器会自动装配与声明的值类型匹配的所有 beans。为此,必须将映射键声明为String 将解析为相应 bean 名称的类型。
  这样一个容器提供的集合将被排序,考虑到 目标组件的值,否则遵循它们在容器中的注册顺序Ordered。@Order或者,单个匹配的目标 bean 也可以是一般类型的 Collection或Map本身,这样被注入。

不支持BeanPostProcessor或BeanFactoryPostProcessor
  请注意,实际注入是通过 一个 BeanPostProcessor执行的 ,这反过来意味着您不能 将@Autowired用于引用注入 BeanPostProcessor或 BeanFactoryPostProcessor 类型。

可选元素:

修饰符和类型可选元素说明
booleanrequired声明是否需要带注释的依赖项。

2.2 @Resource

  @Resource 注解:与 @Autowired 类似,@Resource 也是用于依赖注入的注解。但是,@Resource 只能用于非静态字段和方法的注入,而不能用于静态字段和方法的注入。

示例:


@Service

public class UserServiceImpl implements UserService {

    @Resource

    private UserRepository userRepository;



    // ...其他代码

}

Resource
在这里插入图片描述

  @Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。
  @Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。
  所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。
  如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

2.3 @Inject

  @Inject 注解:这是 JavaEE 标准的依赖注入注解,也可以在 Spring Boot 中使用。与 @Autowired 和 @Resource 不同,@Inject 可以用于所有类型的字段和方法的注入。

示例:


@Service

public class UserServiceImpl implements UserService {

    @Inject

    private UserRepository userRepository;



    // ...其他代码

}


Inject
在这里插入图片描述
  标识可注入的构造函数、方法和字段。可以应用于静态成员和实例成员。可注入成员可以具有任何访问修饰符(private、package-private、protected、public)。首先注入构造函数,然后是字段,最后是方法。超类中的字段和方法在子类中的字段和方法之前注入。未指定字段之间和同一类中的方法之间的注入顺序。
  可注入的构造函数使用@Inject注释,并接受零个或多个依赖项作为参数。@Injec最多可以应用于t每个类的一个构造函数。
@Inject对于没有其他构造函数存在时的公共的无参数构造函数是可选的。这使注入器能够调用默认构造函数。

可注入字段:

  • 都是用 @Inject注释。
  • 不是最终的决定。
  • 可以有任何其他有效的名称。

注入方法:

  • 用 @Inject注释。
  • 不是抽象的。
  • 不声明自己的类型参数。
  • 可能会返回一个结果
  • 可以有任何其他有效的名称。
  • 接受零个或多个依赖项作为参数。

2.4 @ComponentScan

  @ComponentScan:是 Spring Boot 提供的一种自动扫描组件的方式。通过在启动类上添加 @ComponentScan 注解,Spring Boot 会自动扫描指定包及其子包下的所有组件,并将其注册为 bean。

示例:


@SpringBootApplication

@ComponentScan("com.example")

public class Application {

    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);

    }

}

不了解ComponentScan 的可以看【Spring Boot 初识丨四】主应用类

在这里插入图片描述

  如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏  🙌一起讨论
  你的评价就是我✍️创作的动力!					  💞💞💞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/646995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

攻防世界-Crypto-easychallenge

题目描述:将文件下载下来,只有一个pyc文件 1. 思路分析 先向chatgpt问下什么是pyc文件: OK,这里简单总结下: 1. pyc文件是python源码编译后的生成的二进制文件 2. 通过一些库可以逆向出pyc的源代码 那么我们需要做…

数组题目总结 -- 单调栈问题

目录 零. 单调栈一. Next Greater Element(单调栈问题模板)题目简述:思路和代码:I. 思路II. 代码 二. Next Warmer Weather题目简述:思路和代码:I. 思路II. 代码 三. Next Greater Elements(循环数组)题目简…

UG\NX二次开发 装配下的点坐标

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: UF_CURVE_create_point 创建一个点 UF_CSYS_create_temp_csys 创建临时坐标系 以上两个函数都有一个点坐标输入,而且都是输入的绝对坐标系下的点坐标值。下面验证在装配下两个绝对坐标值具体指 “当…

【三维视觉】空间点集的最小包围盒计算

0 问题描述 假设有一个空间点集,不重合的点数有N个。 N1时,最小包围盒是一个点:中心为其本身,半径无穷小 N2时,最小包围盒是一个圆:中心为连线中点,半径为边长一半 N3时,不共线的三…

【C#】并行编程实战:任务并行性(上)

在 .NET 的初始版本中,我们只能依赖线程(线程可以直接创建或者使用 ThreadPool 类创建)。ThreadPool 类提供了一个托管抽象层,但是开发人员仍然需要依靠 Thread 类来进行更好的控制。而 Thread 类维护困难,且不可托管&…

优惠券超发问题该怎么测试?

在拼夕夕面试中,面试官问了一连串经典的问题:“优惠券库存是怎么扣减的?开发为了解决超发优惠券问题而设计的方案,你了解过吗?你又是如何测试的呢?” 当时听到这些问题还挺懵的,没遇到过超发问…

MidJourney教程02

1.主体内容:高数AI你需要画什么?比如说,一个男生在电脑前画画? 2.环境北京:例如给某些地点或者物件,比如桌子上,足球场,水面有倒影等? 3.构图镜头:比如说强…

springboot项目外卖管理 day07-功能补充

文章目录 前端补充功能1、历史订单功能1.1、梳理过程1.2历史订单展示1.3、效果展示 2、修改/删除地址2.1、回显数据梳理过程 代码展示 2.2、修改地址梳理过程代码 2.3、删除地址梳理过程代码展示 3、再来一单功能3.1、梳理过程3.2、具体实现思路(参考一下当初我们怎…

Linux操作系统——第四章 进程间通信

目录 进程间通信介绍 进程间通信目的 进程间通信发展 进程间通信分类 管道 System V IPC POSIX IPC 管道 什么是管道 匿名管道 管道读写规则 管道特点 命名管道 创建一个命名管道 匿名管道与命名管道的区别 命名管道的打开规则 system V共享内存 共享内存示意…

【SpringBoot】解决依赖版本不一致报错问题

哈喽大家好,我是阿Q。今天在开发代码的过程中,由于手抖,不知道引入了什么包依赖,导致项目启动一直报错,特写本文来记录下解决问题的经过。 文章目录 问题描述报错信息如下报错描述 解决方法总结 问题描述 报错信息如下…

vite中使用 vite- aliases 插件报错

vite 中使用 vite-aliases 插件报错 vite-aliases 介绍报错内容解决方法 vite-aliases 介绍 vite-aliases 可以帮助我们自动生成别名: 检测你当前目录下包括 src 在内的所有文件夹, 并帮助我们去生成别名。 下载 npm i vite-aliases -D 使用 import { defineConfig } from vi…

VALSE 2023 无锡线下参会个人总结 6月11日-2

VALSE2023无锡线下参会个人总结 6月11日-2 6月11日会议日程安排Workshop:目标检测与分割程明明:粒度自适应的图像感知技术张兆翔:基于多传感器融合的视觉物体检测与分割 Workshop:ChatGPT与计算机视觉白翔:再谈ChatGPT…

290. 单词规律

290. 单词规律 C代码:别人手搓的 bool wordPattern(char * pattern, char * s){char arr[301][3001];char *p strtok(s, " ");int pos 0;while(p ! NULL) {sprintf(arr[pos], "%s", p);p strtok(NULL, " ");}int len strlen(pat…

Linux环境安装Jdk图文步骤

准备工作: a、jdk安装包:百度网盘 请输入提取码,提取码:jdk8 b、远程工具,xshell,,electerm,,MobaXterm,,fxp,docker,宝…

软件测试V、W和H模型的优缺点汇总,零基础必看哦

目录 V模型 W模型 H模型 总结: 软件测试有三种模型,分别是V模型,W模型和H模型。每种模型都有自己的优点和缺点。 V模型 V模型如下图所示: V模型的优点 V模型明确地标识出了在开发过程中一般应完成的测试级别,以及…

STM32-HAL库串口DMA空闲中断的正确使用方式+解析SBUS信号

STM32-HAL库串口DMA空闲中断的正确使用方式解析SBUS信号 一. 问题描述二. 方法一——使用HAL_UART_Receive_DMA三. 方法二——使用HAL_UARTEx_ReceiveToIdle_DMA四. 方法三——使用HAL_UARTEx_ReceiveToIdle_IT(不使用DMA)五. 总结 一. 问题描述 能够点…

java springboot整合MyBatis-Plus 多用点Plus支持一下国人开发的东西吧

文章java springboot整合MyBatis做数据库查询操作讲述了boot项目整合MyBatis的操作方法 但现在就还有一个 MyBatis-Plus Plus是国内整合的一个技术 国内的很多人会喜欢用 特别是一些中小型公司 他们用着会比较舒服 好 然后我们打开idea 创建一个项目 选择 Spring Initializr…

(九)CSharp-数组

一、矩形数组 1、访问数组元素 class Program{static void Main(string[] args){int[] intArr1 new int[15];intArr1[2] 10;int var1 intArr1[2];int[,] intArr2 new int[5, 10];intArr2[2, 3] 7;int var2 intArr2[2, 3];int[] myIntArray new int[4];for (int i 0; i…

Git 报错 Updates were rejected because the remote contains work that you do

目录 Git 报错 Updates were rejected because the remote contains work that you do 1、命令行出现这种情况 2、idea出现同样的报错,解决方式同上 Git 报错 Updates were rejected because the remote contains work that you do 这个报错实在是让我受不了了&…

Kendo UI for jQuery---03.组件___网格---05.编辑---01.概述

编辑概述 编辑是剑道 UI 网格的一项基本功能,它允许您操作其数据的呈现方式。 网格提供以下编辑模式: 批量编辑 内联编辑 弹出窗口编辑 自定义编辑开始 要启用编辑: 熟悉剑道UI中的常见编辑概念 配置网格的数据源 通过配置定义字段schem…