【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,⽤⼀张图来表⽰他们三个的关系:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Mac arm架构终端中运行 corepack enable yarn 命令,安装yarn

文章目录 1. 什么是 Corepack?2. 运行 corepack enable yarn 的作用3. 如何运行 corepack enable yarn4. 可能遇到的问题及解决方法问题 1:corepack 命令未找到问题 2:Yarn 未正确安装问题 3:权限问题 5. 验证 Yarn 是否启用成功6…

16.React学习笔记.React更新机制

一. 发生更新的时机以及顺序## image.png props/state改变render函数重新执行产生新的VDOM树新旧DOM树进行diff计算出差异进行更新更新到真实的DOM 二. React更新流程## React将最好的O(n^3)的tree比较算法优化为O(n)。 同层节点之间相互比较,不跨节点。不同类型的节…

SQL数据清理:去除字段值中的多余符号(Demo例子)

目录 前言1. 基础2. 进阶 前言 Excel中有大量不合法的符号,导入到系统之后,数据库有很多脏数据,对此下述展开sql的清洗教程 在数据库的文本字段中,可能会存在多余的逗号或符号,如,销售,, 或 二手车,销售,,这种情况 希…

计算机组成原理

观看地址如下【2019版】1.3.2 性能指标2——速度_哔哩哔哩_bilibili 第一章 计算机系统概述 了解 #低电平高电平 #计算机的发展 主要是因为逻辑元件的限制 选择题 微处理器的发展 这里的机器字长为 软硬件的发展 几种指令和数据流 计算机的系统结构 需求产生变化 电信号…

基于MATLAB的沥青试样孔隙率自动分析——原理详解与代码实现

摘要 在材料科学与土木工程领域,沥青孔隙率是评价其耐久性和稳定性的重要指标。本文提出一种基于图像处理的孔隙率自动计算方法,通过MATLAB实现灰度化、对比度增强、形态学处理等关键步骤,最终输出试样孔隙率。代码注释清晰,可直…

【嵌入式Linux应用开发基础】open函数与close函数

目录 一、open函数 1.1. 函数原型 1.2 参数说明 1.3 返回值 1.4. 示例代码 二、close函数 2.1. 函数原型 2.2. 示例代码 三、关键注意事项 3.1. 资源管理与泄漏防范 3.2. 错误处理的严谨性 3.3. 标志(flags)与权限(mode&#xff…

【通俗易懂说模型】一篇弄懂几个经典CNN图像模型(AlexNet、VGGNet、ResNet)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …

Android 14.0 Launcher3单层模式workspace中app列表页排序功能实现

1.概述 在14.0的定制化开发中,对于Launcher3的功能定制也是好多的,而对于单层app列表页来说排序功能的开发,也是常有的功能这就需要了解加载app数据的流程,然后根据需要进行排序就可以了,接下来就来实现这个功能 如图: 2. Launcher3单层模式workspace中app列表页排序功能…

8K样本在DeepSeek-R1-7B模型上的复现效果

7B Model and 8K Examples: Emerging Reasoning with Reinforcement Learning is Both Effective and Effic (notion.site) 港科大助理教授何俊贤的团队以Qwen2.5-Math-7B(基础模型)为起点,直接对其进行强化学习。整个过程中,没有…

四、自然语言处理_08Transformer翻译任务案例

0、前言 在Seq2Seq模型的学习过程中,做过一个文本翻译任务案例,多轮训练后,效果还算能看 Transformer作为NLP领域的扛把子,对于此类任务的处理会更为强大,下面将以基于Transformer模型来重新处理此任务,看…

MATLAB 生成脉冲序列 pulstran函数使用详解

MATLAB 生成脉冲序列 pulstran函数使用详解 目录 前言 一、参数说明 二、示例一 三、示例二 总结 前言 MATLAB中的pulstran函数用于生成脉冲序列,支持连续或离散脉冲。该函数通过将原型脉冲延迟并相加,生成脉冲序列,适用于信号处理和系统…

算法练习——滑动窗口

前言:滑动窗口的难点不在于怎么编写代码,而在于如何想到这题是用滑动窗口的算法去解决。其次滑动窗口的左端和右端在滑动时窗口内数据存在单调性。 一:长度最小的子数组 题目要求: 解题思路: 对于第一道滑动窗口算法…

Zabbix-监控SSL证书有效期

背景 项目需要,需要监控所有的SSL证书的有效期,因此需要自定义一个监控项 实现 创建自定义脚本 在Zabbix的scripts目录(/etc/zabbix/scripts/)下创建一个新的shell脚本check_ssl.sh,内容如下 #!/bin/bash time$(echo | openssl s_client…

VSCode中出现“#include错误,请更新includePath“问题,解决方法

1、出现的问题 在编写C程序时,想引用头文件但是出现如下提示: (1)首先检查要引用的头文件是否存在,位于哪里。 (2)如果头文件存在,在编译时提醒VSCode终端中"#include错误&am…

讯方·智汇云校华为授权培训机构的介绍

官方授权 华为授权培训服务伙伴(Huawei Authorized Learning Partner,简称HALP)是获得华为授权,面向公众(主要为华为企业业务的伙伴/客户)提供与华为产品和技术相关的培训服务,培养华为产业链所…

LabVIEW商业软件开发

在商业软件开发和仪器自动测试领域,LabVIEW以其图形化编程方式、高效的数据采集能力和强大的硬件集成优势,成为众多工程项目的核心开发工具。然而,商业软件的开发远不止编写代码和实现功能那么简单,尤其是在仪器自动测试领域&…

优化关键词还有哪些软件可用?

随着2025年互联网的发展,越来越多的企业认识到关键词优化的重要性。SEO(搜索引擎优化)作为提升网站流量和排名的重要手段,已经成为每个企业营销战略中的核心组成部分。而在SEO优化过程中,关键词的选择和优化无疑是至关…

程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<9>

大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 这一节是对之前内容的修整 目录 一、传值调用和传址调用二、数组名的理解三、指针访问数组四、结尾 一…

新一代SCADA: 宏集Panorama Suite 2025 正式发布,提供更灵活、符合人体工学且安全的应用体验

宏集科技宣布正式推出全新Panorama Suite 2025 SCADA软件!全新版本标志着 Panorama Suite的一个重要里程碑,代表了从 Panorama Suite 2022 开始并跨越三个版本(2022、2023、2025)的开发过程的顶峰。 此次重大发布集中在六个核心主…

多机器人系统的大语言模型:综述

25年2月来自 Drexel 大学的论文“Large Language Models for Multi-Robot Systems: A Survey”。 大语言模型 (LLM) 的快速发展为多机器人系统 (MRS) 开辟新的可能性,从而增强通信、任务规划和人机交互。与传统的单机器人和多智体系统不同,MRS 带来独特…