依赖注入的方式有几种,各是什么?

关于Spring依赖注入的几种方式 今天在开发的过程中,突然对Spring的依赖注入几种方式出现混交,打算做个简单的小结,如有总结不对的地方,请大家不吝指教!在Spring中依赖注入有四种方式:set注入(通常也叫属性注入),构造函数注入,接口注入(这个现在基本不用),注解注入(@Autowire),下面对set方法注入,构造函数注入,以及注解注入的用法举例说明。1、set方法注入(属性注入) UserDao.javapublic 阅读详情

构造器注入

构造器注入是通过类的构造器来传递依赖对象。当创建一个类的实例时,所有必需的依赖都通过构造器传递进来。
优点: 对象初始化完成后便可获得可使用的对象。
缺点: 当需要注入的对象很多时,构造器参数列表将会很长; 不够灵活。

@Component
public class CarService {
    private Engine engine;

    @Autowired
    public CarService(Engine engine) {
        this.engine = engine;  // 依赖通过构造器注入
    }

    public void start() {
        engine.start();
    }
}

@Component
public class Engine {
    public void start() {
        System.out.println("Engine started.");
    }
}

@Configuration
@ComponentScan(basePackages = "com.example")  // 替换为实际包名
public class AppConfig {
}

public class Main {
    public static void main(String[] args) {
        // 创建并配置Spring应用上下文
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        // 获取CarService bean
        CarService carService = context.getBean(CarService.class);

        // 使用CarService
        carService.start();

        // 关闭上下文
        context.close();
    }
}

设置器注入(setter方法注入)

设置器注入通过类的公开设置方法(setter)来注入依赖。这允许在对象创建之后的任何时候设置依赖。
优点: 灵活。可以选择性地注入需要的对象。
缺点: 依赖对象初始化完成后由于尚未注入被依赖对象,因此还不能使用。

@Component
public class CarService {
    private Engine engine;

    @Autowired
    public void setEngine(Engine engine) {
        this.engine = engine;  // 依赖通过设置器方法注入
    }

    public void start() {
        engine.start();
    }
}

@Component
public class Engine {
    public void start() {
        System.out.println("Engine started.");
    }
}

@Configuration
@ComponentScan(basePackages = "com.example")  // 替换为实际包名
public class AppConfig {
}

public class Main {
    public static void main(String[] args) {
        // 创建并配置Spring应用上下文
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        // 获取CarService bean
        CarService carService = context.getBean(CarService.class);

        // 使用CarService
        carService.start();

        // 关闭上下文
        context.close();
    }
}

在这个例子中,CarService 使用一个设置器方法 setEngine 来接收 Engine 的依赖。Spring容器负责调用这个方法,并传入一个 Engine 实例。

构造器注入: 依赖对象在Bean实例化阶段通过构造器传递。
Setter方法注入: 依赖对象在Bean实例化之后,通过调用Setter方法注入。

自动执行的过程
Spring上下文初始化:

  • 当Spring应用启动时,Spring容器会扫描配置中指定的包,寻找使用了@Component、@Service、@Repository、@Controller等注解标记的类,并将这些类实例化为Bean。

依赖注入:

  • Spring容器在实例化Bean时,会查找Bean中使用@Autowired注解的字段、构造方法或setter方法。
  • 对于使用@Autowired注解的setter方法,Spring容器会调用该方法,并自动注入需要的依赖。

执行setter方法:

  • 当Spring容器创建并初始化Bean时,如果发现setter方法上有@Autowired注解,就会自动调用这个方法并传入相应的依赖。

字段注入(Field Injection)

字段注入是通过在类的字段上直接使用注解(如@Autowired)来注入依赖。这是最简单直接的一种方式。
优点:

  • 编码简便:不需要编写构造器或设置器,只需在字段上添加注解即可完成注入,简化了代码。
  • 快速开发:特别适合快速开发和原型设计,可以快速搭建应用。

缺点:

  • 难以测试:字段注入使得在没有Spring容器的环境中进行单元测试变得更加困难,因为没有简单的方法来设置这些依赖。
  • 过度依赖框架:使得代码与Spring框架高度耦合,并且依赖关系不显式,降低了代码的可移植性和可读性。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class UserService {
    @Autowired
    private UserRepository userRepository;  // 直接在字段上注入依赖

    public void performAction() {
        userRepository.action();
    }
}

@Component
public class UserRepository {
    public void action() {
        System.out.println("Performing user repository action");
    }
}
手把手教你低成本复刻大疆C板缓启动电路(附原理图与选型清单) 本文详细介绍了如何低成本复刻大疆C板缓启动电路,包括核心器件选型、电路搭建与调试实战、参数优化方法论及进阶改进思路。通过替代型号和优化设计,实现功能相近的缓启动电路,成本不到原方案的1/3,适合电子爱好者、在校学生和预算紧张的硬件工程师。 阅读详情

相关推荐

OPA(运放)与MOS管组成的恒流源电路

电路图 这是一种由运放组成的恒流源电路。 原理分析: 1. OPA OPA (集成运算放大器)具有开源增益高,输入阻抗大,输出阻抗小的特点。 2. MOS管工作原理 我们知道三极管是利用 Ib 的电流控制 IC 的电流,属于电流控制电流器件。 而MOS则是利用Ugs的电压去控制电流 Id 的,所以说 MOS 管是电压控制电流的器件。 对于N沟道增强型的MOS管,当Ugs>Ugs(th)时,MOS就会开始导通,如果在D极和S极之间加上一定的电压,就会有电流Id产生。 在一定的Uds下,D极电流Id的

暖暖_的_纠结的博客 3万+

Spring中依赖注入的方式有几种,各是什么?

依赖注入的方式有几种,各是什么? 一、构造器注入 将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入。 优点: 对象初始化完成后便可获得可使用的对象。 缺点: 当需要注入的对象很多时,构造器参数列表将会很长; 不够灵活。若有多种注入方式,每种方式只需注入指定几个依赖,那么就需要提供多个重载的构造函 数,麻烦。 二、setter方法注入 IoC Service Provider通过调用成员变量提供的setter函数将被依赖对象注入给依赖类。 优点: 灵活。可以选择性地注入需要的对象。 缺

m0_51684972的博客 2539

计算机视觉-深度学习图像检测方法梳理

计算机视觉-深度学习图像检测方法梳理 由于之后要转方向啦,趁这段时间整理手中硕士研究方向的一些阅读笔记,这是一篇关于计算机视觉的基础知识梳理 先搞清一些小知识点 首先我们要弄清楚图像分类、目标定位、语义分割、实例分割的区别 a. 图像分类 :给定一张输入图像,图像分类任务旨在判断该图像所属类别; b. 目标定位 :在图像分类的基础上,我们还想知道图像中的目标具体在图像的什么位置,通常是以包围盒的(bounding box)形式; c. 语义分割 :语义分割是目标检测更进阶的任务,目标检测只需要框出每个目

qq_41662991的博客 9953

依赖的注入方式有几种?各是什么?如何实现?

若有多种注入方式,每种方式只需注入指定几个依赖,那么就需要提供多个重载的构造函数,(复杂)。如果类A要使用别人提供的一个功能,若为了使用这功能,需要在自己的类中增加额外的代码,这就是侵入性。依赖类必须要实现指定的接口,然后实现该接口中的一个函数,该函数就是用于依赖注入。优点 :接口注入中,接口的名字、函数的名字都不重要,只要保证函数的参数是要注入的对象类型即可。将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注。缺点: 依赖对象初始化完成后由于尚未注入被依赖对象,因此还不能使用。

ManuMAX的博客 894

复用浏览器之跳过扫码登录

复用浏览器 1、通过命令启动浏览器:chrome --remote-debugging-port=9222(前提是退出所有的chrome浏览器) 2、启动浏览器之后,在地址栏输入127.0.01:9222,成功复用如下图所示:

qq_43911915的博客 2034

Machine Unlearning: A Survey

机器学习已经引起了广泛的关注,并发展成为一种使能技术,用于广泛的高度成功的应用,如智能计算机视觉、语音识别、医疗诊断等。然而,由于隐私、可用性和/或被遗忘权,一些特定样本的信息需要从称为机器遗忘的模型中删除,这就产生了一种特殊的需求。这项新兴技术因其创新性和实用性而引起了学术界和工业界的极大兴趣。与此同时,这个雄心勃勃的问题导致了许多旨在应对其挑战的研究工作。据我们所知,没有任何研究分析过这一复杂的主题,也没有比较过现有的遗忘解决方案在不同场景下的可行性。因此,通过这项调查,我们旨在了解遗忘技术的关键概念。

c_cpp_csharp的专栏 1158

Spring系列之依赖注入的方式

一、依赖注入方式       对于spring配置一个bean时,如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象的过程,spring的依赖注入有3种方式: ·使用属性的setter方法注入 ,这是最常用的方式;·使用构造器注入;·使用Filed注入(用于注解方式)。 1.使用属性注入    ...

weixin_34319999的博客 1938

微信小程序 - 最新详细实现调起手机摄像头拍摄身份证人像面和国徽面取景框功能,在拍照相机上增加身份证证件照的轮廓或自定义文字,支持替换扫描拍摄辅助线图片及文本,小程序实现拍照身份证时带取景轮廓框拍摄!

微信小程序,身份证,证件照,人像,证件照提示框模板,vue身份证拍照框,摄像机相机里有引导内容,取景框拍摄,微信小程序实现拍照界面自定义实现,自拍人相框拍摄,取景框,户口簿取景框,画布指定区域生成图片,微信小程序身份证正反面拍照如何加入辅助图片引导照片,身份证取景框拍摄,服务器,上传,正反面,调起手机摄像头: 拍摄身份证的正反面,自定义身份证取景框,在相机上绘制 “身份证轮廓“ 与提示文字,拍摄身份证时出现人像框怎么实现,在相机上增加图片和文字,微信小程序怎么给调起的相机加入自定义图片,小程序实现给相机上面

🏆 前端领域优质创作者 3404

三种方法实现依赖注入

但是 byType 的自动装配存在一个很严重的问题,因为不是通过唯一的 id 来匹配,而是通过类型来匹配,所以容器中不能存在多个相同类型的 bean,否则会抛出NoUniqueBeanDefinitionException异常。注解,则使用反射实现注入。使用@Bean修饰的方法注册一个bean成为spring管理的bean,方法返回的对象成为Spring管理的bean。byName是按照名称自动装配,意思是要注入的属性的属性名和要注入的bean的id或name(别名)相同,即可实现按照名称自动装配。

amdkk的博客 5162

基于学术研究风云卫星数据下载教程

目录 一、相关网址 1.登录注册网址:国家卫星气象中心 2.风云数据服务客户端下载网址 3.风云卫星遥感数据服务网址 二、下载数据步骤 1.首先在注册登录网址,注册一个账户 2.待账户审核后,登录账户即可搜索并下载数据 三、相关工具下载 1.登录风云卫星遥感数据服务网址 2.NCSA HDFView软件 3.风云卫星数据(L1)处理软件包(FENGYUN Toolkit v1.1) 4.静止卫星云图分区图显示软件(SECView) 5.风云二号静止气象卫星数据及产品处理..

珞瑜的博客 1万+

EAAI title-page-template 怎么填写: 期刊投稿作者信息填写指南

本文详细介绍了期刊投稿时作者信息填写的规范要求。主要内容包括:1)核心填写原则(信息一致性、标注清晰性、通讯作者唯一性);2)具体填写方法演示(作者姓名、单位/机构、通讯作者);3)常见错误规避指南(如单位上标错误、邮箱无效等);4)提供可直接套用的规范模板。特别强调作者姓名拼写、单位标注、通讯作者指定等关键细节,并以深圳大学和同济大学研究团队为例进行说明,帮助投稿者避免因格式问题被退回修改。

ZhangJiqun&191cm&85kg 1086

依赖注入的几种方式

在Spring框架中,依赖注入(Dependency Injection,DI)是实现控制反转(IoC)的核心机制,其主要目的是将对象的创建和依赖关系管理从代码中解耦。缺点:可能存在 NPE:若未调用 setter 方法,依赖可能为 null。与框架强耦合:依赖 Spring 容器,难以脱离容器使用(如单元测试)。方式:通过任意方法完成依赖注入(不限于 setter 方法)。强制依赖:确保对象创建时所有必需依赖已被注入,避免 NPE。可选依赖:可通过setter方法选择性注入依赖。

2401_87882047的博客 553

098、C3k2_Ghost:用 GhostConv 替代 C3k2 内标准卷积的轻量化改造代码

本文介绍了用GhostConv轻量化改造YOLOv11中C3k2模块的实践。作者通过线上部署案例引出问题,详细解析了GhostConv的核心实现逻辑,指出直接替换标准卷积会导致的两个关键问题:通道数不匹配和kernel_size冲突。文章提供了完整的C3k2_Ghost实现代码,包含注意事项和调试技巧。消融实验显示,该方法在小模型上可减少27%-28%参数量、34%-35%FLOPs,仅损失0.8mAP。作者总结了适用场景:小模型效果显著,大模型需谨慎;检测小目标任务不推荐;训练时需调整学习率。最后强调sh

sundong_81的博客 62

Spring依赖注入的几种方式

控制反转(Inversion of Control, loC)也称为依赖注入 (Dependency Injection DI) 依赖注入的几种方式 1、设值注入 1、导入Spring的几个核心jar包并Build Path 2、创建实体类如下: package com.xyj.entity; import java.util.Arrays; import java.util.List; i...

qq_44066201的博客 1086

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

什么是依赖注入DI,依赖注入的方式有几种,各是什么?

依赖注入是一种设计模式,它是控制反转(Inversion of Control,IoC)的一种具体实现方式。在传统的编程中,对象通常会自己创建或管理其依赖的对象,而在依赖注入模式下,对象的依赖关系由外部容器负责创建和注入,对象本身只负责使用这些依赖,这样就将对象的创建和使用分离开来,提高了代码的可维护性、可测试性和可扩展性。举个简单的例子,假如有一个类需要使用类来进行用户数据的操作。在没有使用依赖注入时,可能会自己创建对象:而使用依赖注入后,的依赖对象。

kang2500的博客 2039

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【依赖注入的几种方式】

将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入。优点对象初始化完成后便可获得可使用的对象。缺点当需要注入的对象很多时,构造器参数列表将会很长;不够灵活。若有多种注入方式,每种方式只需注入指定几个依赖,那么就需要提供多个重载的构造函数,麻烦。...

weixin_62336297的博客 2902

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Spring依赖注入的方式有几种,各是什么?

一、构造器注入 将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入。 优点: 对象初始化完成后便可获得可使用的对象。 缺点: 当需要注入的对象很多时,构造器参数列表将会很长; 不够灵活。若有多种注入方式,每种方式只需注入指定几个依赖,那么就需要提供多个重载的构造函数,麻烦。 二、setter方法注入 IoC Service Provider通过调用成员变量提供的setter函数将被依赖对象注入给依赖类。 优点: 灵活。可以选择性地注入需要的对象。 缺点: 依赖对象初始化完成后由于尚未注

m0_51684972的博客 2880

【Spring】依赖注入的几种方式

Spring依赖注入的几种方式详细实现及其优缺点分析

qq_43418737的博客 3343

Spring中有几种依赖注入的方式

文末整理了一些我整理的从小白到架构师的学习资料,价值很高!Spring中,依赖注入的方式主要有以下三种:1、通过构造器注入,这也是Spring官方推荐的方式,如代码所示:这种方式,在注入对象很多的情况下,构造器参数列表会很长,所以,不够灵活。当然,好处就是,对象初始化完成后,就可可获得可使用的对象。另外,还可以检测循环依赖。2、通过Setter方法注入,这种方式在日常开发中不太常见,如代码所示:这种方式是利用set方法来注入,可以确保注入前不依赖Spring容器。

Tom弹架构 801

Spring中依赖注入的几种方式

一、依赖注入 1.属性注入,要求在javabean中提供setter方法,如下: 1)配置文件applicationContext.xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="h

态度决定思路,思路决定出路!!! 958

spring中依赖注入的几种方式

1、构造器注入 使用无参构造创建对象,默认! 假设要使用有参构造创建对象: 下标赋值 <!--第一种:下标赋值--> <bean id="user" class="com.hjj.pojo.User"> <constructor-arg index="0" value="小胡"/> </bean> 类型赋值 <!--第二种:类型赋值,不建议使用!--> <bean id="user" class="com.hjj.p

weixin_42735048的博客 1253
上一篇: 锁的优化机制了解吗?
下一篇: 讲一下什么是Spring
wupanP
博客等级 码龄8年 357粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值