项目实战中学透Spring-业务场景驱动-Spring01(IOCDI)

news2024/10/6 10:35:42

在这里插入图片描述

软件环境

JDK1.8+

Maven3.6+

IDEA2022.3(Ultimate Edition)

Spring5.3.29

主要知识点大纲

1.Spring简介

2.Spring整体架构

3.业务场景中理解Spring IOC(控制反转)和DI(依赖注入)

4.业务场景中理解IOC容器,实例化容器,实例化Bean的几种方式

5.业务场景中理解Bean依赖注入(DI)的几种方式

说明:文档中的业务对象都来自于旅游和支付行业

先学会使用Spring各种特性和功能,然后再通过手写Spring掌握原理和设计思想

1.Spring是什么

顾名思义Spring是春天的意思,春天代表万物复苏,生机盎然代表着Spring能给Java行业带来活力和生机,那如何能带来活力和生机呢? Spring框架生态庞大,现在已经成为Java企业级应用开发一整套解决方案,另外大大简化了企业级应用开发的难度和提高了开发的效率。
在这里插入图片描述

Spring 2003年由Rod Johnson(罗宾·约翰逊)创建,从Spring Framework 5.1开始,Spring需要JDK 8+(Java SE 8+),并为JDK 11 LTS提供开箱即用的支持。建议将Java SE 8更新60作为Java 8的最低补丁版本,但通常建议使用最新的补丁版本。

2.Spring整体架构

在这里插入图片描述

3.Spring框架中的两个核心思想

3.1 IOC(Inversion of Control) 控制反转

业务场景中的IOC

在没有IOC之前我们如果要到景区去游玩,必须得到景区所在地去购买门票。如果有了IOC之后我们就不需要到景区所在地购买门票了,只需要交由旅行社或者通过在线订票网站购买即可,那么这个时候购买门票的行为就发生了反转,原来购买门票是自己亲自购买,现在则交给了导游或者通过在线订票网站购买。我们Spring中的控制反转是什么呢?原来Java对象的创建本来是由用户自己去创建,那么现在对象的创建交由Spring IOC容器来创建了
在这里插入图片描述
在这里插入图片描述

3.2 DI(Dependency Injection)依赖注入

IOC思想中一个核心的概念就是DI(Dependency Injection)依赖注入

业务场景中的DI

游客购买好门票后要到景区去游玩,进入景区的过程中其实就产生了DI(依赖注入)

游客入园需要门票,游客去景区游玩不是单独存在的必须依赖于第三个事物(门票)才能完成,也就是完成一件事情必须相互配合才能完成。Spring可以把完成一件事件需要依赖的对象自动的注入到当前对象中。
在这里插入图片描述

4.IOC容器

4.1 什么是IOC容器

在Spring框架中容器是用于存放Java对象,在Spring中对象统一称为Spring Beans,一个对象就是一个Spring Bean,Bean是IOC容器中的最小单位。

4.2 业务场景中理解IOC容器

如果把游客游玩的景区(scenic)理解为IOC容器,那么游客,门票,游乐设施,景区内的剧场、餐厅,商店等等对象都是IOC容器中的Bean。
在这里插入图片描述

5.实例化容器

代码中用到的Bean对象有游客(Traveller)、门票(Ticket)、订单(Order)
在这里插入图片描述
创建Spring项目

5.1 Spring IOC容器重要基础
//对bean进行管理
org.springframework.beans
//对容器进行管理
org.springframework.context
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-beans</artifactId>
   <version>5.3.29</version>
</dependency>
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>5.3.29</version>
</dependency>

BeanFactory接口提供了一种高级配置机制,能够管理任何类型的对象。ApplicationContext是BeanFactory的一个子接口,ApplicationContext接口就是我们的IOC容器

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
5.2 容器的使用
// create and configure beans 创建和配置bean
// 实例化景区(IOC容器)scenicContext
ApplicationContext scenicContext = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

// retrieve configured instance 检索配置实例 实例化游客
TravellerService travellerService = context.getBean("travellerService", TravellerService.class);
/** ticketService入园 use configured instance 使用IOC容器中的实例*/
Boolean success = travellerService.enteringPark();//游客在入园
<bean id="travellerService" class="cn.itbeien.service.TravellerService"/>

<bean name="ticketService" class="cn.itbeien.service.TicketService"/>

6.实例化Beans-XML方式

6.1 使用构造方法进行实例化



<bean id="travellerService" class="cn.itbeien.service.TravellerService"/>

<bean name="ticketService" class="cn.itbeien.service.TicketService"/>


6.2 使用静态工厂方法进行实例化

<bean id="travellerService"
    class="cn.itbeien.service.TravellerService"
    factory-method="createInstance"/>
package cn.itbeien.service
public class TravellerService {
    private static TravellerService travellerService = new TravellerService();
    private TravellerService() {}

    public static TravellerService createInstance() {
        return travellerService;
    }
}

6.3 使用工厂方法进行实例化



<!-- the factory bean, which contains a method called createInstance() -->
<bean id="travellerService" class="cn.itbeien.service.TravellerService">
    <!-- inject any dependencies required by this locator bean -->
</bean>

<!-- the bean to be created via the factory bean -->
<bean id="ticketService"
    factory-bean="travellerService"
    factory-method="createTicketServiceInstance"/>


public class TravellerService {

    private static TicketService ticketService = new TicketService();

    public TicketService createTicketServiceInstance() {
        return ticketService;
    }
}

一个工厂类也可以容纳一个以上的工厂方法,如下例所示

<!-- the factory bean, which contains a method called createInstance()
工厂bean,它包含一个名为createInstance()的方法
 -->
<bean id="travellerService" class="cn.itbeien.service.TravellerService">
    <!-- inject any dependencies required by this locator bean 
注入此工厂bean所需的任何依赖项
-->
</bean>

<!-- the bean to be created via the factory bean
通过工厂bean创建的bean
 -->
<bean id="ticketService"
    factory-bean="travellerService"
    factory-method="createTicketServiceInstance"/>
<bean id="orderService"
  factory-bean="travellerService"
  factory-method="createOrderServiceInstance"/>
public class TravellerService {

    private static TicketService ticketService = new TicketService();
  private static OrderService orderService = new OrderService();

    public TicketService createTicketServiceInstance() {
        return ticketService;
    }
  
  public OrderService createOrderServiceInstance() {
  return orderService;
  }
}

7.DI(依赖注入)的几种方式

7.1 基于构造方法的注入

public class TravellerService {

    /** the TravellerService has a dependency on a TicketService TravellerService依赖于TicketService
    */
    private final TicketService ticketService;

    /** a constructor so that the Spring container can inject a TicketService 构造函数,以便Spring容器可以注入TicketService
    */
    public TravellerService(TicketService ticketService) {
        this.ticketService = ticketService;
    }
/** business logic that actually uses the injected TicketService is omitted...  省略了实际使用注入的TicketService的业务逻辑*/

}
<beans>
  <bean id="travellerService" class="cn.itbeien.service.TravellerService">
  <constructor-arg ref="ticketService"/>
  <constructor-arg ref="orderService"/>
  </bean>
  <bean id="ticketService" class="cn.itbeien.service.TicketService"/>
  <bean id="orderService" class="cn.itbeien.service.OrderService"/>
</beans>

7.2 基于set方法的注入

public class TravellerService {
  /** the TravellerService has a dependency on the TicketService
  TravellerService依赖于TicketService
  */
  private TicketService ticketService;
  /** a setter method so that the Spring container can inject a TicketService 
  一个setter方法,以便Spring容器可以注入TicketService
  */
  public void setTicketService(TicketService ticketService) {
  this.ticketService = ticketService;
  }
  /** business logic that actually uses the injected TicketService is omitted... 
  省略了实际使用注入的TicketService的业务逻辑…
  */
}
<bean id="TravellerService" class="cn.itbeien.service.TravellerService">
  <!-- setter injection using the nested ref element
使用嵌套ref元素的Setter注入
 -->
  <property name="ticketService">
  <ref bean="ticketService"/>
  </property>
  <!-- setter injection using the neater ref attribute
	使用更简洁的ref属性的Setter注入
 -->
  <property name="orderService" ref="orderService"/>
  <property name="integerProperty" value="1"/>
</bean>
<bean id="ticketService" class="cn.itbeien.service.TicketService"/>
<bean id="orderService" class="cn.itbeien.service.OrderService"/>
public class TravellerService {
  private TicketService ticketService;
  private OrderService orderService;
  private int i;
  public void setTicketService(TicketService ticketService) {
  this.ticketService = ticketService;
  }
  public void setOrderService(OrderService orderService) {
  this.orderService = orderService;
  }
  public void setIntegerProperty(int i) {
  this.i = i;
  }
}

7.3 懒加载Bean

默认情况下Spring容器启动时就会创建被它管理的Bean,但是有的时候被Spring管理的Bean并不需要再容器启动的时候被创建,而是当前对象第一次被访问的时候进行创建,这种场景就可以使用懒加载实现。

业务场景
在这里插入图片描述

代码实现

<!-- 剧场使用懒加载-->
<bean id="lazy" class="cn.itbeien.service.TheaterService" lazy-init="true"/>
<!-- 负责验票的设备闸机不使用懒加载-->
<bean name="not.lazy" class="cn.itbeien.service.GateMachineService"/>

8 关注我

在这里插入图片描述

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

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

相关文章

在C#中对 JSON进行序列化和反序列化处理

概述&#xff1a;在现代软件开发领域&#xff0c;不同系统和平台之间的数据交换是不可或缺的方面。JSON&#xff08;JavaScript 对象表示法&#xff09;因其轻量级、人类可读和易于解析的特性而成为一种无处不在的数据格式。使用 C# &#x1f680;编程的 JSON 序列化和反序列化…

OpenCV学习(4.15) 基于 GrabCut 算法的交互式前景提取

1. 目标 在这一章当中 我们将看到 GrabCut 算法来提取图像中的前景我们将为此创建一个交互式应用程序。 2. 理论 GrabCut 算法由英国剑桥微软研究院 Carsten Rother&#xff0c;Vladimir Kolmogorov和Andrew Blake发明&#xff0c;并在他们的论文“GrabCut”&#xff1a;使…

使用 yocto 搭建 qemuarm64 环境

文章目录 前言一、ubuntu 环境准备1. 编译主机基础的环境准备2. 编译主机相关依赖软件的安装二、yocto5.0 代码的获取与编译1. 获取代码2. yocto5.0 代码的编译2.1 source 环境变量2.2 修改相关配置文件2.3 编译3. 启动 qemu总结参考资料前言 本文主要介绍如何在 ubuntu 下使用…

MySQL日志(二):MySQL抖动

一条SQL语句&#xff0c; 正常执行的时候特别快&#xff0c; 但是有时也不知道怎么回事&#xff0c; 它就会变得特别慢&#xff0c; 并且这样的场景很难复现&#xff0c; 它不只随机&#xff0c; 而且持续时间还很短。 看上去&#xff0c; 这就像是数据库“抖”了一下。 今天&…

FreeRTOS简单内核实现3 任务管理

文章目录 0、思考与回答0.1、思考一0.2、思考二0.3、思考三 1、任务控制块2、创建任务2.1、xTaskCreateStatic( )2.2、prvInitialiseNewTask( )2.3、pxPortInitialiseStack( )2.4、任务内存详解 3、就绪链表3.1、定义3.2、prvInitialiseTaskLists( ) 4、任务调度器4.1、vTaskSt…

阿里云系列产品免费用,不香吗?

阿里云系列产品免费用&#xff0c;不香吗&#xff1f; 什么是无影云电脑开启无影云下载安装客户端登录无影云桌面应用场景 开篇先发布一下阿里云产品免费体验地址&#xff1a;https://free.aliyun.com/?utm_contentg_1000370296 下面开始我的无影云电脑或者叫做无影云桌面的体…

LLM大语言模型算法特训,带你转型AI大语言模型算法工程师(完结)

LLM大语言模型算法 与AI大语言模型算法工程师的联系 LLM&#xff08;Large Language Model&#xff09;大语言模型是指像GPT这样的大型自然语言处理模型&#xff0c;而AI大语言模型算法工程师则是负责开发和优化这些模型的专业人士。它们之间的联系可以从以下几个方面来理解&a…

linux驱动学习(十二)之看门狗

一、看门狗定时器功能 1、产生复位信号&#xff1a;当系统受到由于噪声或者干扰而造成系统死机&#xff0c;看门狗产生一个复位信号。 2、普通定时器&#xff1a;16bits定时器&#xff0c;产生周期性的中断信号 二、看门狗系统框图 设置计数值以每隔10S就会产生一个复位信号&…

springboot依赖管理和自动配置

依赖管理和自动配置 依赖管理和自动配置依赖管理什么是依赖管理修改自动仲裁/默认版本号 starter场景启动器starter场景启动器基本介绍官方提供的starter第三方starter 自动配置自动配置基本介绍SpringBoot自动配置了哪些?如何修改默认配置如何修改默认扫描包结构resources\ap…

STM32学习笔记(一)--时钟树详解

&#xff08;1&#xff09;时钟概述&#xff1b;时钟是具有周期性的脉冲信号&#xff0c;最常用的是占空比50%的方波。&#xff08;时钟相当于单片机的脉搏&#xff1b;STM32本身非常复杂&#xff0c;外设非常的多&#xff0c;为了保持低功耗工作&#xff0c;STM32 的主控默认不…

亿达中国武汉园区入选“武汉市科技金融工作站”及“武汉市线下首贷服务站”

近日&#xff0c;武汉市2024科技金融早春行活动在深交所湖北资本市场培育基地举行。会上&#xff0c;第四批武汉市科技金融工作站试点单位名单及第五批武汉地区金融系统线下首贷服务站名单正式公布&#xff0c;武汉软件新城成功入选上述两个名单。 为缓解科技型企业融资难题&a…

远程问诊软件哪款好?选欣九康诊疗系统

近几年国家相继推出了支持发展“互联网医疗”的政策&#xff0c;如今随着相关政策的不断落实推进&#xff0c;市场上涌现出了一大批在线咨询、电子处方和远程问诊的医疗平台&#xff0c;而在面对种类如此繁多的医疗平台究竟选择哪款更好便成了医疗机构非常头疼的事情&#xff0…

【源码】综合股票币币合约交易所源码/etf交易所源码/美股港股台股交易所源码

支持多国语言 全开源可二开的一个版本&#xff01;支持虚拟货币 ETF 外汇 美股 A股 港股 台股。 前端是VUE开发&#xff08;带vue工程源码&#xff09;后端JAVA开发&#xff01;搭建也相对简单。 总的来说功能非常强大&#xff0c;适合线上运营的一个版本&#xff0c;有兴趣的可…

RabbitMQ无法删除unsynchronized队列及解决办法

一、故障环境 操作系统:CentOS7 RabbitMQ:3 nodes Cluster RabbitMQ version: 3.8.12 Erlang Version:22.3 Queue Type:Mirror,with polices 二、故障表现: 2.1 管理界面队列列表中存在部分队列镜像同步状态标红: 2.2 TPS为0,无消费者,其他节点镜像未同步且无法手动…

【SpringBoot】Spring Boot 中高级特性详解

文章目录 1. 异步处理1.1 什么是异步处理&#xff1f;1.2 实现异步处理1.2.1 启用异步支持1.2.2 使用 Async 注解1.2.3 调用异步方法 2. 安全管理2.1 Spring Security 集成2.2 基础安全配置2.2.1 添加依赖2.2.2 默认配置2.2.3 自定义用户认证 3. 监控和调试3.1 Spring Boot Act…

结构体对齐,与 触发 segment fault 为什么是 1024*132 ,而不是1024*128

1, 简单的小示例代码 按理说 malloc 的size 是 1024*128&#xff0c;这里却需要 1024*132才能及时触发 segmentation fault #include <stdlib.h> #include <stdio.h> #define SIZE 1024*131int main() {char *p 0;p malloc(SIZE);p[SIZE -1] a;free(p);printf(…

WWDC 2024 回顾:Apple Intelligence 的发布与解析

一年一度的苹果全球开发者大会&#xff08;WWDC&#xff09;如期而至&#xff0c;2024 年的 WWDC 再次成为科技界的焦点。本次发布会中&#xff0c;苹果正式推出了他们在 AI 领域的全新战略——Apple Intelligence。这一全新概念旨在为用户打造“强大、易用、全面、个性化、注重…

正运动邀您共聚2024深圳激光展,助力激光加工与智能制造!

■展会名称 2024深圳激光展 ■展会日期 2024年6月19日 - 21日 ■展馆地点 深圳国际会展中心&#xff08;新馆&#xff09; ■展位号 9H - D101 6月19至21日&#xff0c;深圳激光展将在中国深圳国际会展中心(新馆)举办。 激光加工在消费电子、光伏锂电新能源、半导体等行…

展厅设计要关注的基本点

1、设计方案 每个企业都会有不同的风格特色&#xff0c;找到一个合适企业的设计方案才是重点&#xff0c;所以在策划设计上要有一套个性化的方案。大到展厅内的结构&#xff0c;小到单个的展陈框架摆放&#xff0c;都要有详细的规划&#xff0c;这样才能够打造出一个效果突出的…

深度学习笔记: 最详尽估算送达时间系统设计

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 估算送达时间 1. 问题陈述 构建一个模型来估算在给定订单详情、市场条件和交通状况下的总送达时间。 为…