Sping基础篇----掌握Sping的控制反转/依赖注入的概念【实战案例总结】

在这里插入图片描述

作为一名对技术充满热情的学习者,我一直以来都深刻地体会到知识的广度和深度。在这个不断演变的数字时代,我远非专家,而是一位不断追求进步的旅行者。通过这篇博客,我想分享我在某个领域的学习经验,与大家共同探讨、共同成长。请大家以开放的心态阅读,相信你们也会在这段知识之旅中找到启示。

文章目录

  • 前言
  • 一、什么是Spring?
  • 二、控制反转(IoC)和依赖注入(DI)
  • 三、依赖注入的实现方式有哪些?
  • 四、Spring核心容器
  • 五、实战案例


前言

本节我们来学习Sping是什么样的一个框架,介绍Spring框架支持包和相关文件的获取方式,并介绍其目录结构,学习这些知识是为使用Spring框架打好基础.


一、什么是Spring?

Java Spring,通常指的是Spring Framework,这是一个开放源代码的Java平台,广泛用于创建各种Java应用程序,尤其是企业级应用程序。Spring Framework是一个轻量级的控制反转(IoC)和面向切面的容器框架。

Spring Framework旨在简化Java开发,特别是通过以下方面:

  1. 依赖注入(DI):它允许你通过依赖注入的方式减少组件之间的耦合,组件不需要自己寻找或创建它们依赖的其他组件,而是由Spring容器注入所需要的组件。

  2. 面向切面编程(AOP):支持面向切面编程,可以将如安全、事务和日志等横切关注点与业务逻辑分离,提高代码的可维护性和可重用性。

  3. 抽象和事务管理:Spring提供了一整套事务管理接口,可以让你透明地进行声明式事务管理。

  4. MVC框架:Spring自带了一个MVC框架,用于创建Web应用程序。它是分层架构的并且集成了多种技术,如JSP、Freemarker、Velocity等。

  5. 各种辅助支持:Spring Framework提供了对JDBC、JPA、JMS、邮件发送等各种企业服务的抽象,这样开发者可以更容易地整合和使用这些技术。

总之,Spring Framework为Java开发者提供了一个全面的编程和配置模型,大大简化了Java应用的开发、部署和管理过程。此框架因其灵活性、强大的社区支持和不断的迭代更新而受到开发者的喜爱。随着时间的推移,Spring已经发展成一个全面的生态系统,包括Spring Boot、Spring Cloud等多个项目,都是为更快捷、更简单地开发分布式系统而设计的。

二、控制反转(IoC)和依赖注入(DI)

控制反转(IoC)和依赖注入(DI)是编程中用于实现解耦合(decoupling)的两个重要概念,它们通常在Spring Framework中得到广泛应用。

控制反转(IoC) 是一种设计原则,在这种设计中,对象的控制权从程序代码转移给一个容器或框架。传统的程序设计中,组件间的依赖关系通常由组件自己在内部控制和管理。而在IoC下,这种依赖关系的建立由外部容器控制。这意味着程序中的对象不需要自己创建或管理它们的依赖关系,这些都由IoC容器来处理。控制反转使得代码的管理更加容易,也使得应用程序更加模块化。

IoC可以通过多种方式实现,依赖注入只是实现IoC的手段之一。

依赖注入(DI) 是实现IoC的一种技术。DI的核心理念是,一个对象不应该负责创建或查找它依赖的对象。相反,这些依赖应当由外部通过某种方式提供给对象(即“注入”),常见的注入方式有构造器注入、设值器注入(setter injection)或接口注入。

依赖注入的好处包括但不限于:

  1. 降低耦合度:组件之间不直接创建彼此的实例,减少了耦合度,使得代码更容易修改和扩展。
  2. 增强模块化:每个组件都可以独立于其他组件被开发和测试。
  3. 提高测试性:依赖注入使得单元测试更易于执行,因为可以轻松地为一个组件注入测试期间所需的特定依赖。

在Spring框架中,IoC容器负责实例化、配置和组装对象,依赖注入是Spring实现这些任务的方式。Spring提供了基于XML配置文件和基于注解的两种主要的DI实现方式。通过使用Spring IoC容器,开发者可以更专注于业务逻辑的实现,而将对象生命周期管理和依赖关系的维护交给框架来处理。

三、依赖注入的实现方式有哪些?

依赖注入(Dependency Injection,简称DI)可以通过几种不同的方式实现。在Spring框架中,主要的实现方式包括:

  1. 构造器注入(Constructor Injection)
    在这种方式中,依赖项作为参数传递给构造器。当创建一个类的新实例时,Spring IoC容器调用包含依赖项的构造器,将所需的依赖项注入到类中。

    public class ExampleService {private final Dependency dependency;public ExampleService(Dependency dependency) {this.dependency = dependency;}
    }
    
  2. 设值器注入(Setter Injection)
    该方式通过类的设值器方法(setter methods)注入依赖项。这允许依赖项在对象被构造之后、被使用之前的任意时间点被注入。

    public class ExampleService {private Dependency dependency;public void setDependency(Dependency dependency) {this.dependency = dependency;}
    }
    
  3. 字段注入(Field Injection)
    通过在类的字段上直接设置依赖项来实现依赖注入。Spring框架通过反射机制来实现这一点,通常与@Autowired注解一同使用。

    public class ExampleService {@Autowiredprivate Dependency dependency;
    }
    
  4. 方法注入(Method Injection)
    类似setter注入,但它可以是任何方法,而不仅仅是传统的setter方法。在某个方法的参数中声明依赖项,让Spring调用该方法并传入必要的参数。

    public class ExampleService {private Dependency dependency;@Autowiredpublic void prepare(Dependency dependency) {this.dependency = dependency;}
    }
    
  5. 查找方法注入(Lookup Method Injection)
    这是一种特殊情况,主要用于当我们需要在单例bean中注入一个原型bean时。

  6. 接口注入(Interface Injection)
    这是一种更少见的依赖注入方式,其中一个组件(如一个类)提供一个接口,该接口用来注入依赖。

构造器注入和设值器(setter)注入是最为常见的依赖注入方式。构造器注入是更加不可变和避免了“部分构建”的对象,而设值器注入允许更多的灵活性,如可选和更改的依赖。字段注入简单但不推荐用于关键业务逻辑,因为它可能导致难以跟踪的依赖和困难的单元测试编写。考虑到这些约束,在选择注入方法时,应当根据具体情况和需求进行决策。

四、Spring核心容器

Spring 核心容器是Spring框架的基础部分,它提供了用于构建整个框架的基本功能。核心容器由几个主要的组建构成,主要负责管理对象(称为Bean)的生命周期和依赖注入。

Spring核心容器主要由以下四个模块组成:

  1. Spring Core(核心容器):这是框架的基础部分,提供了控制反转(IoC)和依赖注入(DI)的特性。在这里,BeanFactory是最主要的接口,它是一个先进的配置机制,能够管理任意类型的对象。

  2. Spring Context(应用上下文):它建立在Spring Core基础之上,能够访问Spring的核心功能。ApplicationContext接口是Context模块的焦点。它提供了比BeanFactory更丰富的功能,是BeanFactory的一个超集,能够支持国际化、事件传播、资源加载以及透明的创建上下文(如Web应用程序环境)。

  3. Spring AOP(面向切面编程):该模块提供了面向切面编程的实现,允许定义方法拦截和切点,从而实现解耦功能。这可以用来实现如事务管理和日志等跨越多个点的横切关注点。

  4. Spring Expression Language(SpEL):SpEL是一种强大的表达式语言,它支持在运行时查询和操作对象图。它可以用来动态查询对象图的状态或在对象图中进行配置。

Spring核心容器不仅负责IoC和DI,也提供了各种企业级应用服务的支持。利用核心容器,开发者可以定义对象的创建方式、装配它们的线索、配置它们的生命周期,以及管理它们的整个生命周期。

在核心容器之上,Spring框架还包括了数据访问/集成、Web、消息传递以及其他模块,这些模块构成了Spring的全面编程和配置模型。

五、实战案例

假设我们要创建一个简单的在线图书商店应用程序,我们将使用Spring框架来展示控制反转(IoC),依赖注入(DI),以及如何通过Spring核心容器来组织应用程序组件。

项目需求简述:

  • 用户能够浏览图书。
  • 用户可以将图书添加到购物车。
  • 用户可以进行结算。

实施步骤和概念应用:

  1. 设置工程环境:

    • 创建Maven或Gradle项目,并在项目的pom.xmlbuild.gradle文件中添加Spring相关依赖。
  2. 定义实体与组件(IoC and DI):

    • 创建图书(Book)、购物车(ShoppingCart)和订单(Order)实体。
    public class Book {private String title;private String author;private BigDecimal price;// Getters and Setters ...
    }public class ShoppingCart {private List<Book> books = new ArrayList<>();public void addBook(Book book) {books.add(book);}// Getters ...
    }public class Order {private ShoppingCart cart;private Date creationDate;// Constructors, Getters and Setters ...
    }
    
    • 创建服务接口比如BookServiceShoppingCartService,以及OrderService并提供实现。
    public interface BookService {List<Book> findAllBooks();Book findBookById(String id);
    }@Service
    public class BookServiceImpl implements BookService {// Injection of book repository to access books// Implementing methods...
    }@Service
    public class ShoppingCartService {// Methods for cart management...
    }@Service
    public class OrderService {// Methods for order processing...
    }
    
  3. 配置Spring Beans(XML/Annotation-based Configuration):

    • 使用XML文件或注解来配置实体和服务类作为Spring beans。
    @Service
    public class ShoppingCartService {private final ShoppingCart cart;@Autowiredpublic ShoppingCartService(ShoppingCart cart) {this.cart = cart;}// ...
    }
    
  4. 使用Spring MVC构建Web界面:

    • 创建Controller以实现用户与应用交互,如浏览图书、添加图书到购物车等功能。
    @Controller
    public class BookController {private final BookService bookService;private final ShoppingCartService cartService;@Autowiredpublic BookController(BookService bookService, ShoppingCartService cartService) {this.bookService = bookService;this.cartService = cartService;}// RequestMapping methods...
    }
    
  5. 配置和启动Spring ApplicationContext:

    • 根据选择的配置方式,设置ApplicationContext,可能是通过XML配置文件或通过使用@Configuration注解的Java配置类。
    • 启动Spring应用程序,ApplicationContext会负责初始化所有的Bean,注入依赖,并处理应用的生命周期。
  6. 应用AOP进行事务管理:

    • 用Spring AOP模块来声明式地管理事务,确保当发生错误时,系统能够回滚到稳定状态。
    @Service
    @Transactional
    public class OrderServiceImpl implements OrderService {// Methods for order service that require transactional context...
    }
    

通过这个案例,我们展示了使用Spring框架可以将应用切分为不同的组件和服务,通过IoC和DI简化组件间的依赖和互操作。Spring的核心容器来管理这些组件的生命周期、依赖关系和配置。同时,利用Spring AOP来处理横切关注点,如声明式事务管理。这样的设计使得应用程序更加模块化,易于测试和维护。


感谢大家抽出宝贵的时间来阅读博主的博客,新人博主,感谢大家关注点赞,祝大家未来的学习工作生活一帆风顺,加油!!!
在这里插入图片描述

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

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

相关文章

SMMU介绍

SMMU&#xff08;System Memory Management Unit&#xff09;是一种硬件设备&#xff0c;其作用是在虚拟地址空间和物理地址空间之间提供地址转换的功能。它通常用于处理虚拟化环境中的 I/O 设备&#xff0c;例如虚拟机中的设备访问或者容器环境中的设备隔离。 SMMU 的主要作用…

KVM虚拟机的克隆方式

话不多说&#xff0c;直接上操作 首先确定我们要克隆的模板机器&#xff0c;这样可以方便我们后续克隆许多机器 IP获取最好就是dhcp模式&#xff0c;这样克隆出来的机器就不需要自己再去改ip了 确定需要克隆的模板机以后&#xff0c;先关机再执行克隆操作 virsh shutdown ser…

【SiamFC】《Fully-Convolutional Siamese Networks for Object Tracking》

ECCV 2016 Workshops 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 The OTB-13 benchmark5.3 The VOT benchmarks5.4 Dataset size 6 Conclusion&#xff08;own&#xff09;/ Future wo…

Android系统启动流程

android的启动流程是从底层开始进行的&#xff0c;具体如下所示&#xff1a; Android是基于Linux内核的系统&#xff0c;Android的启动过程主要分为两个阶段&#xff0c;首先是Linux内核的启动&#xff0c;然后是Android框架的启动。 可以将Andorid系统的启动流程分为以下五个…

【QT 5 +Linux下软件桌面快捷方式+qt生成软件创建桌面图标+学习他人文章+第二篇:编写桌面文件.desktop】

【QT 5 Linux下软件桌面快捷方式qt生成软件创建桌面图标学习他人文章第二篇&#xff1a;编写桌面文件.desktop】 1、前言2、实验环境3、自我学习总结-本篇总结1、新手的疑问&#xff0c;做这件事目的2、了解.desktop3、三个关键目录以及文件编写1、目录&#xff1a;/opt/2、目录…

【鸿蒙 HarmonyOS 4.0】开发工具安装

一、准备开发环境 1.1、安装IDE 鸿蒙应用开发需要使用配套的IDE——HUAWEI DevEco Studio。 DevEco Studio基于IntelliJ IDEA Community&#xff08;IDEA社区版&#xff09;构建&#xff0c;为鸿蒙应用提供了一站式开发环境&#xff0c;集成了开发、运行、调试以及发布应用的…

【leetcode刷题之路】面试经典150题(3)——哈希表+区间

文章目录 5 哈希表5.1 【哈希表】赎金信5.2 【数学】同构字符串5.3 【数学】单词规律5.4 【哈希表】有效的字母异位词5.5 【哈希表】字母异位词分组5.6 【双指针】两数之和5.7 【数学】快乐数5.8 【哈希表】219. 存在重复元素 II5.9 【数学】最长连续序列 6 区间6.1 【数学】汇…

Stable Diffusion 模型分享:AstrAnime(Astr动画)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五 下载地址 模型介绍 AstrAnime 是一个动漫模型&#xff0c;画风色彩鲜明&#xff0c;擅长绘制漂亮的小姐姐。 条目内容类型大模型…

fastjson解析自定义get方法导致空指针问题

背景 为了在日志中把出入参打印出来&#xff0c;以便验证链路和排查问题&#xff0c;在日志中将入参用fastjson格式化成字符串输出&#xff0c;结果遇到了NPE。 问题复现 示例代码 public static void main(String[] args) {OrganizationId orgId new OrganizationId();N…

规模化强化学习 — 多任务强化学习

1 简述 1.1 单任务强化学习&#xff08;STRL&#xff09; 在单任务强化学习中&#xff0c;一个无人机的AI系统可能被训练来执行特定的任务&#xff0c;比如自主导航。在这个任务中&#xff0c;无人机需要学习如何有效地从起点飞行到终点&#xff0c;并避开障碍物。 举例&#…

【Java多线程】分析线程加锁导致的死锁问题以及解决方案

目录 1、线程加锁 2、死锁问题的三种经典场景 2.1、一个线程一把锁 2.2、两个线程两把锁 2.3、N个线程M把锁&#xff08;哲学家就餐问题&#xff09; 3、解决死锁问题 1、线程加锁 其中 locker 可以是任意对象&#xff0c;进入 synchronized 修饰的代码块, 相当于加锁&…

Java SourceDataLine 播放音频

Java SourceDataLine 播放音频 1 依赖2 接口3 实现4 测试 项目Value音频格式 添加依赖*.wav(JDK 原生支持)*.pcm(JDK 原生支持)*.au(JDK 原生支持)*.aiff(JDK 原生支持)*.mp3mp3spi.jar*.flacjflac-codec.jar 1 依赖 <dependency><groupId>com.googlecode.soundl…

⭐北邮复试刷题LCR 052. 递增顺序搜索树__DFS (力扣119经典题变种挑战)

LCR 052. 递增顺序搜索树 给你一棵二叉搜索树&#xff0c;请 按中序遍历 将其重新排列为一棵递增顺序搜索树&#xff0c;使树中最左边的节点成为树的根节点&#xff0c;并且每个节点没有左子节点&#xff0c;只有一个右子节点。 示例 1&#xff1a; 输入&#xff1a;root [5,…

DataX - 全量数据同步工具

前言 今天是2024-2-21&#xff0c;农历正月十二&#xff0c;相信今天开始是新的阶段&#xff0c;尽管它不是新的周一、某月一日、某年第一天&#xff0c;尽管我是一个很讲究仪式感的人。新年刚过去 12 天&#xff0c;再过 3 天就开学咯&#xff0c;开学之后我的大学时光就进入了…

TypeScript01:安装TypeScript

一、TypeScript 官方网站&#xff1a;https://www.tslang.cn/docs/index.html 练习场&#xff1a;https://www.typescriptlang.org/zh/play 好处&#xff1a; 强类型语言&#xff0c;对JS弱类型的一个良好补充&#xff1b;TS利于大型项目团队合作&#xff0c;可以一定程度…

这五个软件测试工具,测试工程师必备

在软件开发过程中&#xff0c;软件测试是确保软件质量和稳定性的关键环节。为了帮助开发人员和测试团队更好地完成这一任务&#xff0c;市面上涌现出众多软件测试工具。本文将盘点五个备受推崇的软件测试工具&#xff0c;它们各具特色&#xff0c;适用于不同的测试场景。 Test…

ChatGPT实战100例 - (17) 用ChatGPT实现音频长度测量和音量调整

文章目录 ChatGPT实战100例 - (17) 用ChatGPT实现音频长度测量和音量调整获取音频长度pydub获取音频长度获取时长精确到秒格式设定 mutagen获取音频长度 调整音量视频音量调整注意事项 ChatGPT实战100例 - (17) 用ChatGPT实现音频长度测量和音量调整 老王媳妇说上次那个pip挺好…

深度学习的学习笔记帖子2

人脸数据集的介绍&#xff1a; https://zhuanlan.zhihu.com/p/362356480 https://blog.csdn.net/bjbz_cxy/article/details/122210641 CASIAWebFace人脸数据集等的github&#xff1a; https://github.com/deepinsight/insightface/blob/master/recognition/datasets/README.md…

蓝桥杯基础知识点9 stack、queue、priority_queue

蓝桥杯基础知识点9 stack、queue、priority_queue 01 stack的定义和结构 stack是一种后进先出&#xff08;LIFO&#xff09;的数据结构&#xff0c;头文件<stcak>。 template <class T, class Container deque<T>> class stack; T&#xff1a;存储在stack…

《VitePress 简易速速上手小册》第7章 高级功能与动态内容(2024 最新版)

文章目录 7.1 动态路由与 API 集成7.1.1 基础知识点解析7.1.2 重点案例&#xff1a;技术博客7.1.3 拓展案例 1&#xff1a;电商网站7.1.4 拓展案例 2&#xff1a;事件管理网站 7.2 状态管理与 Vuex 使用7.2.1 基础知识点解析7.2.2 重点案例&#xff1a;用户认证系统7.2.3 拓展案…