首页 > 其他分享 >Spring study

Spring study

时间:2024-07-15 15:55:56浏览次数:12  
标签:容器 依赖 BookService Spring study InventoryManager IoC public

IoC容器

初识IoC

1.什么是IoC容器?
IoC容器是Spring框架的核心组成部分,它负责管理应用程序中对象的创建、配置和生命周期。IoC容器通过依赖注入(Dependency Injection, DI)的方式,自动装配和管理对象之间的依赖关系,从而避免了对象之间硬编码的依赖。

2.为什么会有IoC容器?
在传统的编程模式中,对象的创建和依赖管理是由对象自身完成的,这种方式导致了几个问题:

高耦合性:对象需要知道其依赖对象的具体细节,这导致了紧耦合,使得代码难以维护和扩展。
难以测试:对象由于依赖于外部状态,使得单元测试变得困难,因为需要模拟或提供实际的依赖对象。
复杂性增加:每个对象都需要管理自己的依赖,增加了代码的复杂性和体积。
3.IoC容器用来解决什么问题?
IoC容器通过以下方式解决了上述问题:

降低耦合度:IoC容器解耦了对象的创建和依赖注入过程,使得对象专注于其业务逻辑而不必关心依赖的创建和管理。
提高可测试性:依赖对象可以由容器注入,这意味着在测试时可以轻松地替换依赖对象,使用模拟对象(mocks)或存根(stubs),从而简化单元测试。
简化配置和管理:依赖关系和对象配置信息被移到容器的配置中,这通常是通过XML配置文件或Java注解实现的,使得代码更加简洁和清晰。
生命周期管理:IoC容器可以管理对象的生命周期,包括初始化、销毁等,确保对象在适当的时候被创建和清理。
4.如何解决这些问题?
IoC容器通过以下步骤解决上述问题:

依赖注入:容器在运行时自动将依赖对象注入到需要它们的对象中,这可以是通过构造函数、setter方法或字段注入完成的。
配置管理:依赖关系和对象配置信息被集中在一个地方,通常是配置文件或注解中,这使得修改依赖关系或添加新对象变得更加容易。
对象池和生命周期管理:容器可以缓存对象实例,对于单例模式的对象,容器只创建一次并复用,同时容器还负责调用初始化和销毁方法,确保对象的正确生命周期。
通过这些机制,IoC容器提供了更灵活、可扩展和可维护的应用程序架构。

Spring的核心就是提供了一个IoC容器,它可以管理所有轻量级的JavaBean组件,提供的底层服务包括组件的生命周期管理、配置和组装服务、AOP支持,以及建立在AOP基础上的声明式事务服务等。

5.传统vsloC
假设我们正在构建一个简单的在线书店系统,其中有一个BookService类,用于处理书籍相关的业务逻辑,比如查询库存、购买书籍等。BookService需要一个InventoryManager类来检查和更新库存。

传统方法
在没有IoC容器的情况下,BookService可能会这样创建InventoryManager实例:

public class BookService {
private InventoryManager inventoryManager;

public BookService() {
    this.inventoryManager = new InventoryManager(); // 创建依赖
}

public void buyBook(String bookId) {
    if (inventoryManager.isBookAvailable(bookId)) {
        inventoryManager.decreaseStock(bookId);
        System.out.println("Book purchased successfully.");
    } else {
        System.out.println("Sorry, the book is out of stock.");
    }
}
}

这种方法的问题在于:

  • BookService直接创建了InventoryManager,导致两个类紧密耦合。
  • 如果InventoryManager的创建逻辑变得复杂(比如需要数据库连接),BookService也需要了解这些细节。
  • 测试BookService变得困难,因为我们不能轻易地替换InventoryManager。

使用IoC容器
使用Spring框架的IoC容器,我们可以将依赖注入给BookService,而无需它自行创建依赖:

@Service
public class BookService {
private final InventoryManager inventoryManager;
@Autowired
public BookService(InventoryManager inventoryManager) {
    this.inventoryManager = inventoryManager;
}

public void buyBook(String bookId) {
    if (inventoryManager.isBookAvailable(bookId)) {
        inventoryManager.decreaseStock(bookId);
        System.out.println("Book purchased successfully.");
    } else {
        System.out.println("Sorry, the book is out of stock.");
    }
}

}

使用注解法:

@Configuration
public class AppConfig {
@Bean
public InventoryManager inventoryManager() {
    return new InventoryManager();
}
@Bean
public BookService bookService() {
    return new BookService(inventoryManager());
}
}

解决的问题
降低耦合:BookService不再负责InventoryManager的创建,因此这两个类之间解耦。
提高可测试性:在测试BookService时,我们可以注入一个假的InventoryManager,这样可以隔离测试,避免依赖真实的库存逻辑。
灵活性:如果需要更改InventoryManager的实现,只需要更改配置即可,而不需要修改BookService的代码。
通过IoC容器,我们让容器来管理依赖关系,从而使我们的代码更易于维护和扩展。

理解:

  1. 降低类之间的耦合度

不使用IoC,类的创建形成多对多依赖关系,耦合度高。IoC相当于一个中间层,IoC与类之间是一对多依赖,将多对多关系变为一对多关系,减少系统整体耦合度

  1. 实例复用

不使用IoC,获取一个类的实例时,每次都要实例化,增加空间和时间。增加了IoC,IoC对实例提供了多种生命周期,可以提高实例的复用。

  1. 更方便根据不同环境创建不同实例

方便程序在不同环境下运行

使用步骤

1.通过maven引入spring框架
2.定义beans(注解配置)

使用注解来定义Beans,通常在类上使用@Component、@Service、@Repository或@Controller。然后,使用@Configuration和@Bean方法来定义复杂的bean。

@Configuration
public class AppConfig {

@Bean
public MyService myService() {
    return new MyService();
}

// 更多的@Bean方法}
3.注入依赖

使用@Autowired注解来自动注入Beans。Spring IoC容器会在运行时将适当的bean实例注入到需要的地方。

@Service
public class AnotherService {

private final MyService myService;

@Autowired
public AnotherService(MyService myService) {
    this.myService = myService;
}

// 使用myService的方法}
4.启动容器

注解配置:

public class Application {
public static void  main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    // 从context获取bean并使用它们
}
}
5.使用容器
MyService myService = context.getBean(MyService.class);
myService.doSomething();

标签:容器,依赖,BookService,Spring,study,InventoryManager,IoC,public
From: https://www.cnblogs.com/jhhhred/p/18303302

相关文章

  • Spring Boot Vue 毕设系统讲解 11【协同过滤方法教学】
    目录1.基础知识用户基于的协同过滤(User-basedCF)物品基于的协同过滤(Item-basedCF)优缺点实际应用2.项目功能实战1.基础知识协同过滤(CollaborativeFiltering,CF)是一种广泛应用于推荐系统中的算法,它通过分析和利用用户与物品之间的交互信息来发现用户可能感兴趣......
  • SpringBoot实战:轻松实现接口数据脱敏
    引言在现代的互联网应用中,数据安全和隐私保护变得越来越重要。尤其是在接口返回数据时,如何有效地对敏感数据进行脱敏处理,是每个开发者都需要关注的问题。本文将通过一个简单的SpringBoot项目,介绍如何实现接口数据脱敏。一、接口数据脱敏概述1.1接口数据脱敏的定义接口数据脱......
  • 基于SpringBoot网络安全科普小程序
    摘要随着科技的快速的发展和网络信息的普及,信息化管理已经融入到了人们的日常生活中,各行各业都开始采用信息化管理系统,通过计算机信息化管理,首先可以减轻人们工作量,而且采用信息化管理数据信息更加的严谨,可以直接实现智能化管理和数据存储。同样这样的技术也可以直接应用到网......
  • 基于SpringBoot+MySQL+SSM+Vue.js的购物商城系统(附论文)
    获取见最下方名片获取见最下方名片获取见最下方名片演示视频基于SpringBoot+MySQL+SSM+Vue.js的购物商城系统(附论文)技术描述开发工具:Idea/Eclipse数据库:MySQLJar包仓库:Maven前端框架:Vue/ElementUI后端框架:Spring+SpringMVC+Mybatis+SpringBoot文字描......
  • 基于SpringBoot+MySQL+SSM+Vue.js的家政公司服务平台系统(附论文)
    获取见最下方名片获取见最下方名片获取见最下方名片演示视频基于SpringBoot+MySQL+SSM+Vue.js的家政公司服务平台系统(附论文)技术描述开发工具:Idea/Eclipse数据库:MySQLJar包仓库:Maven前端框架:Vue/ElementUI后端框架:Spring+SpringMVC+Mybatis+SpringBoo......
  • Spring AI(聊天程序)
    接上篇:SpringAI(基础开发准备) 1、聊天程序(调用一次接口)packagecom.ithailin.controller;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.ai.openai.OpenAiChatModel;importorg.springframework.beans.factory.annotation.Auto......
  • Springboot日志配置
    日志加载:org.springframework.boot.logging.AbstractLoggingSystem#initializeWithConventionsprivatevoidinitializeWithConventions(LoggingInitializationContextinitializationContext,LogFilelogFile){Stringconfig=getSelfInitializationConfig();......
  • Spring Cloud微服务下如何配置I8n
    什么是I8n国际化(I18n)指的是设计和开发产品的过程,使得它们能够适应多种语言和文化环境,而不需要进行大量的代码更改。这通常涉及到创建一个基础版本的产品,然后通过配置和资源文件来添加对不同语言和地区的支持。这样,当产品需要在新的地理区域或语言环境中使用时,只需要添加或更新相......
  • Java毕业设计-基于springboot开发的医院后台管理系统设计与实现-毕业论文(附毕设源代码
    https://download.csdn.net/download/u014740628/88922529医院后台管理系统设计与实现应用技术概述在信息时代背景下,医院后台管理系统的开发成为提升医疗信息处理效率的关键。本文介绍的系统采用B/S架构,结合了MySQL数据库和Java语言进行实现,确保了系统的稳定性和数据的安......
  • Java毕业设计-基于springboot开发的医院药品管理系统设计与实现-毕业论文(附毕设源代码
    Java毕业设计-基于springboot开发的医院药品管理系统设计与实现-毕业论文(附毕设源代码)https://download.csdn.net/download/u014740628/88922533医院药品管理系统开发实践应用技术概述在数字化时代背景下,医院药品管理系统的开发利用了当前流行的技术栈,以满足现代医疗行业......