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,一经查实,立即删除!

相关文章

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;集成了开发、运行、调试以及发布应用的…

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…

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

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

⭐北邮复试刷题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;可以一定程度…

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

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

《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 拓展案…

力扣精选算法100道——Z字形变换(模拟专题)

目录 &#x1f388;了解题意 &#x1f388;算法原理 &#x1f6a9;先处理第一行和最后一行 &#x1f6a9;再处理中间行 &#x1f388;实现代码 &#x1f388;了解题意 大家看到这个题目的时候肯定是很迷茫的&#xff0c;包括我自己也是搞不清楚题目什么意思&#xff0c;我…

[linux]进程间通信(IPC)———共享内存(shm)(什么是共享内存,共享内存的原理图,共享内存的接口,使用演示)

一、什么是共享内存 共享内存区是最快的&#xff08;进程间通信&#xff09;IPC形式。一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递不再涉及到内核&#xff0c;换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。注意&#xff1a;…

Three.js初学(2)

Three.js初学&#xff08;2&#xff09; 三维坐标系的认识1. 辅助坐标系 光源的影响1. 光材质的影响2. 光源介绍点光源环境光平行光 3. 光源衰减/位置 相机控件1. 引入扩展库2. 使用方法 三维坐标系的认识 这一章节的主要作用是加强自我对三维坐标空间的认识。 1. 辅助坐标系…

猫头虎分享已解决Bug || TypeError: Cannot set property ‘innerHTML‘ of null

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Kafka进阶

文章目录 概要应用场景消息队列两种模式kafka的基础架构分区常见问题小结 概要 kafka的传统定义&#xff1a;kafka是一个分布式的基于发布\订阅模式的消息队列&#xff0c;主要用于大数据实时处理领域。 kafka的最新概念&#xff1a;kafka是一个开源的分布式事件流平台&#x…

10种常见的光伏发电量计算方法

光伏发电是一种将太阳能转化为电能的清洁能源技术。随着环境保护意识的日益增强和能源结构的转型&#xff0c;光伏发电得到了广泛的应用。对于光伏系统来说&#xff0c;发电量的准确计算是评估系统性能、预测长期收益和优化系统运行的关键。以下是常见的光伏发电量计算方法&…

Python3零基础教程之Python解释器与开发环境搭建

大家好&#xff0c;我是千与编程&#xff0c;硕士毕业于北京大学&#xff0c;曾先后就职于字节跳动&#xff0c;京东等互联网大厂&#xff0c;目前在编程导航知识星球担任星球嘉宾&#xff0c;著有《AI算法毕设智囊袋》&#xff0c;《保姆级带你通关秋招教程》两大专栏。 今天开…