当前位置: 首页 > article >正文

【JavaEE进阶】依赖注入 DI详解

目录

🌴什么是依赖注入

🎄依赖注入的三种方法

🚩属性注⼊(Field Injection)

🚩Setter注入

🚩构造方法注入

🚩三种注⼊的优缺点

🌳@Autowired存在的问题

🌲解决@Autowired存在的问题

🚩@Primary注解

🚩@Qualifier注解

🚩bean对象名称与属性名相匹配

🚩@Resource注解

🍃@Autowired注入过程

🍀@Autowird与@Resource的区别

🎋图书管理系统代码改动

🎍Spring, Spring Boot和SpringMVC的关系以及区别


🌴什么是依赖注入

依赖注⼊是⼀个过程,是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源,⽽资源指的就是对象.

在上⾯程序案例中,我们使⽤了 @Autowired 这个注解,完成了依赖注⼊的操作

简单来说,就是把对象取出来放到某个类的属性中.

在 ⼀些⽂章中,依赖注⼊也被称之为"对象注⼊","属性装配",具体含义需要结合⽂章的上下⽂来理解

🎄依赖注入的三种方法

关于依赖注⼊,Spring也给我们提供了三种⽅式:

  1. 属性注入(Field Injection)
  2. 构造方法注入(Constructor Injection)
  3. Setter注入(Setter Injection)

接下来,我们分别来看。 下⾯我们按照实际开发中的模式

🚩属性注⼊(Field Injection)

属性注⼊是使⽤ @Autowired 实现的。

比如将UserService类注⼊到UserController类中。

UserService代码:

UserController代码:

获取对象:

运行结果:

若将@Tutowired注释掉,运行时就会报空指针异常,也就是说userService是空的,并没有注入

🚩Setter注入

Setter注⼊和属性的Setter⽅法实现类似,只不过在设置set⽅法的时候需要加上@Autowired注解

运行结果:

🚩构造方法注入

代码:

运行结果:发现没有加@Autowired注解,却注入成功了。

我们说,加了有参的构造函数之后,也需要把无参的构造函数加上,那再加上试试

运行结果:此时就异常了;我们在创建对象时,要么去new,或者通过反射的方式创建对象,这里我们也没有看到spring去new对象,所以这里spring是通过反射的方式去创建对象的,不管是new还是反射创建,都需要去调用构造函数,那么只有一个构造函数,spring就不得不用这个,那么使用了这个有参的构造函数,发现需要一个UserService,它就去容器里面查找有没有UserService这个对象,发现有就把它放进来了,完成了UserService的创建。当我们加上无参的构造函数时,它就使用了无参的构造函数,但是无参的构造函数没有给userService赋值,所以就报了空指针;即有多个构造函数时,就需要告诉spring使用哪个来创建对象,加上@Autowired注解即可。

代码:

运行结果:

🚩三种注⼊的优缺点

属性注⼊:

  • 优点:

    • 简洁,使⽤⽅便;
  • 缺点:

    • 只能⽤于IoC容器,如果是⾮IoC容器不可⽤,并且只有在使⽤的时候才会出现NPE(空指针异常)

    • 不能注⼊⼀个Final修饰的属性

构造函数注⼊(Spring 4.X推荐):

  • 优点:
    • 可以注⼊final修饰的属性

    • 注⼊的对象不会被修改

    • 依赖对象在使⽤前⼀定会被完全初始化,因为依赖是在类的构造⽅法中执⾏的,⽽构造⽅法是在类加载阶段就会执⾏的⽅法.

    • 通⽤性好,构造⽅法是JDK⽀持的,所以更换任何框架,他都是适⽤的

  • 缺点:
    • 注⼊多个对象时,代码会⽐较繁琐

Setter注⼊(Spring3.X推荐):

  • 优点:

    • ⽅便在类实例之后,重新对该对象进⾏配置或者注⼊
  • 缺点:

    • 不能注⼊⼀个Final修饰的属性

    • 注⼊对象可能会被改变,因为setter⽅法可能会被多次调⽤,就有被修改的⻛险.

🌳@Autowired存在的问题

当同⼀类型存在多个bean时,在使⽤@Autowired就会存在问题

例如有以下代码:

在UserController中注入对象:

运行结果:

报错的原因是,⾮唯⼀的 Bean 对象,也就是说它不知道注入哪个对象了

🌲解决@Autowired存在的问题

为了解决上述问题,Spring提供了以下4种解决⽅案:

  • @Primary
  • @Qualifierbean
  • 对象名称与属性名相匹配
  • @Resource

🚩@Primary注解

使⽤@Primary注解:当存在多个相同类型的Bean注⼊时,加上@Primary注解,来确定默认的实现.

运行结果:

🚩@Qualifier注解

使⽤@Qualifier注解:指定当前要注⼊的bean对象。在@Qualifier的value属性中,指定注⼊的bean的名称。

代码:

运行结果:

🚩bean对象名称与属性名相匹配

代码:

运行结果:

🚩@Resource注解

这个注解也是指定对象的名称

代码:

运行结果:

注意:

  • 前面三种方式都是spring提供的,@Resource现在是jakarat这个包里面,在JDK8的时候是在JDK里面,@Qualifier注解不能单独使⽤,必须配合@Autowired使⽤

🍃@Autowired注入过程

🍀@Autowird与@Resource的区别

  • @Autowired是spring框架提供的注解,⽽@Resource是jakarta提供的注解
  • @Autowired默认是按照类型注⼊,⽽@Resource是按照名称注⼊.相⽐于@Autowired来说,@Resource⽀持更多的参数设置,例如:name设置,根据名称获取Bean。

🎋图书管理系统代码改动

通过上⾯的学习,我们把前⾯的图书管理系统代码进⾏调整

Service层的注解,改成@Service

Dao层的注解,改成@Repository

重新运⾏代码,验证程序访问正常

代码:

项目启动,访问页面:可以正常访问

🎍Spring, Spring Boot和SpringMVC的关系以及区别

Spring: 简单来说,Spring是⼀个开发应⽤框架,什么样的框架呢,有这么⼏个标签:轻量级、⼀ 站式、模块化,其⽬的是⽤于简化企业级应⽤程序开发

Spring的主要功能:管理对象,以及对象之间的依赖关系,⾯向切⾯编程,数据库事务管理,数据访 问,web框架⽀持等.

但是Spring具备⾼度可开放性,并不强制依赖Spring,开发者可以⾃由选择Spring的部分或者全 部,Spring可以⽆缝继承第三⽅框架,⽐如数据访问框架(Hibernate、JPA),web框架(如Struts、 JSF)

Spring MVC:SpringMVC是Spring的⼀个⼦框架,Spring诞⽣之后,⼤家觉得很好⽤,于是按照MVC 模式设计了⼀个MVC框架(⼀些⽤Spring解耦的组件),主要⽤于开发WEB应⽤和⽹络接⼝,所以, Spring MVC是⼀个Web框架

Spring MVC基于Spring进⾏开发的,天⽣的与Spring框架集成.可以让我们更简洁的进⾏Web层 开发,⽀持灵活的URL到⻚⾯控制器的映射,提供了强⼤的约定⼤于配置的契约式编程⽀持,⾮常 容易与其他视图框架集成,如Velocity、FreeMarker等

Spring Boot: Spring Boot是对Spring的⼀个封装,为了简化Spring应⽤的开发⽽出现的,中⼩型 企业,没有成本研究⾃⼰的框架,使⽤SpringBoot可以更加快速的搭建框架,降级开发成本,让开发 ⼈员更加专注于Spring应⽤的开发,⽽⽆需过多关注XML的配置和⼀些底层的实现.

Spring Boot 是个脚⼿架,插拔式搭建项⽬,可以快速的集成其他框架进来

⽐如想使⽤SpringBoot开发Web项⽬,只需要引⼊SpringMVC框架即可,Web开发的⼯作是 SpringMVC完成的,⽽不是SpringBoot,想完成数据访问,只需要引⼊Mybatis框架即可

Spring Boot只是辅助简化项⽬开发的,让开发变得更加简单,甚⾄不需要额外的web服务器,直接 ⽣成jar包执⾏即可.

总结:

SpringMVC和SpringBoot都属于Spring,SpringMVC是基于Spring的⼀个 MVC框架,⽽SpringBoot是基于Spring的⼀套快速开发整合包.

⽐如我们的图书系统代码中

整体框架是通过SpringBoot搭建的

IoC, DI功能是Spring的提供的, web相关功能是SpringMVC提供的

这三者专注的领域不同,解决的问题也不⼀样,总的来说,Spring就像⼀个⼤家族,有众多衍⽣产 品,但他们的基础都是Spring,⽤⼀张图来表⽰他们三个的关系:

相关文章:

【JavaEE进阶】依赖注入 DI详解

目录 🌴什么是依赖注入 🎄依赖注入的三种方法 🚩属性注⼊(Field Injection) 🚩Setter注入 🚩构造方法注入 🚩三种注⼊的优缺点 🌳Autowired存在的问题 🌲解决Autowired存在的…...

Avnet RFSoC基于maltab得5G 毫米波 开发工具箱

使用 MATLAB 连接到 AMD Zynq™ RFSoC 评估板。使用 RF 附加卡执行 OTA 测试。使用 HDL Coder 部署算法 版本要求: 大于 2023b 需要以下支持包之一: 适用于 Xilinx 基于 Zynq 的无线电(R2023b 及更早版本)的通信工具箱支持包适…...

掌握 PHP 单例模式:构建更高效的应用

在 PHP 应用开发中,资源的高效管理至关重要。单例模式是一种能够帮助我们实现这一目标的设计模式。本文将深入探讨单例模式的概念、工作原理以及在 PHP 项目中何时应该(或不应该)使用它。 什么是单例模式? 单例模式是一种设计模…...

neo4j-解决导入数据后出现:Database ‘xxxx‘ is unavailable. Run :sysinfo for more info.

目录 问题描述 解决方法 重新导入 问题描述 最近在linux上部署了neo4j,参照之前写的博客:neo4j-数据的导出和导入_neo4j数据导入导出-CSDN博客 进行了数据导出、导入操作。但是在进行导入后,重新登录网页版neo4j,发现对应的数据库状态变…...

卷积神经网络(CNN)池化层的最大池化(Max Pooling)和 平均池化(Average Pooling)

在 卷积神经网络(CNN) 中,池化层(Pooling Layer) 是用来 减少特征图的空间尺寸、减少计算量、控制过拟合 的关键层。池化层通过 窗口操作 将输入特征图中一定区域的信息压缩成一个单一的值,常见的池化方式有 最大池化(Max Pooling) 和 平均池化(Average Pooling)。这…...

Mac(m1)本地部署deepseek-R1模型

1. 下载安装ollama 直接下载软件,下载完成之后,安装即可,安装完成之后,命令行中可出现ollama命令 2. 在ollama官网查看需要下载的模型下载命令 1. 在官网查看deepseek对应的模型 2. 选择使用电脑配置的模型 3. copy 对应模型的安…...

第六届MathorCup高校数学建模挑战赛-A题:淡水养殖池塘水华发生及池水自净化研究

目录 摘要 1 问题的重述 2 问题的分析 2.1 问题一的分析 2.2 问题二的分析 2.3 问题三的分析 2.4 问题四的分析 2.5 问题五的分析 3. 问题的假设 4. 符号说明 5. 模型的建立与求解 5.1 问题一的建模与求解 5.1.1 分析对象与指标的选取 5.1.2 折线图分析 5.1.3 相关性分析 5.1.4…...

【分布式理论9】分布式协同:分布式系统进程互斥与互斥算法

文章目录 一、互斥问题及分布式系统的特性二、分布式互斥算法1. 集中互斥算法调用流程优缺点 2. 基于许可的互斥算法(Lamport 算法)调用流程优缺点 3. 令牌环互斥算法调用流程优缺点 三、三种算法对比 在分布式系统中,多个应用服务可能会同时…...

第一财经对话东土科技 | 探索工业科技新边界

当前以ChatGPT、Sora等为代表的生成式人工智能快速发展,越来越多面向垂直场景的行业大模型涌现出来,并成为推动制造业智能化改造与数字化转型、加快推进新型工业化,进而培育发展新质生产力的新引擎。 在垂类场景的应用落地,是AI发…...

深入理解Java对接DeepSeek

其实,整个对接过程很简单,就四步,获取key,找到接口文档,接口测试,代码对接。 1.获取 KEY https://platform.deepseek.com/transactions 直接付款就是了(现在官网暂停充值2025年2月7日&#xf…...

如何设置爬虫的延时避免频繁请求?

在Python爬虫开发中,合理设置延时是避免频繁请求、降低被封禁风险的关键策略之一。以下是一些常见的延时设置方法和建议: 1. 使用 time.sleep() 设置固定延时 time.sleep() 是最简单直接的延时方法,通过暂停程序的执行来控制请求频率。例如…...

线段平移 实战笔记

目录 pingyi2.py pingyi2.py import numpy as np import cv2# 画线段的函数 def draw_line(img, p1, p2, color, thickness=2):cv2.line(img, tuple(p1), tuple(p2), color, thickness)# 创建图像并初始化 def create_image():# 创建一个黑色背景图像img = np.zeros((500, 50…...

【计算机毕业设计】Spring Boot教师人事档案管理系统功能说明

🎉**欢迎来到琛哥的技术世界!**🎉 📘 博主小档案: 琛哥,一名来自世界500强的资深程序猿,毕业于国内知名985高校。 🔧 技术专长: 琛哥在深度学习任务中展现出卓越的能力&a…...

WinForm 防破解、反编译设计文档

一、引言 1.1 文档目的 本设计文档旨在阐述 WinForm 应用程序防破解、反编译的设计方案,为开发团队提供详细的技术指导,确保软件的知识产权和商业利益得到有效保护。 1.2 背景 随着软件行业的发展,软件破解和反编译现象日益严重。WinForm…...

DeepSeek应用——与word的配套使用

目录 一、效果展示 二、配置方法 三、使用方法 四、注意事项 1、永久化使用 2、宏被禁用 3、office的生成失败 记录自己学习应用DeepSeek的过程...... 这个是与WPS配套使用的过程,office的与这个类似: 一、效果展示 二、配置方法 1、在最上方的…...

Android多包路由方案: ARouter 路由库

1. ARouter 简介 目标:ARouter 专门为 Android 组件化开发设计,解决跨模块路由和依赖问题。功能: 支持使用注解的方式注册路由(如 Activity、Fragment 或 Service)。提供统一的路由接口,用于跨包跳转和数据…...

利用邮件合并将Excel的信息转为Word(单个测试用例转Word)

利用邮件合并将Excel的信息转为Word 效果一览效果前效果后 场景及问题解决方案 一、准备工作准备Excel数据源准备Word模板 二、邮件合并操作步骤连接Excel数据源插入合并域预览并生成合并文档 效果一览 效果前 效果后 场景及问题 在执行项目时的验收阶段,对于测试…...

OpenCV 相机标定流程指南

OpenCV 相机标定流程指南 前置准备标定流程结果输出与验证建议源代码 OpenCV 相机标定流程指南 https://docs.opencv.org/4.x/dc/dbb/tutorial_py_calibration.html https://learnopencv.com/camera-calibration-using-opencv/ 前置准备 制作标定板:生成高精度棋…...

redis专栏解读

本篇起导读、目录的作用,介绍redis专栏涉及的内容以及目录。 redis是我们日常开发中常用的NOSQL数据库,本专栏主要讲解redis的内部实现原理,不会侧重于API的使用,遇到API的使用会简单概括。本专栏大致会分为基础部分、redis内部实…...

网络在线考试|基于vue的网络在线考试系统的设计与实现(源码+数据库+文档)

网络在线考试系统 目录 基于SSM+vue的网络在线考试系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1功能页面实现 2系统功能模块 3管理员功能模块 4学生功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八…...

Spring Boot从入门到精通:核心知识点+实战指南

目录 一、Spring Boot 是什么?为什么它如此流行? 二、快速创建你的第一个Spring Boot应用 2.1 使用Spring Initializr生成项目 2.2 核心代码示例 三、深度解析Spring Boot核心机制 3.1 自动配置原理揭秘 3.2 自定义Starter实战 四、生产环境必备…...

DEEPSEEK与GPT等AI技术在机床数据采集与数字化转型中的应用与影响

随着人工智能(AI)技术的迅猛发展,深度学习、自然语言处理等先进技术开始广泛应用于各行各业。在制造业尤其是机床行业,AI技术的融合带来了巨大的变革,尤其在机床数据采集与机床数字化方面的应用。本文将探讨DEEPSEEK、…...

【文本处理】如何在批量WORD和txt文本提取手机号码,固话号码,提取邮箱,删除中文,删除英文,提取车牌号等等一些文本提取固定格式的操作,基于WPF的解决方案

企业的应用场景 数据清洗:在进行数据导入或分析之前,往往需要对大量文本数据进行预处理,比如去除文本中的无关字符(中文、英文),只保留需要的联系信息(手机号码、固话号码、邮箱)。…...

Docker从入门到精通- 容器化技术全解析

第一章:Docker 入门 一、什么是 Docker? Docker 就像一个超级厉害的 “打包神器”。它能帮咱们把应用程序和它运行所需要的东东都整整齐齐地打包到一起,形成一个独立的小盒子,这个小盒子在 Docker 里叫容器。以前呢,…...

17vue3实战-----使用配置文件生成简易页面

17vue3实战-----使用配置文件生成简易页面 1.写在前面2.背景3.实现3.1界面效果3.2新建config配置文件3.3封装组件3.4使用组件 1.写在前面 后台管理系统的开发很简单。无论是用户模块、部门模块、角色模块还是其它模块,界面和业务逻辑都相对比较简单,我会省略这些模…...

计算机视觉的研究方向、发展历程、发展前景介绍

以下将分别从图像分类、目标检测、语义分割、图像分割(此处应主要指实例分割)四个方面,为你介绍研究生人工智能计算机视觉领域的应用方向、发展历程以及发展前景。 文章目录 1.图像分类应用方向发展历程发展前景 2.目标检测应用方向发展历程…...

“mysqld --initialize --console ”执行不成功情况总结和解决措施

我的MYSQL版本是9.0.1出现类似下列的报错: 2024-10-29T01:09:55.942951Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start. 2024-10-29T01:09:55.950379Z 0 [Warning] [MY-010915] [Server] NO_ZERO_DATE, NO_ZERO_IN_DATE and ERROR_FOR_DIV…...

深入探索现代CSS:从基础到未来趋势

引言:CSS的进化之路 CSS(层叠样式表)自1996年诞生以来,已从简单的样式描述语言发展为构建现代Web体验的核心技术。截至2023年,超过98%的网站使用CSS3技术,其发展历程见证了Web从静态文档到富交互应用的蜕变…...

STM32 Unix时间戳

Unix时间戳 Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒 时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量 世界上所有时区的秒计数器相同,不同时区通过…...

SpringSecurity高级用法

SpringSecurity的高级用法,包括自定义loginUrl携带参数,自定义认证校验逻辑,自定义权限校验逻辑。 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-advanced-security 一、概述 在项目实际开发过程中,Spr…...