【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.rhkb.cn/news/241264.html

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

相关文章

借势营销怎么做才能有效宣传?媒介盒子揭秘

借势营销之所以受到品牌欢迎,原因就在于通过借势营销能够达到“润物细无声和四两拨千斤的效果,用小投入获得大回报,但有许多企业稍有不慎就会翻车,今天媒介盒子就从多个角度和大家聊聊:借势营销怎么做才能有效宣传。 一…

深入详解使用 RabbitMQ 过程中涉及到的多个细节问题(面试可用)

目录 1、基础类问题 2、cluster 相关问题 3、综合性问题 4、参考资料 C软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931C/C基础与进阶&…

如何隐藏服务器真实IP地址,隐藏服务器IP有什么好处

首先我们介绍了隐藏服务器IP的概念及工作模式,接着阐述了其对于DDoS攻击的防护作用。然后介绍了如何利用隐藏服务器IP增加系统性能和稳定性。接着我们讲述了如何隐藏服务器IP防止黑客攻击,最后总结了隐藏服务器IP在保护服务器和用户数据方面发挥的作用。…

chatgpt的实用技巧四temperature 格式

四、temperature 格式 GPT3.5 temperature 的范围为:0-0.7; GPT4.0 temperature 的范围为:0-1; 当 temperature 为 0 时候,结果可稳定。 当 temperature 为 0.7/1 时候,结果发散具备创力。 数值越大&a…

线性表的案例引入 | 多项式的运算

#include <iostream> using namespace std; #define MAXSIZE 100#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2typedef int Status;typedef struct {int *elem;int length; }SqList;// 初始化 Status Init…

打造更智能的应用 - 机器学习和Andorid

打造更智能的应用 - 机器学习和Andorid 一、关于机器学习和Andorid二、使用 Gemini 让您的 Android 应用如虎添翼2.1 Gemini API2.2 Android AICore 三、现成可用的还是自定义的机器学习3.1 机器学习套件 SDK 的常见用户流3.2 高性能自定义机器学习 四、机器学习套件 SDK&#…

用sdkman在linux上管理多个java版本

概述&#xff1a; SDKMAN 是一个用于管理软件开发工具的工具&#xff0c;允许您轻松地安装、升级和切换不同版本的 JDK、Maven、Gradle 等工具。以下是在 Linux 上安装 SDKMAN! 的基本步骤&#xff1a; 安装SdkMan 使用 curl 安装 SDKMAN!: 打开终端&#xff0c;并运行以下命…

在线App封装技术:HTML5的新生命

HTML5封装的魅力所在HTML5带来了丰富的多媒体功能、地理位置服务、离线存储等特性&#xff0c;使得Web应用的体验更加接近原生App。封装HTML5到App中&#xff0c;可以大大缩短开发周期&#xff0c;降低开发成本&#xff0c;并且一次编写&#xff0c;多平台运行&#xff0c;极大…

保姆版Vps安装灯塔(ARL)

因为灯塔的默认端口为5003&#xff0c;所以我们在安装之前就在防火墙里把我们的5003端口打开 打开端口步骤如下&#xff1a; 1.我们打开控制面板&#xff0c;在控制面板里点击 系统和安全 。如下图&#xff1a; 2.接着点击 Windows Defender防火墙,如下图&#xff1a; 3.再…

为什么 macOS 比 Windows 稳定?

在计算机操作系统领域&#xff0c;macOS 和 Windows 分别是苹果公司和微软公司的主打产品。尽管两者都拥有大量的用户群体&#xff0c;但在稳定性和用户体验方面&#xff0c;macOS 常常被认为优于 Windows。那么&#xff0c;为什么 macOS 比 Windows 更稳定呢&#xff1f; 我们…

Wheeltec小车的开发实录(0)

配置静态ip&#xff08;可以联网&#xff09; 首先在你正常链接网络的时候打开“Connection Information”(我的是wifi&#xff0c;而且是手机热点&#xff0c;所以我手机就相当于一台路由器) 查看路由ip 观察到Default Route 是192.168.***.225这就是我手机的地址&#xff0…

Oracle命令大全

文章目录 1. SQL*Plus命令&#xff08;用于连接与管理Oracle数据库&#xff09;2. SQL数据定义语言&#xff08;DDL&#xff09;命令3. SQL数据操作语言&#xff08;DML&#xff09;命令4. PL/SQL程序块5. 系统用户管理6. 数据备份与恢复相关命令1. SQL*Plus命令&#xff08;用…

原型设计 Axure RP 9

Axure RP 9是一款专业的原型设计和协作工具&#xff0c;让用户快速创建高保真度的交互原型&#xff0c;模拟真实的用户界面和交互体验。该软件界面布局合理&#xff0c;易于使用&#xff0c;提供丰富的交互功能和效果&#xff0c;如动态面板、变量、条件逻辑、动画等。同时支持…

MATLAB解决考研数学一题型(上)

闲来无事&#xff0c;情感问题和考研结束后的戒断反应比较严重&#xff0c;最近没有什么写博文的动力&#xff0c;抽空来整理一下考研初试前一直想做的工作——整理一下MATLAB解决数学一各题型的命令~ 本贴的目录遵循同济版的高数目录~ 目录 一.函数与极限 1.计算双侧极限 2…

Pytest系列(2) - assert断言详细使用

前言 与unittest不同&#xff0c;pytest使用的是python自带的assert关键字来进行断言assert关键字后面可以接一个表达式&#xff0c;只要表达式的最终结果为True&#xff0c;那么断言通过&#xff0c;用例执行成功&#xff0c;否则用例执行失败 assert小栗子 想在抛出异常之…

PyTorch各种损失函数解析:深度学习模型优化的关键(1)

目录 详解pytorch中各种Loss functions binary_cross_entropy 用途 用法 参数 数学理论 示例代码 binary_cross_entropy_with_logits 用途 用法 参数 数学理论 示例代码 poisson_nll_loss 用途 用法 参数 数学理论 示例代码 cosine_embedding_loss 用途 …

Vcruntime140_1.dll丢失的错误提示怎么解决,关于Vcruntime140_1.dll文件

在使用电脑时你是否遇到过关于Vcruntime140_1.dll文件丢失的错误提示&#xff0c;出现这样的提示时是不是不知所措&#xff0c;今天就给大家讲解Vcruntime140_1.dll文件的一些相关介绍&#xff0c;希望能够帮助大家解决Vcruntime140_1.dll丢失的难题。 一.Vcruntime140_1.dll文…

CTF CRYPTO 密码学-1

题目名称&#xff1a;enc 题目描述&#xff1a; 压缩包中含两个文件&#xff1a;一个秘钥d.dec&#xff0c;一个密文flag.enc 解题过程&#xff1a; Step1&#xff1a;这题是一个解密他题目&#xff0c;尝试openssl去ras解密 工具简介 在Kali Linux系统中&#xff0c;openss…

13 STM32-随机数发生器 (RNG)

13.1 随机数发生器 (RNG)简介 RNG 处理器是一个以连续模拟噪声为基础的随机数发生器&#xff0c;在主机读数时提供一个 32 位的随机数. RNG 提供由模拟量发生器产生的 32 位随机数,两个连续随机数的间隔为 40 个 PLL48CLK 时钟信号周期 13.2 RNG框图 随机数发生器采用模拟电路…

rabbitmq-java基础详解

一、rabbitmq是什么&#xff1f; 1、MQ定义 MQ&#xff08;Message Queue&#xff09;消息队列 主要解决&#xff1a;异步处理、应用解耦、流量削峰等问题&#xff0c;是分布式系统的重要组件&#xff0c;从而实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性的架…