【Java】DI依赖注入详解

DI注入时有以下几种方式 

1、属性注入:@Autowired注解

通过@Autowired直接进行属性注入

@Service
public class UserService {public void sayHi(){System.out.println("Hi,service");}
}
@Controller
public class UserController {@Autowiredprivate UserService userService;public void sayHi(){System.out.println("Hi,controller");userService.sayHi();}
}
@SpringBootApplication
public class IocSpringApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(IocSpringApplication.class, args);UserController controller = context.getBean(UserController.class);controller.sayHi();}}

结果显示如下

注意📢

⭐@Autowired会先根据名称来获取,如果获取到了,正确响应

⭐如果没有获取到,就根据类型匹配,此时,如果匹配到多个,报错 

2、构造方法注入

@Controller
public class UserController {private UserService userService;private UserComponent userComponent;public UserController(){}public UserController(UserService userService){this.userService = userService;}@Autowiredpublic UserController(UserService userService, UserComponent userComponent){this.userService = userService;this.userComponent = userComponent;}public void sayHi(){System.out.println("Hi,controller");userService.sayHi();userComponent.sayHi();}
}

构造方法注入时要注意📢

✅(1)一定要写无参构造方法,否则会报错

✅(2)如果不使用@Autowired注解,那么几个构造方法中默认使用无参构造方法

✅(3)所以在要使用的构造方法上要叫上@Autowired,属性才被注入 

3、Setter方法注入

@Controller
public class UserController {private UserService userService;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}public void sayHi(){System.out.println("Hi,controller");userService.sayHi();}
}

Setter方法上也要使用@Autowired注解

4、三种方法的对比

@Autowired属性注入构造方法注入Setter方法注入
适用范围只能用于 IoC 容器,如果是非 IoC 容器不可用,并且只有在使用的时候才会出现 NPE(空指针异常)通用性好,构造方法是JDK支持的,所以更换任何框架都是适用的--
能否注入被被final修饰的变量不能不能
注入对象会不会被修改--不会会。注入对象可能会被改变,因为setter方法可能会被多次调用,就有被修改的风险

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

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

相关文章

docker核心技术

一. 从系统架构谈起 传统分层架构 vs 微服务 微服务改造 分离微服务的方法建议: 审视并发现可以分离的业务逻辑业务逻辑,在对业务领域不是特别熟悉的时候,按照部门职能进行划分,例如账号、财务等寻找天生隔离的代码模块,可以借助于静态代码分析工具如果可以闭环的解决一…

蓝桥杯Web应用开发-display属性

display 属性 专栏持续更新中 display 属性可以用来设置元素在页面上的排列方式,也可用来隐藏元素。 display 属性值的说明如下表所示。 属性值说明block元素以块级方式展示。inline元素以内联方式展示。inline-block元素以内联块的方式展示。none隐藏元素。 b…

ubuntu换源

参考链接 首先去清华源官方sudo vim /etc/apt/sources.list 最好备份一下sudo apt-get update && sudo apt-get upgrade 可能会遇到的问题 cd /tmp wget http://archive.ubuntu.com/ubuntu/pool/main/c/ca-certificates/ca-certificates_20210119~20.04.2_all.deb …

基于ESP8266 开发板(MCU)遥控小车

遥控小车 ​ 遥控界面 ​ 【项目源码】 第一版ESP8266 https://github.com/liyinchigithub/esp8266_car_webServerhttps://github.com/liyinchigithub/esp8266_car_webServer 第二版ESP32 GitHub - liyinchigithub/esp32-wroom-car: 嵌入式单片机 ESP32 Arduino 遥控小车&a…

Kong 负载均衡

负载均衡是一种将API请求流量分发到多个上游服务的方法。负载均衡可以提高整个系统的响应速度,通过防止单个资源过载而减少故障。 在以下示例中,您将使用部署在两台不同服务器或上游目标上的应用程序。Kong网关需要在这两台服务器之间进行负载均衡&…

Hudi学习 6:Hudi使用

准备工作: 1.安装hdfs https://mp.csdn.net/mp_blog/creation/editor/109689143 2.安装spark spark学习4:spark安装_hzp666的博客-CSDN博客 3.安装Scala Hudi学习6:安装和基本操作_hzp666的博客-CSDN博客 spark-shell 写入和读取hudi 2.…

docker proxy 【docker 代理】

第一种 创建代理配置文件 mkdir -p /etc/systemd/system/docker.service.d/ cat <<EOF > /etc/systemd/system/docker.service.d/http-proxy.conf Environment"HTTP_PROXYhttp://192.168.21.101:7890" Environment"HTTPS_PROXYhttp://192.168.21.1…

Transformer实战-系列教程6:Vision Transformer 源码解读4

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 Vision Transformer 源码解读1 Vision Transformer 源码解读2 Vision Transformer 源码解读3 Vis…

华为交换机配置Qos

QoS在企业网中的应用 在企业网络中&#xff0c;QoS的一系列技术不要求在同一台设备上应用&#xff0c;而应根据业务需要在不同位置应用。 图5 QoS技术在企业网络中的应用 理论上来说&#xff0c;各层次设备的功能如下&#xff1a; l 接入层业务识别 接入交换机LSW1作为边界…

Flume多进程传输

1.Flume介绍 Flume 是一种分布式、可靠且可用的服务&#xff0c;用于高效收集、聚合和移动大量日志数据。它具有基于流数据流的简单而灵活的架构。它具有鲁棒性和容错性&#xff0c;具有可调的可靠性机制和许多故障转移和恢复机制。它使用简单的可扩展数据模型&#xff0c;允许…

[鹤城杯 2021]easy_crypto

下载一看发现是核心价值观编码 核心价值观编码

安卓平台valgrind交叉编译

背景 通过上次的文章valgrind跨平台调试及其问题分析,为同事们在大部分平台下进行内存问题分析提供了帮助。但是也遇到了阻塞情况&#xff1a;android 平台&#xff0c;无法交叉编译通过。大家对于编译这件事&#xff0c;似乎天然有一种排斥&#xff0c;本能的拒绝&#xff0c…