spring IOC DI --DI详解

news2024/9/19 20:39:06

在这里插入图片描述

T04BF

👋专栏: 算法|JAVA|MySQL|C语言

🫵 今天你敲代码了吗

文章目录

      • 4.3 DI详解
        • 4.3.1属性注入
        • 4.3.2 构造方法注入
        • 4.3.3 Setter注入
        • 4.3.4 三种注入优缺点
      • 4.4 `@Autowired` 存在问题
          • @Primary
          • @Qualifier

4.3 DI详解

依赖注入是一个过程,是指Ioc容器在创建Bean的时候,去提供运行时所依赖的资源(对象)

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

4.3.1属性注入

属性注入是通过@Autowired实现的

@Service
public class UserService {
    public void sayHello() {
        System.out.println("hello UserService");
    }
}

@Controller
public class UserController {
    @Autowired
    private UserService userService;

    public void sayHello() {
        System.out.println("hello UserController");
        userService.sayHello();
    }
}


@SpringBootApplication
public class Je20240721Application {
    public static void main(String[] args) {
        //获取Spring上下文
        ApplicationContext context = SpringApplication.run(Je20240721Application.class, args);
        //从Spring上下文中获取对象
        UserController userController = context.getBean(UserController.class);
        userController.sayHello();
    }
}

运行结果:

4.3.2 构造方法注入

构造方法注入是在类的构造方法中实现注入

@Controller
public class UserController {
    private UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
    public void sayHello() {
        System.out.println("hello UserController");
        userService.sayHello();
    }
}

此时,如果类中只有一个构造方法,那么@Autowired可以省略

4.3.3 Setter注入
@Controller
public class UserController {
    private UserService userService;
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    public void sayHello() {
        System.out.println("hello UserController");
        userService.sayHello();
    }
}

4.3.4 三种注入优缺点
  1. 属性注入:
  • 优点:简洁,使用方便
  • 缺点:只能用于Ioc容器;不能注入一个final修饰的属性
  1. 构造方法注入
  • 优点:可以注入一个final修饰的属性;注入的对象不会被修改;依赖对象在使用前一定会被初始化;通用性好,构造方法是JDK支持的,所以换任何框架都是适用的
  • 缺点:注入多个对象时,代码比较繁琐;
  1. Setter注入
  • 优点:方便在类实例之后,重新对该类进行配置或注入
  • 缺点:不能注入一个final修饰的属性;对象有被修改的风险

4.4 @Autowired 存在问题

当同一个对象存在多个bean的时候,使用@Autowired会存在问题

@Component
public class BeanConfig {
    @Bean("u1")
    public UserInfo userInfo1() {
        UserInfo u = new UserInfo();
        u.setUserName("zhangsan");
        u.setPassword("123456");
        return u;
    }

    @Bean
    public UserInfo userInfo2() {
        UserInfo u = new UserInfo();
        u.setUserName("lisi");
        u.setPassword("123456");
        return u;
    }
}


@Controller
public class UserController {
    @Autowired
    private UserInfo userInfo;
}


有以下几种解决方案:

@Primary

当存在多个相同类型的bean注入的时候,加上@Primary注解,来确定默认的实现

@Qualifier

指定要注入的bean对象,在@Qualifier的value属性中注入,指定注入的bean的名称
@Qualifier不能单独使用,必须搭配@Autowired使用

(3)@Resource
按照bean的名称进行注入,通过name属性指定要注入的bean的名称


@Autowired@Resource的区别:

@Autowired是spring框架提供的注解,而@Resource是JDK提供的注解;

@Autowired默认通过类型注入,而@Resource默认按照名称注入

@Autowired装配顺序

感谢您的访问!!期待您的关注!!!

在这里插入图片描述

T04BF

🫵 今天记得敲代码

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

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

相关文章

在 Android 上实现语音命令识别:详细指南

在 Android 上实现语音命令识别:详细指南 语音命令识别在现代 Android 应用中变得越来越普遍。它允许用户通过自然语言与设备进行交互,从而提升用户体验。本文将详细介绍如何在 Android 上实现语音命令识别,包括基本实现、带有占位槽位的命令处理,以及相关的配置和调试步骤…

C++:模板(函数模板,类模板)

目录 泛型编程 函数模板 函数模板格式 函数模板的原理 函数模板的实例化 类模板 类模板格式 类模板实例化 模板分为函数模板和类模板 在C中使用模板可以让我们实现泛型编程 泛型编程 如果我们需要实现一个加法add函数,那么会怎么实现呢? int…

AI学习记录 - 规范化输出对接现有系统的实例

假设我们有一个学生管理系统,通过prompt提示,格式化输出然后对接现有系统,也是通过react实现,因为这只是一个知识分享,没弄太复杂(使用react实现)。 学生管理系统 1、设计好prompt getMemory()…

大屏数据看板一般是用什么技术实现的?

我们看到过很多企业都会使用数据看板,那么大屏看板的真正意义是什么呢?难道只是为了好看?答案当然不仅仅是。 大屏看板不仅可以提升公司形象,还可以提升企业的管理层次。对于客户,体现公司实力和品牌形象,…

Linux shell编程学习笔记66:ping命令 超详细的选项说明

0 前言 网络信息是电脑网络信息安全检查中的一块重要内容,Linux和基于Linux的操作系统,提供了很多的网络命令,今天我们研究最常用的ping命令。 1 ping命令 的功能、格式和选项说明 1.1 ping命令 的功能 简单来说, ping 命令 会…

编写SpringBoot的自定义starter包

starter项目 先来看一下Starter的官方解释: Spring Boot Starter 是一种方便的依赖管理方式,它封装了特定功能或技术栈的所有必要依赖项和配置,使得开发者可以快速地将这些功能集成到Spring Boot项目中。Spring Boot官方提供了一系列的Star…

首次 Cloudberry Database 社区聚会 · 北京站,8月3日,诚邀

近期 Greenplum 源码归档及走向闭源在圈内讨论火热,原有开源用户面临断档风险。作为 Greenplum 衍生版和开源替代,Cloudberry Database 由原厂核心开发者打造,与其保持兼容,并且具备更新内核和更丰富功能。Cloudberry Database 逐…

代理协议解析:如何根据需求选择HTTP、HTTPS或SOCKS5?

代理IP协议是一种网络代理技术,可以实现隐藏客户端IP地址、加速网站访问、过滤网络内容、访问内网资源等功能。常用的IP代理协议主要有Socks5代理、HTTP代理、HTTPS代理这三种。代理IP协议主要用于分组交换计算机通信网络的互联系统中使用,只负责数据的路…

【MATLAB实战】基于UNet的肺结节的检测

数据: 训练过程图 算法简介: UNet网络是分割任务中的一个经典模型,因其整体形状与"U"相似而得名,"U"形结构有助于捕获多尺度信息,并促进了特征的精确重建,该网络整体由编码器,解码器以及跳跃连接三部分组成。 编码器由…

UE4/5 对话系统

参考教程:UE4甜筒教艺术生学蓝图#21.UE4对话系统(1)--唠嗑案例展示_哔哩哔哩_bilibili 说来惭愧两年前看的教程,现在才记录一下,很好的教程推荐大家观看 1.首先创建两个枚举,内容如下 2.创建三个结构体,内容如下 3.再…

SSRF:服务端请求伪造

SSRF漏洞原理 SSRF漏洞通常是因为服务端应用程序提供了从其他服务器获取数据的功能,但未对目标地址或协议进行适当的过滤和限制。攻击者可以通过这个漏洞发送构造好的恶意请求,让服务器以自己的身份去访问其他资源,与文件包含漏洞有些许相似…

遍历dom元素下面的子元素的方法,vue中原始标签的ref得到是该元素的dom及下面包含的子dom,与组件ref是引用不同

研究到这个的目的来源是 想用div 遍历方式 替代之前的table tr td 那种框选功能,觉得div灵活,可以随便在外面套层,td与tr之间就不能加div加了布局就乱,然后使用之前的原理( const cellList tableIdR.value.querySelec…

Caché 数据库摘要与手册索引

因为设置了 VIP 可见,对于无法直接阅读该篇博客的,建议直接阅读官方博客,链接如下: Cach & Ensemble 2018.1.4 – 2018.1.9 | Documentation Home Page (intersystems.com)https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls 目录 一、简介 0、…

【Socket 编程】应用层自定义协议与序列化

文章目录 再谈协议序列化和反序列化理解 read、write、recv、send 和 tcp 为什么支持全双工自定义协议网络计算器序列化和反序列化 再谈协议 协议就是约定,协议的内容就是约定好的某种结构化数据。比如,我们要实现一个网络版的计算器,客户端…

掌握互联网路由选择协议:从基础入门到实战

文章目录 路由选择协议的基本概念路由选择算法的分类分层次的路由选择协议路由信息协议(RIP)内部网关协议:OSPF外部网关协议:BGP互联网中的实际应用总结 互联网的路由选择协议是网络通信的核心,它决定了数据包如何在网…

Artix7系列FPGA实现SDI视频编解码+图像缩放+多路视频拼接,基于GTP高速接口,提供4套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的FPGA图像缩放方案本博已有的已有的FPGA视频拼接叠加融合方案本方案的无缩放应用本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用 3、详细设计方案设计原理框图S…

nodejs编译报错 集合

目录 一、使用命令编译typescript时报错,报错文件tsconfig.json 二、npm start运行后报错,could not find module 一、使用命令编译typescript时报错,报错文件tsconfig.json npx tsc 报错: Specified include paths were [&…

Layer2区块链扩容方案(1)——总述

写在前面 这篇文章作为一个简单介绍,很多技术只是大致提及或者引用,之后会在详细学习后逐项解释。 补充知识 在了解扩容方案之前,我们最好了解一些相关的知识概念 EVM “EVM” 是“Ethereum Virtual Machine”(以太坊虚拟机&…

SSRF学习笔记

1.NAT学习 Nat(Network Address Translation,网络地址转换)是 一种网络通信技术主要用于将私有网络中的内部IP地址转换成公共网络中的公共IP地址,以实现局域网内部设备访问互联网的功能。具体来说,Nat有以下几个主要…

【Emacs有什么优点,用Emacs写程序真的比IDE更方便吗?】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…