【Spring】DI依赖注入,Lombok以及SpEL

news2024/11/17 17:28:14

文章目录

  • 1.什么是DI依赖注入
  • 2. set方法注入
  • 3. ref属性
  • 4. 有参构造方法注入
  • 5. Lombok
  • 6. SpEL

1.什么是DI依赖注入

依赖注入(Dependency Injection,简称DI)是一种设计模式,也是Spring框架的核心概念之一。其基本思想是将程序中的各个组件之间的依赖关系从程序内部转移到外部容器中,从而实现松耦合,以便于开发测试。

具体来说,依赖注入是指在程序运行期间,由外部容器动态地将依赖对象注入到组件中。例如,可以通过构造函数注入、Setter注入、注解注入等方式来实现依赖注入。

⭐ 简单来说DI依赖注入就是要让Spring来给Bean对象的属性进行赋值

2. set方法注入

在Java中,set方法注入是一种依赖注入的方式。它通过调用对象的setter方法来注入依赖关系。这种方式通常用于将一个对象的属性设置为另一个对象。

例如,假设我们有一个名为Student的类,它有一个属性为name的String类型变量和一个属性为age的int类型变量。我们可以使用set方法注入来将这些属性设置为其他对象。

可以在Spring的配置文件配置Bean对象时进行设置,使用<property>标签

示例: 比如这里有一个Student类,有age和name两个属性
在这里插入图片描述
接下来通过bean标签将bean对象注入Spring容器中,同时通过<property>这个标签对Student类的这两个属性进行注入
在这里插入图片描述
接下来获取Bean对象,并进行打印
在这里插入图片描述
可以看到配置的值已经注入进去了

🔺注意: 虽然上面是在配置文件中进行的属性注入,但是本质上还是set方法注入.很好验证, 如果把set方法注释掉,那么配置文件中配置的相应属性就会报错

在这里插入图片描述

3. ref属性

除此之外,如果成员变量中有引用数据类型,类如:一个类中有另外一个类的实例,会需要使用bean标签中的ref属性
还是Student类,除此之外还有School这个类的实例,

public class Student {
    private int age;
    private String name;
    private School school;
}

age和name因为是Student类的属性,很好进行注入. 那如何注入School这个属性呢?
这时候就需要使用ref这个属性了
看下图:
在这里插入图片描述
对于School这个类实例成员变量,不能直接注入,我们要先把School注入到Spring容器中,然后在Student的bean标签中使用ref属性将School进行注入,同时别忘了前提条件是有对应的setter方法.

如果要注入School类中的成员变量,就需要在school这个bean标签中使用<property>这个标签进行注入

4. 有参构造方法注入

有参构造注入是一种依赖注入的方式,它通过在类的构造函数中传入依赖对象来实现依赖注入。这种方式通常用于将一个对象的属性设置为另一个对象。

还是刚才的Student类,同样是在配置文件中进行注入,使用的标签:<constructor-arg>. 与set方法注入类似,只是换了一个方法和标签而已
示例:

public class Student {
    private int age;
    private String name;

    public Student(int age, String name) {
        this.age = age;
        this.name = name;
    }
}

在这里插入图片描述
在这里插入图片描述

在Java中除了基本数据类型,还有一些其它的数据类型.例如:List,Set和Map等. 这种类型的数据要如何注入呢?其实也是类似的,复杂类型可以差分成简单的类型进行注入.

5. Lombok

在前面的示例中以及在平时的开发中,我们可以看到一些类的setter和getter方法以及构造方法都需要使用到,虽然IDEA可以帮我们生成,但是如果类中的成员变量很多,就会不可避免的会觉得代码比较臃肿.
接下来来学一个小工具Lombok

Lombok是一个Java库,它能够自动插入编辑器并构建工具,从而简化Java开发。这个库的主要功能是通过注解的方式,让开发人员不需要手动编写例如getter或setter等样板式代码。此外,Lombok还提供了自动化日志变量,通过简单的注解,可以让类拥有完全功能的构建器。

先来体验一下Lombok

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private int age;
    private String name;

    public static void main(String[] args) {
        User user1 = new User();
        user1.setAge(16);
        user1.setName("zhangsan");
        User user2 = new User(18,"lisi");
        System.out.println(user1.toString());
        System.out.println(user2.toString());
    }
}
  • @Data: 此注解可以帮助我们生成一些setter,getter,toString等方法
  • @NoArgsConstructor: 空参的构造方法
  • @AllArgsConstructor: 全参的构造方法
    如图所示:
    在这里插入图片描述
    ⭐需要注意的是,Lombok并非一个标准的Java库,在使用时,还需要在项目的构建文件中添加对应的maven依赖以及安装Lombok 对应的插件。
    Lombok所需要的依赖:
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.28</version>
</dependency>

Lombok插件
在这里插入图片描述

6. SpEL

Spring表达式语言,全称“Spring Expression Language”,简称为“SpEL”,是一种功能强大的Spring表达式语言,全称“Spring Expression Language”,简称为“SpEL”,是一种功能强大的表达式语言。它类似于Struts2x中使用的OGNL表达式语言,能在运行时构建复杂表达式、存取对象图属性、对象方法调用等等,并且能与Spring功能完美整合,如能用来配置Bean定义。

示例:

@Data
public class Student {
    private int age;
    private String name;
}

之前在注入Student类的成员变量是,都是直接写的具体数字.
在这里插入图片描述
上面这种的话数据是写死的,不够灵活,如果想要动态变化,就可以使用SPEL表达式,是需要使用#{表达式}这种形式来实现.

例如:
在这里插入图片描述
在这里插入图片描述
上述只是一个简单的示例.
SpEL具有丰富的表达式类型,例如字面表达式、布尔和关系运算符、正则表达式、类表达式、访问属性、数组、列表和映射、方法调用等。表达式语言一般是用最简单的形式完成最主要的工作,以此减少工作量。例如,我们可以使用# {expression}作为SpEL表达式的默认格式,表达式主体包围在花括号中。

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

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

相关文章

基于和声算法的无人机航迹规划-附代码

基于和声算法的无人机航迹规划 文章目录 基于和声算法的无人机航迹规划1.和声搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用和声算法来优化无人机航迹规划。 1.和声搜索算法 …

openGauss学习笔记-111 openGauss 数据库管理-管理用户及权限-用户权限设置

文章目录 openGauss学习笔记-111 openGauss 数据库管理-管理用户及权限-用户权限设置111.1 给用户直接授予某对象的权限111.2 给用户指定角色111.3 回收用户权限 openGauss学习笔记-111 openGauss 数据库管理-管理用户及权限-用户权限设置 111.1 给用户直接授予某对象的权限 …

git更改鼠标颜色

git bash命令行&#xff0c;默认黑底白字、鼠标移近无法看清鼠标移动范围。 1、控制面板-打开鼠标属性-指针。 选择 windows 黑色&#xff08;系统方案) 保存

C++ 对象数组(整理)

C对象数组 一、对象数组的定义二、对象数组的特性三、对象数组的使用3.1 构造函数没有参数3.2 构造函数有一个参数3.3 构造函数有多个参数 四、为什么要使用对象数组&#xff1f; 一、对象数组的定义 所谓对象数组&#xff0c;指每一个数组元素都是对象的数组&#xff0c;即若…

原来服务器这么有用-创建一个自己的云存储:FileBrowser

原来服务器这么有用-创建一个自己的云存储&#xff1a;FileBrowser 1、介绍 filebrowser 是一个使用go语言编写的软件&#xff0c;功能是可以通过浏览器对服务器上的文件进行管理。 Filebrowser提供了一个在指定目录内进行文件管理的界面&#xff0c;可以用于上传、删除、预览…

CSS与基本选择器

<div class"c1" id"d1"></div> CSS基本知识 什么是css&#xff1a;CSS&#xff08;Cascading Style Sheet&#xff0c;层叠样式表)定义如何显示HTML元素。 当浏览器读到一个样式表&#xff0c;他就会按照这个样式l来进行渲染。其实就是让HT…

LDAP服务搭建,phpLDAPadmin+python管理服务

LDAP 是什么&#xff1f; LDAP&#xff08;Lightweight Directory Access Protocol&#xff09;是一种轻量级的目录访问协议。它最初是用于在 TCP/IP 网络上访问 X.500 目录服务&#xff0c;但由于其简单和高效的特点&#xff0c;现在广泛应用于企业、组织等系统中的身份验证、…

yolov5的ptq量化流程

本次试验是基于yolov5n的模型进行ptq、qat的量化以及敏感层分析的试验。 Post-Training-Quantization(PTQ)是目前常用的模型量化方法之一。以INT8量化为例,PTQ处理流程如下: 首先在数据集上以FP32精度进行模型训练,得到训练好的baseline模型; 使用小部分数据对FP32 basel…

第2篇 机器学习基础 —(3)机器学习库之Scikit-Learn

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。Scikit-Learn&#xff08;简称Sklearn&#xff09;是Python 的第三方模块&#xff0c;它是机器学习领域当中知名的Python 模块之一&#xff0c;它对常用的机器学习算法进行了封装&#xff0c;包括回归&#xff08;Regressi…

这个学习方式,用的太及时了!

学校思政学习是培养未来社会精英、提升学生政治觉悟的重要环节。在学生的成长过程中&#xff0c;思政学习扮演着至关重要的角色&#xff0c;不仅有助于提高学生的政治素质&#xff0c;还能够培养他们的思维能力、价值观念&#xff0c;使他们更好地为社会和国家的发展贡献力量。…

c语言练习(9周)

输入样例11输出样例7.0980 #include<stdio.h> int main() {int n, i;double s 1,a1;scanf("%d", &n);for (i 2; i < n; i) {a 1 / (1a);s a;}printf("%.4lf", s);return 0; } 题干输入10个整数&#xff0c;分别按输入正序、逆序显示。输…

input 调起键盘 ,键盘距离输入框底部太近

input 调起键盘 &#xff0c;键盘距离输入框底部太近 解决方法 cursorSpacing‘20’ 单位是 ‘px’ <input cursorSpacing20 type"text" v-model"replyMain" />距离底部距离 20px &#xff0c;输入框距离键盘距离是20px

第五章 I/O管理 八、缓冲区管理

目录 一、定义 二、缓冲区的作用 三、单缓冲 1、定义&#xff1a; 2、例子1 3、例子2 四、双缓冲 1、定义&#xff1a; 2、例子1&#xff1a; 3、例子2&#xff1a; 五、单缓冲和双缓冲的区别 六、循环缓冲区 1、定义&#xff1a; 七、缓冲池 1、定义&#xff1a;…

岩土工程监测利器:多通道振弦数据记录仪应用铁路隧道监测

岩土工程监测利器&#xff1a;多通道振弦数据记录仪应用铁路隧道监测 岩土工程监测是工程建设中十分重要的一环&#xff0c;特别是在铁路隧道工程中&#xff0c;岩土工程监测更是不可或缺的一项。其中&#xff0c;振弦数据记录仪是一种非常重要的仪器&#xff0c;可以帮助监测…

思维训练第三课 反意疑问句

系列文章目录 文章目录 系列文章目录前言一、什么是反意疑问句二、反意疑问句的回答&#x1f49a;主系表/主谓宾&#xff08;肯定&#xff09;&#xff0c;否定提问1、一般现在时2、一般过去时3、一般将来时4、现在完成时 &#x1f49b; 主谓宾1、一般现在2、一般过去3、一般将…

2023最新版本 FreeRTOS教程 -2-任务创建-验证(动态创建)

API函数 BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,const configSTACK_DEPTH_TYPE usStackDepth,void * const pvParameters,UBaseType_t uxPriority,TaskHandle_t * const pxCreatedTask )API函数参数理解 -1-任务函数就是和函数指针 -2-名称自定义 -3-堆栈大小自…

041-第三代软件开发-QCustcomPlot波形标注

第三代软件开发-QCustcomPlot波形标注 文章目录 第三代软件开发-QCustcomPlot波形标注项目介绍QCustcomPlot波形标注效果初始化绘制 关键字&#xff1a; Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML…

C++11线程

C11线程 创建线程 创建线程需要包含头文件<thread>&#xff0c;使用线程类std::thread 构造函数 默认构造函数 thread() noexcept; 默认构造函数&#xff0c;构造一个线程对象&#xff0c;但它不会启动任何实际的线程执行。 任务函数构造函数 template< class Fun…

计算机毕业设计选题推荐-短文写作竞赛微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

物联网的音视频基础设施,谁在提供最优解?

声网在作为RTC服务商的同时&#xff0c;也更在成为赛道的核心布道者和推动者&#xff0c;通过一个个场景的逐步落地&#xff0c;进而推动RTC行业产生更大的想象力。 作者|斗斗 出品|产业家 某海外物流企业的控制室内&#xff0c;工作人员正聚精会神地注视着高清视频画面&a…