项目实战中学透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,一经查实,立即删除!

相关文章

java基础·小白入门(一)

目录 Java语言概述Java的性质三种平台跨平台原理 Java语言开发环境相关概念Java开发工具的安装Java程序的编译与运行基本注意事项 Java语言基础数据类型基本数据类型引用数据类型 关键字与标识符常量与变量常量变量 数据类型转换常见运算符 Java语言概述 这一部分主要讲讲Java的…

Chrome扩展程序开发新手指南:事件监听器的应用技巧

问题背景 最近我在开发Chrome浏览器插件时&#xff0c;遇到了一个需要脚本初始化的问题。在插件被安装后或浏览器标签页被刷新时&#xff0c;我需要重新初始化插件。为了实现这一点&#xff0c;我研究了Chrome提供的几个API接口&#xff0c;它们分别是chrome.runtime.onInstal…

[面试题]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. 模型…

面试题分享--Spring02

Spring 框架中都用到了哪些设计模式?(必会) 1. 工厂模式&#xff1a;BeanFactory 就是简单工厂模式的体现&#xff0c;用来创建对象的实例 2. 单例模式&#xff1a;Bean 默认为单例模式 3. 代理模式&#xff1a;Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码生成…

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、…

平庸的学术工作者

自己进入学术这条路&#xff0c;差不多十年了&#xff0c;回想自己目前的成果&#xff0c;自我评价为平庸。如果将同领域清华的年轻学者打分为 100 分的话&#xff0c;我将自己打分 65。 到目前为止&#xff0c;并不觉得智力因素在管理科学与工程领域的科研中有太大决定作用&a…

Demeditec Diagnostics DmbH兽医诊断类科研试剂

此类产品包括用于多种动物物种包括狗(犬)、猫、牛、马、大鼠和小鼠等分析物的检测。 皮质酮酶联免疫检测试剂盒(Corticosterone rat/mouse Elisa Kit) 产品编号&#xff1a;DEV9922 皮质酮是肾上腺皮质在应答促肾上腺皮质激素时所产生的一种糖皮质激素&#xff0c;是醛甾酮前…

CP AUTOSAR标准之MemoryDriver(AUTOSAR_CP_SWS_MemoryDriver)

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

SS928的SVP_NNN和NNN的区别

图像分析引擎 2 &#xff08;SVP_NNN&#xff09;与图像分析引擎 1 &#xff08;NNN&#xff09;在多个方面存在差异&#xff0c;以下是一些主要的区别和使用上的差异点&#xff1a; 接口风格差异&#xff1a; 图像分析引擎 1 使用 ACL 接口&#xff0c;而图像分析引擎 2 使用 …

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

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