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

文章目录

  • 🌴什么是依赖注入
  • 🎄依赖注入的三种方法
    • 🚩属性注⼊(Field Injection)
    • 🚩构造⽅法注⼊
    • 🚩Setter注⼊
    • 🚩三种注⼊的优缺点
  • 🌳@Autowired存在的问题
  • 🌲解决@Autowired存在的问题
  • 🍃@Autowird与@Resource的区别
  • ⭕总结

🌴什么是依赖注入

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

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

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

🎄依赖注入的三种方法

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

  1. 属性注⼊(Field Injection)

  2. 构造⽅法注⼊(Constructor Injection)

  3. Setter注⼊(Setter Injection)

🚩属性注⼊(Field Injection)

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

比如我们将StudentService类注⼊到StudentController类中.

StudentService.java代码如下:

@Service
public class StudentService {public void run() {System.out.println("StudentService启动");}
}

StudentController.java代码如下:

@RestController
public class StudentController {@Autowiredprivate StudentService studentService;public void run() {System.out.println("StudentController启动");studentService.run();}
}

获取StudentController中的run方法

@SpringBootApplication
public class SpringMvcApplication {public static void main(String[] args) {//获取spring上下文ApplicationContext context = SpringApplication.run(SpringMvcApplication.class, args);//从spring中获取对象StudentController studentController = context.getBean("studentController",StudentController.class);//使用spring对象studentController.run();}}

启动项目,结果如下:

在这里插入图片描述

🚩构造⽅法注⼊

构造⽅法注⼊是在类的构造⽅法中实现注⼊,如下代码所⽰:

@RestController
public class StudentController {private StudentService studentService;public StudentController() {}@Autowiredpublic StudentController(StudentService studentService) {this.studentService = studentService;}public void run() {System.out.println("StudentController启动");studentService.run();}}

结果展示:

在这里插入图片描述
注意事项:

  • 如果类只有⼀个构造⽅法,那么@Autowired注解可以省略;如果类中有多个构造⽅法,那么需要添加上@Autowired来明确指定到底使⽤哪个构造⽅法
  • 如果存在多个构造方法,还没有写注解的话,就会出现以下问题
    在这里插入图片描述

🚩Setter注⼊

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

@RestController
public class StudentController {private StudentService studentService;@Autowiredpublic void setStudentService(StudentService studentService) {this.studentService = studentService;}public void run() {System.out.println("StudentController启动");studentService.run();}}

在这里插入图片描述

🚩三种注⼊的优缺点

属性注⼊:

  • 优点:

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

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

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

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

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

    • 注⼊的对象不会被修改

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

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

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

Setter注⼊(Spring3.X推荐):

  • 优点:

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

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

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

🌳@Autowired存在的问题

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

比如我们有以下bean。

BeanFiguation.java代码如下:

@Configuration
public class BeanFiguation {@Beanpublic Student student1() {Student student = new Student();student.setId(11);student.setName("遇事");student.setAge(11);return student;}@Beanpublic Student student2() {Student student = new Student();student.setId(22);student.setName("问春风乄");student.setAge(22);return student;}
}

StudentController.java代码如下:

@RestController
public class StudentController {@Autowiredprivate Student student;public void run() {System.out.println(student);}
}

当我们进行启动时:
在这里插入图片描述
报错的原因是,⾮唯⼀的 Bean 对象

在这里插入图片描述

🌲解决@Autowired存在的问题

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

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

第一种:bean对象名称与属性名相匹配

在这里插入图片描述

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

在这里插入图片描述

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

  • @Qualifier注解不能单独使⽤,必须配合@Autowired使⽤

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

第四种:使⽤@Resource注解:是按照bean的名称进⾏注⼊。通过name属性指定要注⼊的bean的名称。

在这里插入图片描述

在这里插入图片描述

🍃@Autowird与@Resource的区别

  • @Autowired是spring框架提供的注解,⽽@Resource是JDK提供的注解

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

⭕总结

关于《【JavaEE进阶】 依赖注⼊DI详解》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

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

相关文章

【算法练习】leetcode算法题合集之栈和队列篇

普通栈 LeetCode20 有效的括号 LeetCode20 有效的括号 定义一个辅助map&#xff0c;判断字符串的字符是否在]})中。一旦是右括号就要弹出元素&#xff0c;判断匹配。 class Solution {public boolean isValid(String s) {if (s.length() % 2 1) {return false;}Map<Chara…

[labelme]labelme如何将标注的json格式转成png的mask文件掩码文件

labelme工具不仅仅具有标注功能&#xff0c;而且可以将json文件转化为png的分割训练文件&#xff0c;如果您是一个类别则可以直接用labelme_json_to_dataset进行转换最后提取对应的掩码文件即可进行语义分割训练。如果您是>2个类别则不推荐使用labelme工具进行转换&#xff…

开发实践5_project

要求&#xff1a; &#xff08;对作业要求的"Student"稍作了变换&#xff0c;表单名称为“Index”。&#xff09;获得后台 Index 数据&#xff0c;作展示&#xff0c;要求使用分页器&#xff0c;包含上一页、下一页、当前页/总页。 结果&#xff1a; ① preparatio…

CSS 实现卡片以及鼠标移入特效

CSS 实现卡片以及鼠标移入特效 文章目录 CSS 实现卡片以及鼠标移入特效0、效果预览默认鼠标移入后 1、创建卡片组件2、添加样式3、完整代码 0、效果预览 默认 鼠标移入后 在本篇博客中&#xff0c;我们将探讨如何使用 CSS 来实现卡片组件&#xff0c;并添加鼠标移入特效&#…

基于嵌入式的智能智能通风系统

基于嵌入式的智能智能通风系统 功能说明 通过微信小程序控制窗户的开关状体以及倒计时开关和定时开关&#xff0c;小程序上实时显示当前温度湿度和光照强度。 功能展示 02智能通风系统 Mqtt服务器 http://www.yoyolife.fun/iot&#xff1a;Mqtt服务器&#xff0c;我是在这里注…

Web自动化测试中的接口测试

1、背景 1.1 Web程序中的接口 1.1.1 典型的Web设计架构 web是实现了基于网络通信的浏览器客户端与远程服务器进行交互的应用&#xff0c;通常包括两部分&#xff1a;web服务器和web客户端。web客户端的应用有html&#xff0c;JavaScript&#xff0c;ajax&#xff0c;flash等&am…

Linux下进程子进程的退出情况

进程的退出分为了两大类&#xff0c;一类是正常的退出&#xff0c;另一类是非正常的退出。 正常退出时有五种情况&#xff0c;分别是 ①main函数调用return ②进程调用exit(),标准c库 ③进程调用_exit()或者_Exit()&#xff0c;属于系统调用 ④进程最后一个线程返回 ⑤最…

linux单机部署mysql(离线环境解压即可)

一、下载官网压缩包&#xff08;tar.gz&#xff09; MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/根据自己的操作系统发行版本、位数、gclib版本、mysql版本来选择对应的压缩包 比如我是 linux系统debian10&#xff08;官网只有linux ge…

vue:菜单栏联动内容页面tab

一、需求 需要实现效果&#xff1a;左侧菜单栏与右侧内容部分联动&#xff0c;当点击左侧的菜单&#xff0c;右侧会展示对应的tab&#xff0c;没有点击时&#xff0c;不展示&#xff08;如刚进入页面没有点击菜单&#xff0c;则没有tab&#xff09;&#xff1b;点击后没有关闭…

玖章算术NineData通过阿里云PolarDB产品生态集成认证

近日&#xff0c;玖章算术旗下NineData 云原生智能数据管理平台 (V1.0&#xff09;正式通过了阿里云PolarDB PostgreSQL版 (V11)产品集成认证测试&#xff0c;并获得阿里云颁发的产品生态集成认证。 测试结果表明&#xff0c;玖章算术旗下NineData数据管理平台 (V1.0&#xff…

Maxwell介绍

一、介绍 介绍&#xff1a;它读取MySQL binlog并将数据更改作为JSON写入Kafka、Kinesis和其他流媒体平台&#xff08;目前支持&#xff1a;kafka、RabbitMQ、Redis、file、Kinesis、Nats、Google Cloud Pub/Sub、Google Cloud Bigquery、SNS&#xff09; 版本&#xff1a;从v1.…

【车载开发系列】Autosar DCM诊断管理模块

【车载开发系列】Autosar DCM诊断管理模块 【车载开发系列】Autosar DCM诊断管理模块 【车载开发系列】Autosar DCM诊断管理模块一. DCM模块概念二. DCM模块与Autosar其他模块关系1&#xff09;Dcm和PduR的交互2&#xff09;Dcm和ComM模块的交互3&#xff09;Dcm和Dem的交互4&a…

RocketMQ常见面试题及答案梳理

1、RocketMQ有什么作用&#xff1f; 异步:数据的产生方不需要关心谁来使用数据&#xff0c;只需要将数据发送到broker,后续需要管消费流程&#xff0c;Rocket也有保证消息可靠性的方案消峰&#xff1a;正常业务系统当流量激增时&#xff0c;有可能会将系统压垮&#xff0c;有了…

ChatGPT正确打开方式与GPT-4.5的key最新获取方式

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

【2015~2024】大牛直播SDK演化史

大牛直播SDK的由来 大牛直播SDK始于2015年&#xff0c;最初我们只是想做个低延迟的RTMP推拉流解决方案&#xff0c;用于移动单兵等毫秒级延迟的场景下&#xff0c;我们先是实现了Android平台RTMP直播推送模块&#xff0c;当我们用市面上可以找到的RTMP播放器测试时延的时候&am…

网络设备的分类和功能、机柜布局、网络设备安装

网络互连设备根据不同层实现的机理不一样&#xff0c;又具体分为五类&#xff1a; 1、网络传输介质互联设备 2、网络物理层互联设备 3、数据链路层互联设备 4、网络层互联设备 5、应用层互联设备 常用设备 网络互联设备--互联设备 1、中继器 中继器是局域网互连的最简单…

恒创科技:云存储和网盘怎么区分出来?

随着互联网的发展&#xff0c;数据存储已成为人们日常生活中不可或缺的一部分。云存储和网盘是经常被人们提及的两种存储方式&#xff0c;均通过网络进行数据存储和访问的服务。但&#xff0c;它们在技术实现、数据安全性、访问方式和数据容量等方面存在一定的差异。要区分&…

三甲医院预约挂号系统源码,具备后台管理端和用户使用端,用户使用端包括:微信公众号、支付宝小程序

随着医疗行业的不断发展&#xff0c;预约挂号管理系统已成为医院管理中不可或缺的一部分。 预约挂号管理系统是一款综合性的预约挂号管理系统&#xff0c;帮助医院实现全方位的信息化管理&#xff0c;提高医疗服务质量和效率。支撑公众号、小程序、手机网上预约。 一款服务适用…

企业用户注册阿里云账号:为何选择企业实名认证及其五大优势

在数字化时代&#xff0c;云计算已成为企业运营不可或缺的一部分。阿里云&#xff0c;作为领先的云服务提供商&#xff0c;为企业用户提供了丰富的云产品和解决方案。但在享受这些服务之前&#xff0c;企业用户需要完成阿里云账号的注册和实名认证。本文将深入探讨为何企业用户…

小程序打包发行流程

工具 HBuilder X 、微信开发者工具、微信公众平台地址&#xff08;微信公众平台&#xff09; 配置 一、manifest.json 配置 通过 HBuilder X 打开 manifest.json 文件&#xff0c;找到 微信小程序配置&#xff0c;填写 微信小程序AppID&#xff0c;此 AppID 必须是本人有权…