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

在这里插入图片描述

软件环境

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 关注我

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法 刷题系列】判断链表是否有环(图文详解)

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法 经典例题》C语言 期待您的关注 ​ ​ 目录 一、问题描述 二、解题思路 1.解题思路: 2.快慢指针的移动分三个…

【C++】:list容器的基本使用

目录 &#x1f680;前言一&#xff0c;list的介绍二&#xff0c;list的基本使用2.1 list的构造2.2 list迭代器的使用2.3 list的头插&#xff0c;头删&#xff0c;尾插和尾删2.4 list的插入和删除2.5 list 的 resize/swap/clear &#x1f680;前言 list中的接口比较多&#xff…

Android Calculator2源码分析与修改

private CalculatorDisplay mDisplay; private Symbols mSymbols new Symbols(); -41,6 44,7 class Logic { private int mLineLength 0; private static final String INFINITY_UNICODE “\u221e”; private static final String ZMS_NUMBER “55555”; public stat…

Windows系统下制作Windows Server系统U盘启动及安装指导

Windows系统下制作Windows Server系统U盘启动及安装指导 一、准备工作 U盘不得小于8G(推荐使用usb3.0接口)&#xff1b;下载好对应的系统镜像&#xff1b;下载RUFUS或者软通碟U盘制作启动软件&#xff1b; 二、Windows操作系统下制作U盘启动&#xff08;这里以使用RUFUS软件…

VirtualBox 安装UOS统信服务器操作系统

1、准备 1.1安装VirtualBox 由于过程简单&#xff0c;不做赘述&#xff01; 1.2下载UOS服务器版本 下载免费版本即可 服务器与云计算操作系统-统信软件 (uniontech.com)https://uniontech.com/os-serverCloud.html 2、安装 2.1新建虚拟机 2.2选择虚拟机模式&#xff0c;这…

day63 单调栈part02 42. 接雨水 84.柱状图中最大的矩形

42. 接雨水 1.首先单调栈是按照行方向来计算雨水&#xff0c;如图&#xff1a; 2.使用单调栈内元素的顺序 从大到小还是从小到大呢&#xff1f; 从栈头&#xff08;元素从栈头弹出&#xff09;到栈底的顺序应该是从小到大的顺序。 因为一旦发现添加的柱子高度大于栈头元素…

【MATLAB】- 随笔 :如何检测一个字符串数组中是否包含自己想要的序列

1. 问题重述 比如我现在有一个 strArray [“a”, “1”, “2”, “b”]; 我想确定里面是否包含[“1”, “2”]; &#xff0c;由于MATLAB基础库中没有现成的函数可以直接检查连续子数组或连续多个元素的序列&#xff0c;下面给出自定义函数来实现这一功能。 2. 自定义函数 2…

部分CVE复现Web(1)

Apache HTTP Server 路径穿越漏洞CVE-2021-41773 ​ 首先&#xff0c;先来看一下这个漏洞的官方描述&#xff1a; ​ CVE-2021-41773 是在 Apache HTTP Server 2.4.49 中对路径规范化所做的更改中发现了一个缺陷。攻击者可以使用路径遍历攻击将 URL 映射到预期文档根目录之外的…

【Linux 12】进程控制

文章目录 &#x1f308; Ⅰ 进程创建01. fork 函数介绍02. 写时拷贝03. fork 常规用法04. fork 调用失败的原因 &#x1f308; Ⅱ 进程终止01. 进程退出场景02. 常见退出方法 &#x1f308; Ⅲ 进程等待01. 进程等待必要性02. 进程等待的方法2.1 wait 方法2.2 waitpid 方法 03.…

函数式编程基本语法

文章目录 1.函数对象表现形式1.Lambda表达式&#xff08;功能全面&#xff09;1.基本语法2.只有一行逻辑&#xff0c;该逻辑结果是返回值3.复杂逻辑4.省略参数类型&#xff08;可以通过上下文推导出类型时&#xff0c;比如实现了函数式接口&#xff09;5.只有一个参数时&#x…

NAND闪存市场彻底复苏

在全球内存市场逐渐走出阴霾、迎来复苏曙光之际&#xff0c;日本存储巨头铠侠&#xff08;Kioxia&#xff09;凭借敏锐的市场洞察力和及时的战略调整&#xff0c;成功实现了从生产紧缩到全面复苏的华丽转身。这一转变不仅彰显了企业在逆境中的生存智慧&#xff0c;也为全球半导…

在 Stable Diffusion 中控制光线的三种方式

光线在摄影中扮演着至关重要的角色&#xff0c;并对图像的整体质量和意境产生重要影响。你可以利用光线来增强主题&#xff0c;创造深度和立体感&#xff0c;传达情感&#xff0c;并突出重要细节。 在本文中&#xff0c;你将了解通过以下方法来控制光线&#xff1a; 光线提示…

基于Java的度分秒坐标转纯经纬度坐标的漂亮国基地信息管理

目录 前言 一、空间表设计 1、物理表结构 二、后台数据管理 1、数据去重 2、去重的具体实现 3、度分秒数据格式转换 4、具体的转换方法 5、新增界面的实现 三、数据管理界面 总结 前言 众所周知&#xff0c;漂亮国在全球范围内部署了大量的基地&#xff0c;用以维持其…

阿里巴巴全球数学竞赛报名条件

#竞赛概览与历史# “阿里巴巴全球数学竞赛”&#xff08;Alibaba Global Mathematics Competition&#xff09;由阿里巴巴公益、阿里巴巴达摩院共同举办&#xff0c;面向全球的数学爱好者&#xff0c;集竞赛、培训、交流于一体&#xff0c;旨在全球范围内引领开启关注数学、理解…

monitor-zabbix

监控体系理论 学习本篇文章&#xff0c;了解运维监控系统的前世今生 zabbix官网仓库地址 zabbix官网 https://www.zabbix.com/cn/zabbix官网仓库地址 http://repo.zabbix.com/zabbix/ http://repo.zabbix.com/zabbix/4.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_…

数字孪生智慧机场:引领航空未来

图扑数字孪生技术赋能智慧机场&#xff0c;实现运营管理和乘客服务的全面优化。实时数据监控与智能决策助力高效安全的航空体验&#xff0c;推动行业创新与发展。

分布式理论与设计 三、分布式一致性协议

1.两阶段提交协议&#xff08;2PC&#xff09; 1&#xff09;两阶段提交协议 两阶段提交协议&#xff0c;简称2PC(2 Prepare Commit)&#xff0c;是比较常用的解决分布式事务问题的方式&#xff0c;要么所有参与进程都提交事务&#xff0c;要么都取消事务&#xff0c;即实现A…

EasyRecovery电脑数据恢复软件2024数据守护神#误删文件神器#硬盘恢复利器#数据丢失救星

&#x1f310; 你是否曾经因为误删文件、硬盘损坏等原因&#xff0c;失去了重要的数据&#xff1f;别担心&#xff0c;EasyRecovery电脑数据恢复软件是你的救星&#xff01;它能够帮你找回丢失的文件&#xff0c;让你的数据重新焕发生机。 &#x1f50d; EasyRecovery软件的核…