Spring 常用的注入方式有什么?

Spring 是一个非常流行的 Java 开发框架,它提供了多种依赖注入(Dependency Injection)的方式,使得开发者可以轻松地管理应用程序中的组件依赖关系。在 Spring 中,常用的注入方式主要包括构造器注入、Setter 方法注入、字段注入和注解驱动注入。让我们一一来详细讲解这些注入方式。

1. 构造器注入(Constructor Injection)

构造器注入是通过构造函数来注入依赖项的一种方式。在 Spring 中,通过在类的构造函数上使用 @Autowired 注解来实现构造器注入。例如:

public class ExampleService {
    private ExampleDependency dependency;

    @Autowired
    public ExampleService(ExampleDependency dependency) {
        this.dependency = dependency;
    }
}

在上面的示例中,ExampleService 类通过构造函数接收 ExampleDependency 类的实例。Spring 在初始化 ExampleService 实例时,会自动将 ExampleDependency 实例注入到构造函数中。

2. Setter 方法注入(Setter Method Injection)

Setter 方法注入是通过类的 setter 方法来注入依赖项的一种方式。在 Spring 中,通过在 setter 方法上使用 @Autowired 注解来实现 Setter 方法注入。例如:

public class ExampleService {
    private ExampleDependency dependency;

    @Autowired
    public void setDependency(ExampleDependency dependency) {
        this.dependency = dependency;
    }
}

在这个例子中,setDependency 方法用于设置 ExampleDependency 实例。Spring 在初始化 ExampleService 实例时,会调用该方法并将 ExampleDependency 实例注入其中。

3. 字段注入(Field Injection)

字段注入是通过直接注入类的字段来实现依赖注入的一种方式。在 Spring 中,通过在字段上使用 @Autowired 注解来实现字段注入。例如:

public class ExampleService {
    @Autowired
    private ExampleDependency dependency;
}

在这个例子中,ExampleDependency 实例直接被注入到 ExampleService 类的 dependency 字段中。

4. 注解驱动注入(Annotation-driven Injection)

注解驱动注入是利用 Spring 提供的各种注解来自动完成依赖注入的一种方式。除了 @Autowired 注解外,还有一些其他的注解用于特定场景的注入,比如 @Qualifier@Value 等。

  • @Qualifier 注解用于指定具体的 bean 进行注入,当存在多个实现时可以指定具体使用哪一个。例如:

public class ExampleService {
    @Autowired
    @Qualifier("exampleDependencyImpl")
    private ExampleDependency dependency;
}
  • @Value 注解用于从属性文件、环境变量或其他 Spring 管理的 bean 中获取值并注入到类的字段中。例如:
public class ExampleService {
    @Value("${example.property}")
    private String property;
}

在 Spring 中,通过构造器注入、Setter 方法注入、字段注入和注解驱动注入等方式,可以实现依赖注入。选择合适的注入方式取决于具体的应用场景和开发者的偏好。

构造器注入适用于强制依赖项、确保对象完全初始化的情况;Setter 方法注入提供了更灵活的配置选项;字段注入则是一种简洁的方式;而注解驱动注入则可以通过注解来实现更加灵活和方便的注入方式。

综上所述,Spring 提供了丰富多样的依赖注入方式,开发者可以根据项目需求和个人喜好来选择合适的方式。

黑马程序员免费预约咨询

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

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

相关文章

全网最全:一文入门最热的LLM应用开发框架LangChain

f#### 1. LangChain 简介 1.1. LangChain 发展史 LangChain 的作者是 Harrison Chase,最初是于 2022 年 10 月开源的一个项目,在 GitHub 上获得大量关注之后迅速转变为一家初创公司。2017 年 Harrison Chase 还在哈佛上大学,如今已是硅谷的…

【Django项目】 通过AI实现视频转文字

使用Django构建一个视频—>文字 转换器: 输入视频地址,通过OpenAI的接口分析视频,返回视频内容的文字。 视频 代码 运行此程序,需要OpenAI-key和设置Postgres数据库。 (吐槽一下,作者把这些信息都直接写…

【数据结构初阶】直接插入排序

最近浅学了直接插入排序,写个博客做笔记!笔记功能除外若能对读者老爷有所帮助最好不过了! 直接插入排序是插入排序的一种,那么介绍直接插入排序之前先介绍一下常见的排序算法! 目录 1.常见的排序算法 2.直接插入排…

WPF鼠标拖拽的最佳实现

WPF鼠标拖拽的最佳实现 在很多项目中都会遇到鼠标拖拽控件移动的需求,常见的有从在列表中拖拽列表项移动,拖拽控件移动等。 本文将介绍2种拖拽的简单的实现 列表项的拖拽 本文将使用 gong-wpf-dragdrop 这个github上的库来实现列表的拖拽的效果&…

Python从0到POC编写--SQL注入

SQL注入POC编写。 环境: win10 ,phpStudy ,python3.7 ,sqli-labs 虚拟域名: www.sql.com 简单的POC: 说起来也简单, 就是请求–>响应, 然后再判断返回信息是否存在注入。 本…

【高阶数据结构(二)】初识图论

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:高阶数据结构专栏⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多Go语言知识   🔝🔝 高阶数据结构 1. 前言2. 图的基…

Spring底层入门(七)

1、异常处理 在DispatcherServlet中,doDispatch(HttpServletRequest request, HttpServletResponse response) 方法用于进行任务处理: 在捕获到异常后没有立刻进行处理,而是先用一个局部变量dispatchException进行记录,然后统一由…

[Cpp]类和对象 | 实现日期类

标题:[Cpp]类和对象 | 实现日期类 水墨不写bug 正文开始: 类和对象是Cpp面向对象编程区别于C的面向过程编程的重要的一部分,因此打好坚实的类和对象的基础对于深入学习Cpp语言是比较明智的。 本文通过实现简单的日期类来加深对类和对象的理解…

怎么用git在暂存区(stage)中移除不需要提交(commit)的文件?

2024年5月9日&#xff0c;周四上午 非常简单&#xff0c;用下面这条命令就可以了 git rm --cached <file>注&#xff1a;这条命令不会把文件从文件夹中删除&#xff0c;只会把文件从暂存区中移除出去 实战

Isaac Sim 5 Ros相关(学习笔记5.8.3)

一.RGB、Depth、bbox话题发送 1.新建一个二驱示例小车 路径为Robot-Jetbot&#xff08;如果找不到也可以直接搜索Jetbot&#xff09; 2.添加Action Graph 导航栏中&#xff1a;Window - Visual Scripting - Action Graph&#xff0c;建立一个工作区&#xff0c;这个工作区中…

【高阶数据结构】并查集

并查集 并查集1、概念2、根据人找编号 / 根据编号找人&#xff08;简单介绍一下并查集&#xff09;&#xff08;1&#xff09;代码展示&#xff08;2&#xff09;调试结果&#xff08;3&#xff09;优化1&#xff1a;小的往大的合并&#xff08;4&#xff09;优化2&#xff1a;…

docker-compose安装es+kibana 8.12.2

小伙伴们&#xff0c;你们好&#xff0c;我是老寇&#xff0c;我又回来辣&#xff0c;几个月不见甚是想念啊&#xff01;&#xff01;&#xff01; 因云平台需要改造&#xff0c;es7升级为es8&#xff0c;所以记录一下&#xff0c;es8需要开启ssl认证&#xff0c;需要配置证书…

AC/DC电源模块在通信与网络设备中的应用研究

BOSHIDA AC/DC电源模块在通信与网络设备中的应用研究 随着通信与网络技术的不断发展&#xff0c;通信与网络设备的使用不断增加。电源作为通信与网络设备的重要组成部分之一&#xff0c;在其稳定工作中起到至关重要的作用。AC/DC电源模块作为一种常用的电源转换器&#xff0c;…

探索设计模式的魅力:权力集中,效率提升,中心化模式的优势与挑战

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索中心化模式之旅✨ 大家好啊&#xff01;&#x1f44b; 这次我们要聊的是IT界一…

使用js/java合并3dtiles

目录 前言&#xff1a; 需合并的json目录 aa/tileset.json bb/tileset.json cc/tileset.json dd/tileset.json ee/tileset.json js源码&#xff1a; 运行命令&#xff1a; 生成结果&#xff1a; java源码&#xff1a; Matrix.java ThreeDTilesJoin2.java pom文件…

【中级软件设计师】上午题15-计算机网络

上午题15-计算机网络 1 网络设备2 协议簇3 TCP和UDP4 SMTP和POP35 ARP和RARP6 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;7 URL8 浏览器9 IP地址和子网划分10 IPv611 Windows命令12 路由器 1 网络设备 物理层设备&#xff1a;中继器、集线器&#xff0…

目标检测正负样本区分和平衡

1、正负样本定义 rpn和rcnn的正负样本定义都是基于MaxIoUAssigner&#xff0c;只不过定义阈值不一样而已。 MaxIoUAssigner的操作包括4个步骤&#xff1a; 首先初始化时候假设每个anchor的mask都是-1&#xff0c;表示都是忽略anchor 将每个anchor和所有gt的iou的最大Iou小于…

C# SolidWorks 二次开发 -从零开始创建一个插件(3) 发布插件

五一节过完了吧&#xff0c;该上班学习了吧&#xff1f; 如何把自己开发好的程序优雅的给别人使用。 今天我们来简单讲解一下&#xff0c;这个之前不少粉丝咨询过相关问题&#xff0c;自己开发好的东西&#xff0c;如何给同事或者其它人使用。 先列一下使用到的主要工具&am…

什么是存量与流量?

存量与流量是反映经济状况的两类指标&#xff0c;在统计和国民经济核算中得到广泛运用。存量与流量之间既有密切的联系&#xff0c;又有一定区别。 一、存量与流量的基本概念 存量是某一时点结存的量&#xff0c;体现了某一时点上持有的经济价值或物量&#xff1b;流量是一段…

基于YOLO的车牌与车型识别系统

一、项目背景与意义 随着智能交通系统的快速发展&#xff0c;车辆识别技术在交通管理、安防监控、自动收费、停车管理等领域发挥着至关重要的作用。车牌识别和车型识别作为车辆识别技术的核心组成部分&#xff0c;能够有效提升交通运营效率&#xff0c;加强公共安全监控&#…