项目实战中学透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 TicketServiceTravellerService依赖于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.mzph.cn/news/855054.shtml

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

相关文章

[面试题]Redis

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis 什么是 Redis &#xff…

随机产生一些江河上的坐标数据

不久前收到一个需求&#xff0c;说要随机创建约一百个某段江河上的坐标点&#xff0c;用于做一些数据呈现。 我首先是想到用AI直接给我一点数据&#xff0c;没想到给出来的坐标&#xff0c;有许多都落在陆地上&#xff0c;根本不符合我的要求。后来结合AI给出的建议&#xff0…

生成对抗网络——GAN深度卷积实现(代码+理解)

本篇博客为 上篇博客的 另一个实现版本&#xff0c;训练流程相同&#xff0c;所以只实现代码&#xff0c;感兴趣可以跳转看一下。 生成对抗网络—GAN&#xff08;代码理解&#xff09; http://t.csdnimg.cn/HDfLOhttp://t.csdnimg.cn/HDfLO 目录 一、GAN深度卷积实现 1. 模型…

The First项目报告:深度解读Layer 2生态zkSync

zkSync发币了&#xff0c;这个无数撸毛党心心念念数年之久的项目终于要来了&#xff0c;zkSync 是由Matter Labs 于2019 年推出的以太坊Layer 2 扩容解决方案&#xff0c;作为L2龙头项目之一&#xff0c;与其同属一个层次的L2四大天王之三Optimism、Arbitrum、zkSync、StarkNet…

Profibus协议转Modbus协议网关模块帮助PLC实现智能激光设备通讯

一、前言 Profibus转Modbus网关&#xff08;XD-MDPB100&#xff09;是一种工业通信协议转换设备&#xff0c;用于实现Profibus协议与Modbus协议之间的转换。Profibus转Modbus网关在工业自动化系统中具有广泛的应用&#xff0c;它解决了不同协议设备之间的通信问题。本文将深入…

怎么样判断真假单北斗

国产化替代正在中国各行各业逐步提升中&#xff0c;特别涉及重点产业——国家安全&#xff01; 只有仅支持B1I和B3信号的芯片才是真正的单北斗芯片。但凡你支持了B1C、B2a、B2b中的一个就是假的单北斗。 B1C/L1/E1、B2a/ L5/E5a、B2b/G3/E5b这些频点与其他GNSS系统是完全重合的…

湖北科技学院2024年成人高等继续教育招生简章

湖北科技学院&#xff0c;这所坐落在荆楚大地的高等学府&#xff0c;一直以来都是培养各类专业人才的重要基地。随着社会的快速发展&#xff0c;终身学习的理念深入人心&#xff0c;成人高等继续教育作为满足广大成年人提升学历、增强职业技能的重要途径&#xff0c;受到了越来…

Java输入输出语句 和 保留字

目录 键盘输入语句 保留字 键盘输入语句 Input.java , 需要一个 扫描器(对象), 就是Scanner 步骤 &#xff1a; 导入该类的所在包, java.util.*创建该类对象&#xff08;声明变量&#xff09;调用里面的功能 案例要求&#xff1a;可以从控制台接收用户信息&#xff0c;【姓…

润滑不良:滚珠花键磨损的隐形杀手!

滚珠花键作为一种精密机械传动元件&#xff0c;被广泛应用于各种机器和设备中&#xff0c;起着传递动力和运动的重要作用。滚珠花键经过长时间的运行&#xff0c;难免会多少些磨损&#xff0c;严重的话还会导致设备不能正常运转。那么&#xff0c;如何保证它的正常运行呢&#…

88. 合并两个有序数组(简单)

88. 合并两个有序数组 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;88. 合并两个有序数组 2.详细题解 两个数组均有序&#xff08;非递减&#xff09;&#xff0c;要求合并两个数组&#xff0c;直观的思路&#xff0c;借助第三个数…

【Linux环境下Hadoop部署】—报错“Unit ntpd.service could not be found.“

项目场景&#xff1a; 执行 “systemctl status ntpd” 命令。 问题描述 报错&#xff1a;Unit ntpd.service could not be found. 原因分析&#xff1a; 没有安装ntp 解决方案&#xff1a; 执行 “yum install ntp” 命令&#xff0c;再次执行 “systemctl status ntpd” 命令…

Docker部署私有仓库Harbor

Harbor构建Docker私有仓库 文章目录 Harbor构建Docker私有仓库资源列表一、部署Docker-Compose服务1.1、下载最新Docker-Compose1.2、查看Docker-Compose版本 二、部署Harbor服务2.1、下载Harbor安装程序2.2、配置Harbor参数文件2.3、所需参数和可选参数2.3.1、所需参数2.3.2、…

CP AUTOSAR标准之MemoryDriver(AUTOSAR_CP_SWS_MemoryDriver)

1 简介和功能概述 该规范描述了AUTOSAR基础软件模块内存驱动程序(Mem)的功能、API和配置。   内存驱动程序提供访问不同类型内存设备的基本服务,如读取、写入、擦除和空白检查。   尽管闪存仍然是最常见的非易失性存储器技术,但内存驱动程序规范考虑了所有相关的内存设备…

虚拟警示教育馆如何革新安全教育?揭秘其深远意义与实际优势

一、推动警示教育的创新与普及 虚拟警示教育馆是将传统警示教育与现代科技相结合的新型教育模式。其意义主要体现在以下几个方面&#xff1a; 1、增强教育的互动性和沉浸感&#xff1a;虚拟警示教育馆通过3D建模、VR等技术&#xff0c;创建逼真的警示场景。这种身临其境的体验能…

(资料收藏)王阳明传《知行合一》共74讲,王阳明知行合一音频讲解资料

今天给大家带来的不是软件&#xff0c;而是一份精神食粮——《知行合一》的教程福利。这可不是一般的教程&#xff0c;它关乎心灵&#xff0c;关乎智慧&#xff0c;关乎我们如何在纷繁复杂的世界中找到自己的位置。 咱们得聊聊王阳明&#xff0c;这位明代的大儒&#xff0c;他…

餐饮业应该购置精酿啤酒设备吗?

近几年&#xff0c;啤酒行业刮起了一股“精酿风”&#xff0c;它不只是一种饮品口味上的变化&#xff0c;更像是一个生活方式的升级。精酿啤酒的兴起&#xff0c;不仅体现在味道的多样性和层次感上&#xff0c;更重要的是它代表了一种生活态度&#xff0c;是对品质生活的追求。…

可复用验证的测试用例 5大编写技巧

编写可复用验证的测试用例&#xff0c;节省了编写新测试用例的时间和资源&#xff0c;提高了测试效率和项目质量&#xff0c;减少错误修复成本&#xff0c;有利于实现较高的投入产出比。缺乏可复用的测试用例会导致测试团队不断重复创建相似的测试场景&#xff0c;消耗大量时间…

每日一练:攻防世界:Ditf

这是难度1的题吗&#xff1f;&#xff1f;&#xff1f; 拿到一个png图片&#xff0c;第一反应就是CRC爆破&#xff0c;结果还真的是高度被修改了 这里拿到一个字符串&#xff0c;提交flag结果发现不是&#xff0c;那么只可能是密钥之类的了 看看有没有压缩包&#xff0c;搜索…

IMU应用于体操训练

考虑到在艺术体操训练与竞赛中艺术体操的训练与比赛中&#xff0c;地板项目导致的伤率最高&#xff0c;最近&#xff0c;一个来自澳大利亚的科研团队利用IMU评估运动员执行基础翻腾技巧训练时&#xff0c;他们上肢与下肢所承受的冲击负荷。 本次实验共有十四名艺术体操运动员参…

(五)React受控表单、获取DOM

1. React受控表单 概念&#xff1a;使用React组件的状态&#xff08;useState&#xff09;控制表单的状态 准备一个React状态值 const [value, setValue] useState()通过value属性绑定状态&#xff0c;通过onChange属性绑定状态同步的函数 <input type"text"…