SpringBoot中的依赖注入和自动注入

这篇具有很好参考价值的文章主要介绍了SpringBoot中的依赖注入和自动注入。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

以下内容为本人学习Spring Boot的依赖注入和自动注入与ChatGpt提问后对其回答进行部分修改(有的错误实在是离谱 = =)、格式调整等操作后的答案,可能对于其中部分细节(是错是对,能力有限有的看不出来 = =),并未做深入探究,大家感兴趣的话可以自行验证。

详细讲讲依赖注入

依赖注入Dependency Injection,简称DI)的概念最早由Martin Fowler2004年提出。依赖注入是一种软件设计模式,旨在解耦和组织对象之间的依赖关系,以提高代码的可维护性和可测试性

在传统的编程模式中,一个对象通常负责自己创建和管理所依赖的其他对象。这种紧密耦合的设计模式会导致代码的脆弱性,因为对象需要直接知道它所依赖的对象的实现细节,并且对于变化会很敏感(使用过传统编程模式的应该深有体会)。此外,这也会增加代码的复杂性,使得对象之间的关系变得难以理解和维护

依赖注入的目标是通过将依赖对象的创建和管理责任从对象本身转移到外部容器中,以实现松耦合和可维护。在依赖注入中,对象声明它所需要的依赖关系,而不需要关心如何创建或获取这些依赖对象。

依赖注入的核心思想是控制反转Inversion of Control,简称IoC)。在传统的编程模式中,对象自己控制创建和管理它所依赖的对象,而在依赖注入中,这种控制被反转了。对象不再自己创建依赖对象,而是通过外部容器(通常是一个IoC容器)来创建和注入依赖对象

依赖注入可以通过以下几种方式实现

  1. 构造函数注入(Constructor Injection):对象通过构造函数接收依赖对象作为参数。在创建对象时,依赖对象会被传递给构造函数进行注入。这种方式通常提供了更好的不变性和一致性

  2. Setter方法注入(Setter Injection):对象通过Setter方法设置依赖对象。在对象创建后,通过调用相应的Setter方法来注入依赖对象。这种方式可以提供更灵活的注入方式,允许依赖对象在对象创建后被替换

  3. 接口注入(Interface Injection):对象通过实现特定接口,从而暴露用于注入依赖对象的方法。容器在创建对象后,会调用接口方法并注入依赖对象

依赖注入的优点包括:

  1. 松耦合:依赖对象与被依赖对象之间的耦合度降低,对象的职责更加单一,易于理解和维护。

  2. 可测试性:依赖注入使得测试变得更加容易。可以通过注入模拟对象(Mock Objects)来进行单元测试和模块测试

  3. 可重用性:通过依赖注入,依赖对象可以被多个对象共享和重用,避免了重复创建和管理相同的依赖对象。

  4. 可扩展性:依赖注入使得应用程序的组件之间的关系更加灵活,可以轻松添加、替换和升级依赖对象

现代的开发框架和容器(如Spring框架、Spring BootGoogle Guice)提供了依赖注入的实现。它们通过注解、配置文件或其他方式,实现了依赖注入的自动化和便利性,使得开发者可以专注于业务逻辑的实现而不必过多关注依赖对象的创建和管理。

给出依赖的三种注入的方式的示例

当谈到依赖注入的三种主要方式时(构造函数注入、Setter方法注入和接口注入),我将为你提供每种方式的示例代码。

  1. 构造函数注入(Constructor Injection)的示例:
public class UserService {
    private UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // ...
}

在上面的示例中,UserService类通过构造函数接收一个UserRepository依赖对象,并将其赋值给成员变量userRepository。这种方式可以在创建UserService对象时,将UserRepository的实例传递给构造函数来进行注入。

  1. Setter方法注入(Setter Injection)的示例:
public class UserService {
    private UserRepository userRepository;

    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // ...
}

在上述示例中,UserService类通过Setter方法 setUserRepository() 接收一个UserRepository依赖对象,并将其赋值给成员变量userRepository。这样,在创建UserService对象后,可以调用setUserRepository()方法来注入UserRepository的实例。

  1. 接口注入(Interface Injection)的示例:
public interface DiscountService {
    void setDiscountProvider(DiscountProvider discountProvider);
}

public class DiscountServiceImpl implements DiscountService {
    private DiscountProvider discountProvider;

    @Override
    public void setDiscountProvider(DiscountProvider discountProvider) {
        this.discountProvider = discountProvider;
    }

    // ...
}

在上述示例中,DiscountService是一个接口,定义了一个setDiscountProvider()方法,用于接收DiscountProvider依赖对象。DiscountServiceImpl类实现了该接口,并通过实现方法setDiscountProvider()来注入DiscountProvider的实例。

这些示例展示了依赖注入的不同方式,通过构造函数、Setter方法或接口方法来接收依赖对象,并将其赋值给类的成员变量或属性。在实际应用中,通常会结合使用这些方式,根据具体的需求和场景选择适合的注入方式。

从概念上讲讲自动注入

自动注入(Autowired)依赖注入(Dependency Injection,DI)的一种实现方式,最早由Spring框架引入并提出。

传统的依赖注入方式中,开发人员需要显式地在代码中声明依赖关系并手动进行依赖对象的注入。这种方式需要编写大量的重复代码,并且容易出错。

为了简化依赖注入的过程,Spring框架引入了自动注入的概念。自动注入允许开发人员使用特定的注解来标记依赖对象,而无需显式地进行依赖注入的代码编写。框架会自动查找和注入匹配的依赖对象,减少了手动注入的工作量,提高了开发效率。

自动注入的概念最早在Spring框架的早期版本中被提出。通过在目标类的字段、构造函数或Setter方法上添加@Autowired注解Spring容器会在创建对象时自动查找匹配的依赖对象,并将其注入到相应的位置。自动注入是根据类型进行匹配的,如果存在多个匹配的依赖对象,可以使用@Qualifier注解或通过名称来指定具体的依赖对象。

自动注入带来了以下好处:

  1. 简化开发:自动注入减少了手动注入的代码量,使代码更简洁和易于维护。

  2. 减少配置:开发人员无需手动配置每个依赖对象的注入,框架会自动完成依赖的查找和注入。

  3. 提高可测试性:通过自动注入,可以更容易地进行单元测试,可以轻松地替换依赖对象进行测试。

Spring框架的自动注入成为了它的核心特性之一,并且受到了广泛的应用和认可。后续的框架和技术也借鉴了Spring的自动注入概念,提供了类似的功能来简化依赖注入的过程。

Spring Boot中注解@Autowired,自动注入注解默认使用哪种注入方式

@Autowired注解可以使用以下几种依赖注入的方式:

  1. 按照类型进行注入(byType):这是@Autowired注解的默认方式,它会根据属性的类型在容器中查找对应的Bean,如果找到唯一的一个Bean,则进行注入。如果没有找到或者找到多个相同类型的Bean,则会抛出异常。这种方式可以用在字段、构造方法或者setter方法上。

  2. 按照名称进行注入(byName):这种方式需要配合@Qualifier注解来指定Bean的名称,它会根据属性的名称在容器中查找对应的Bean,如果找到则进行注入。如果没有找到,则会抛出异常。这种方式可以用在字段、构造方法或者setter方法上。

  3. 按照构造方法进行注入(constructor):这种方式是通过Bean对象的构造方法参数类型和容器中的Bean类型进行匹配,如果找到唯一的一个相同类型的Bean,则通过构造方法进行注入。如果没有找到或者找到多个相同类型的Bean,则会抛出异常。这种方式只能用在构造方法上

一般来说,按照类型进行注入最常用和方便的方式,但是如果你需要更精确地指定要注入的Bean,或者你想保证依赖对象不为空,那么你可以使用按照名称或者按照构造方法进行注入

给我一些上面自动注入的简单示例

好的,我将给你一些简单的示例。

按照类型进行注入的示例(大部分用的都是这种):

@Component
public class FooService {
  //在字段上使用@Autowired注解,按照类型进行注入
  @Autowired
  private FooFormatter fooFormatter;
}

@Component
public class FooFormatter {
  public String format() {
    return "foo";
  }
}

按照名称进行注入的示例:

@Component
public class BarService {
  //在字段上使用@Autowired和@Qualifier注解,按照名称进行注入
  @Autowired
  @Qualifier("barFormatter")
  private BarFormatter barFormatter;
}

@Component("barFormatter")
public class BarFormatter {
  public String format() {
    return "bar";
  }
}

按照构造方法进行注入的示例:

@Component
public class BazService {
  private BazFormatter bazFormatter;

  //在构造方法上使用@Autowired注解,按照类型进行注入
  @Autowired
  public BazService(BazFormatter bazFormatter) {
    this.bazFormatter = bazFormatter;
  }
}

@Component
public class BazFormatter {
  public String format() {
    return "baz";
  }
}

依赖注入和自动注入的关联以及不同点

依赖注入(Dependency Injection,简称DI)和自动注入(Autowired)相关但不完全相同的概念。下面我将解释它们之间的关联和不同点:

关联

  1. 自动注入是依赖注入的一种实现方式。自动注入是指在容器启动或对象创建时,容器自动将所需的依赖对象注入到目标对象中,而无需手动显式地进行依赖注入

  2. Spring框架及其衍生的Spring Boot中,使用@Autowired注解实现自动注入。通过在目标对象的字段、构造函数或Setter方法上使用@Autowired注解,Spring容器会根据类型或名称自动查找并注入相应的依赖对象。

不同点:

  1. 控制权依赖注入是一种设计模式,强调将依赖对象的创建和管理责任转移到外部容器中。在依赖注入中,对象声明自己需要的依赖,但并不负责创建或获取依赖对象。相反,自动注入是依赖注入的一种具体实现方式,它是由容器在对象创建时自动完成依赖对象的注入。

  2. 显式性依赖注入通常需要在代码中显式地声明依赖关系,即通过构造函数、Setter方法或接口方法来接收依赖对象。这样可以清晰地表达对象之间的依赖关系。而自动注入不需要显式地声明依赖关系,容器会自动根据配置或默认规则完成注入

  3. 灵活性:依赖注入提供了更大的灵活性,允许对象在创建后替换依赖对象,或者在不同的环境中使用不同的依赖对象。通过手动注入,可以更容易地进行单元测试和模块替换。相比之下,自动注入的灵活性相对较低,依赖对象的选择通常由容器的配置或规则确定。

总结来说,依赖注入是一种设计模式,强调通过外部容器将依赖对象注入到目标对象中,以提高代码的可维护性和可测试性。

自动注入是依赖注入的一种具体实现方式,它通过使用@Autowired注解或其他类似的机制,在对象创建时自动完成依赖对象的注入。自动注入减少了手动注入的代码量,但相对来说可能牺牲了一些灵活性。

Spring Boot中,可以使用@Autowired注解实现自动注入,从而简化依赖注入的过程。文章来源地址https://www.toymoban.com/news/detail-459631.html

到了这里,关于SpringBoot中的依赖注入和自动注入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Springboot依赖注入Bean的三种方式,final+构造器注入Bean

    @Autowired注解的一大使用场景就是Field Injection。 通过Java的反射机制实现,所以private的成员也可以被注入具体的对象 优点 代码少,简洁明了。 新增依赖十分方便,不需要修改原有代码 缺点 容易出现空指针异常。Field 注入允许构建对象实例时依赖的对象为空,导致空指针异常

    2024年02月02日
    浏览(53)
  • 深入理解WPF中的依赖注入和控制反转

    在WPF开发中, 依赖注入(Dependency Injection)和控制反转(Inversion of Control)是程序解耦的关键,在当今软件工程中占有举足轻重的地位,两者之间有着密不可分的联系 。今天就以一个简单的小例子,简述如何在WPF中实现依赖注入和控制反转,仅供学习分享使用,如有不足之处

    2024年02月06日
    浏览(53)
  • VS依赖注入(DI)构造函数自动生成局部私有变量

    依赖注入(DI)在开发中既是常见的也是必需的技术。它帮助我们优化了代码结构,使得应用更加灵活、易于扩展,同时也降低了各个模块之间的耦合度,更容易进行单元测试,提高了编码效率和质量。我们经常会先定义局部变量,再在构造函数中使用,每次都要这样去编写耗时

    2024年02月11日
    浏览(46)
  • 了解Spring中的依赖注入:@Autowired vs. @Resource

    在Spring框架中,依赖注入是一项关键的特性,通过它,我们能够更灵活、更方便地管理和使用各种组件。在依赖注入的实现中, @Resource 和 @Autowired 是两个常用的注解,它们分别具有不同的特点和用途。在本篇博客中,我们将深入探讨这两个注解的功能、优缺点,并提供一些

    2024年02月02日
    浏览(55)
  • Springboot 入门指南:控制反转和依赖注入的含义和实现方式

    目录 一、什么是控制反转(IoC)? 二、什么是依赖注入(DI)? 三、如何在 springboot 中使用 IoC 和 DI? 总结 控制反转(Inversion of Control,简称 IoC)是一种设计原则,它的目的是降低代码之间的耦合度,提高模块化和可测试性。控制反转的含义是,将对象的创建、配置和管理

    2024年02月11日
    浏览(44)
  • 基于Xml方式Bean的配置-Bean的依赖注入以及·自动装配

    Bean的依赖注入方式 注入方式 配置方式 通过Bean的set方法注入 通过构造Bean的方法进行注入 其中,ref是reference的缩写形式,翻译为:涉及,参考的意思,用于引用其它Bean的id,value用于指定属性值 注入数据类型 普通数据类型:String、int、boolean,通过value属性指定 引用数据类型

    2024年02月07日
    浏览(55)
  • 如何在.net6webapi中实现自动依赖注入

    IOC(Inversion of Control)控制反转: 控制反正是一种设计思想,旨在将程序中的控制权从程序员转移到了容器中。容器负责管理对象之间的依赖关系,使得对象不再直接依赖于其他对象,而是通过依赖注入的方式来获取所需的资源。 DI(Dependency Injection)依赖注入: 他是IOC的具

    2024年02月08日
    浏览(36)
  • 【Spring进阶系列丨第五篇】详解Spring中的依赖注入

    全称 Dependency Injection(DI) 与IoC的关系 IoC和DI其实说的是一个意思,可以这么说: IoC是一种思想,DI是对这种思想的一种具体实现 依赖关系的管理 以后都交给spring来维护,在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明。 依赖关系的维护

    2024年02月04日
    浏览(58)
  • SpringBoot项目报错:org.springframework.beans.factory.UnsatisfiedDependencyException依赖注入异常(已解决)

           目录 报错信息 可能原因 结论         最近在学Spring Boot,今天在做Spring Boot + Mybatis Plus + Vue项目时启动后端报错:         先看报错信息,说出现了一个 依赖注入异常(UnsatisfiedDependencyException) ,在创建名为 \\\'loginController\\\' 的bean时出错,并且问题出现在字段 \\\'

    2024年02月11日
    浏览(50)
  • Vue 中的依赖注入,特别是 Provide 和 Inject,它们的原理、用法和示例

    Vue.js 作为一款现代的前端 JavaScript 框架,提供了诸多方便开发的特性。其中依赖注入是一个非常有用的功能,可以在组件树中传递数据和方法,并使得组件之间的耦合度更低。本文将介绍 Vue 中的依赖注入,特别是 Provide 和 Inject,它们的原理、用法和示例。 在软件开发中,

    2024年02月06日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包