Spring 框架入门介绍及IoC的三种注入方式
目录
一、Spring 简介
1. 简介
2. spring 的核心模块 ⭐
二、IoC 的概念
2.1 IoC 详解
2.2 IoC的好处
2.3 谈谈你对IoC的理解
三、IoC的三种注入方式
3.1 构造方法注入
3.2 setter方法注入
3.3 接口注入(自动分配)
3.4 spring上下文与tomcat整合
3.5 总结
一、Spring 简介
1. 简介
Spring框架是 Java 平台的一个开源的全栈(full-stack)应用程序框架和控制反转容器实现,一般被直接称为 Spring。它由Rod Johnson创建,去搜索了它的资料很难想象Rod Johnson之前是学音乐。该框架的一些核心功能理论上可用于任何 Java 应用,它还为基于Java企业版平台构建的 Web 应用提供了大量的拓展支持。Spring 没有直接实现任何的编程模型,但它已经在 Java 社区中广为流行,基本上完全代替了 企业级JavaBeans(EJB)模型。
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用
2. spring 的核心模块 ⭐
-
控制反转(IoC):Spring通过IoC容器管理应用程序中的对象依赖关系。它将对象的创建、组装和管理工作交给了容器,开发人员只需要关注业务逻辑的实现。
-
面向切面编程(AOP):Spring支持AOP,可以将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高代码的模块化和可重用性。
-
数据访问支持:Spring提供了对各种数据访问技术的支持,包括JDBC、ORM(如Hibernate、MyBatis)、JPA等。它简化了数据访问层的开发,提供了事务管理和异常处理等功能。
-
Web开发支持:Spring提供了一套全面的Web开发框架,包括Spring MVC和Spring WebFlux。它们可以帮助开发人员构建灵活、高效的Web应用程序。
-
安全性支持:Spring提供了一套强大的安全性框架,可以用于认证、授权和安全性管理。它支持各种认证方式,如基于表单、基于HTTP基本认证、基于OAuth等。
此外,Spring还提供了许多其他功能和扩展,如缓存支持、消息队列、调度任务等。它的模块化设计使得开发人员可以根据需要选择使用的功能,从而提高开发效率。
二、IoC 的概念
2.1 IoC 详解
- Spring框架中的IoC(Inversion of Control,控制反转)是指将对象的创建、依赖关系的管理和对象的生命周期等控制权从应用程序代码中转移到框架中。在IoC的概念下,对象的创建和管理不再由开发人员直接控制,而是由Spring容器来负责。
- IoC的核心思想是通过依赖注入(Dependency Injection,DI)来实现对象之间的解耦。依赖注入是指在对象创建的过程中,将其所依赖的其他对象的引用注入到对象中,从而实现对象之间的关系建立和协作。通过依赖注入,对象不再负责自己依赖对象的创建和查找,而是由容器来完成。
- Spring框架中的IoC容器负责管理对象的生命周期和依赖关系。它通过配置文件(如XML配置文件)或注解的方式描述对象之间的依赖关系,并在应用程序启动时将这些对象实例化并组装起来。开发人员只需要定义对象的行为,而无需关心对象的创建和管理过程。
2.2 IoC的好处
-
解耦:通过依赖注入,对象之间的依赖关系被明确地声明在配置文件或注解中,使得对象之间的耦合度降低,提高了代码的可维护性和可测试性。
-
简化对象的创建和管理:由容器负责对象的创建和生命周期管理,开发人员只需关注对象的行为逻辑,而无需手动管理对象的创建和销毁。
-
提供灵活的配置方式:通过配置文件或注解,可以方便地修改对象之间的依赖关系,实现灵活的配置和组装。
-
支持AOP(Aspect-Oriented Programming):Spring框架提供了面向切面编程的支持,可以通过IoC容器将横切逻辑(如日志、事务管理等)与业务逻辑分离,提高了代码的模块化和可维护性。
2.3 谈谈你对IoC的理解
Spring框架中的IoC(控制反转)通过依赖注入实现对象之间的解耦,将对象的创建和管理交由容器负责。使用IoC容器可以简化对象的创建和管理过程,提高代码的可维护性和可测试性。通过灵活的配置方式,可以方便地修改对象之间的依赖关系。同时,IoC容器的存在也为AOP提供了支持,使得横切逻辑与业务逻辑分离,提高了代码的模块化和可维护性。
三、IoC的三种注入方式
3.1 构造方法注入
一、构造函数注入(Constructor Injection):通过构造函数来注入依赖对象。在类的构造函数中声明依赖对象的参数,并在容器中配置时提供相应的依赖对象。当创建对象实例时,容器会自动将依赖对象传递给构造函数,完成依赖注入。
示例代码:
1. 编写一个接口定义修改用户信息的方法
package com.ycxw.ioc.service;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-16 22:28*/
public interface UserService {/*** 方法功能:修改用户信息*/public void edit();
}
2. 编写一个service类来实现这个接口中的方法
package com.ycxw.ioc.service.impl;import com.ycxw.ioc.service.UserService;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-16 22:29**/
public class UserServiceImpl1 implements UserService {@Overridepublic void edit() {System.out.println("更改了用户的信息");}
}
3. 编写控制器(action)进行调用并编写无参和有参构造方法
package com.ycxw.ioc.web;import com.ycxw.ioc.service.UserService;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-16 22:30**/
public class UserAction {private UserService userService;public UserAction() {}public UserAction(UserService userService) {this.userService = userService;}public String edits(){userService.edit();return "list";}
}
🌟4. 编写spring.xml配置文件,用于定义和配置Spring应用程序的组件、依赖关系、行为和其他相关配置。它是Spring框架的核心配置文件之一。
-
定义Bean:在
spring.xml
文件中,可以使用XML配置元素来定义应用程序中的Bean对象。通过配置Bean的类路径、构造函数,Spring容器可以根据配置文件中的定义来创建和管理Bean对象。 -
配置依赖注入:
spring.xml
文件可以指定Bean之间的依赖关系,通过配置构造函数注入,将依赖的Bean (userService) 注入到目标Bean (userAction) 中,实现依赖注入。这样可以实现对象之间的解耦,提高代码的灵活性和可测试性。
<?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"><bean class="com.ycxw.ioc.web.UserAction" id="userAction"><constructor-arg name="userService" ref="userService"></constructor-arg></bean><bean class="com.ycxw.ioc.service.impl.UserServiceImpl1" id="userService"></bean>
</beans>
5. 测试
package com.ycxw.ioc.test;import com.ycxw.ioc.web.UserAction;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-16 22:35*/
public class demo1 {public static void main(String[] args) {//加载spring核心配置文件(建模,这个spring的上下文对象),上下文对象中可以获取任何javabean对象ApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");//(强转)应用指定对象UserAction userAction = (UserAction) context.getBean("userAction");//调用修改用户信息方法userAction.edits();}
}
3.2 setter方法注入
二、Setter方法注入(Setter Injection):通过setter方法来注入依赖对象。在类中定义相应的setter方法,并在容器中配置时使用相应的属性或标签指定依赖对象。当创建对象实例后,容器会调用相应的setter方法,将依赖对象注入到对象中。
示例代码:
1. 修改了控制器(action)
package com.ycxw.ioc.web;import com.ycxw.ioc.service.UserService;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-14 18:40**/
public class UserAction {private UserService userService;public UserService getUserService() {return userService;}public void setUserService(UserService userService) {this.userService = userService;}public String edits(){userService.edit();return "list";}
}
2. 修改了bean注入的方式 (property)
<?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"><bean class="com.ycxw.ioc.web.UserAction" id="userAction"><property name="userService" ref="userService"></property><bean class="com.ycxw.ioc.service.impl.UserServiceImpl1" id="userService"></bean>
</beans>
3.3 接口注入(自动分配)
三、这里请注意byType 和 byName 的区别:
1. byType(按类型自动装配):
- 在
byType
模式下,Spring容器会根据属性的类型来查找与之匹配的Bean,并将其自动注入到对应的属性上。 - 例如,如果一个属性的类型为userService,Spring容器会查找实现了userService接口的Bean,并将其注入到该属性上。
- 要使用
byType
模式,目标Bean的属性类型必须与其他Bean的类型匹配,并且在容器中只能有一个匹配的Bean。
2. byName(按名称自动装配):
- 在
byName
模式下,Spring容器会根据属性的名称来查找与之匹配的Bean,并将其自动注入到对应的属性上。 - 例如,如果一个属性名为
myBean
,Spring容器会查找名称为myBean
的Bean,并将其注入到该属性上。 - 要使用
byName
模式,目标Bean的属性名称必须与其他Bean的名称匹配。
3.4 spring上下文与tomcat整合
在用户每一次发送任意请求,在对应请求处理代码中可以获取到spring容器中配置的任意的JavaBean,从而获取对应的javabean中定义的方法。
实现思路:
- 在tomcat启动的时候自动去加载spring的上下文(ApplicationContext)
- 利用监听器去把spring的上下文放到tomcat的上下文中
- 为了解决框架的配置文件冲突的问题,我们需要动态指定spring上下文的配置文件名称;
示例代码:
1. 编写SpringLoadListener 监听器
package com.ycxw.ioc.listener;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-16 10:25*/
@WebListener
public class SpringLoadListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {//加载spring核心配置文件(建模,这个spring的上下文对象),上下文对象中可以获取任何javabean对象ApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");//获取tomcat上下文ServletContext servletContext = sce.getServletContext();//把srping的上下文放入tomcat中servletContext.setAttribute("springContext",context);}
}
2. 编写servlet测试
package com.ycxw.ioc.web;import com.ycxw.ioc.service.UserService;
import org.springframework.context.ApplicationContext;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-16 10:29*/
@WebServlet("/userList")
public class UserServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//当处理用户请求的时候,获取spring的上下文对象ApplicationContext springContext = (ApplicationContext ) req.getServletContext().getAttribute("springContext");//拿到userService的BeanUserService userAction = (UserService) springContext.getBean("userService");System.out.println(userAction);userAction.edit();}
}
3. 用户处理结果后打印输出
3.5 总结
Spring框架提供了三种主要的依赖注入方式:构造函数注入、Setter方法注入和字段注入。构造函数注入通过构造函数来注入依赖对象,Setter方法注入通过setter方法来注入依赖对象,字段注入通过直接注入字段来实现依赖注入。这些注入方式可以单独使用,也可以结合使用,具体选择可以根据实际需求和个人偏好来决定。
相关文章:

Spring 框架入门介绍及IoC的三种注入方式
目录 一、Spring 简介 1. 简介 2. spring 的核心模块 ⭐ 二、IoC 的概念 2.1 IoC 详解 2.2 IoC的好处 2.3 谈谈你对IoC的理解 三、IoC的三种注入方式 3.1 构造方法注入 3.2 setter方法注入 3.3 接口注入(自动分配) 3.4 spring上下文与tomcat整…...
Centos升级openssl
依赖包 安装编译 OpenSSL 所需的包,包括 gcc、make、perl 和 zlib-devel。可以通过运行以下命令完成: yum install -y gcc make perl zlib-devel安装包下载 下载 OpenSSL 1.1.1 的源码包,可以从 OpenSSL 官网下载(https://www.op…...

第4章:决策树
停止 当前分支样本均为同一类时,变成该类的叶子节点。当前分支类型不同,但是已经没有可以用来分裂的属性时,变成类别样本更多的那个类别的叶子节点。当前分支为空时,变成父节点类别最多的类的叶子节点。 ID3 C4.5 Cart 过拟合 缺…...

小米平板6Max14即将发布:自研G1 电池管理芯片,支持33W反向快充
明天晚上7点(8 月 14 日),雷军将进行年度演讲,重点探讨“成长”主题。与此同时,小米将推出一系列全新产品,其中包括备受瞩目的小米MIX Fold 3折叠屏手机和小米平板6 Max 14。近期,小米官方一直在…...

Elasticsearch复合查询之Boosting Query
前言 ES 里面有 5 种复合查询,分别是: Boolean QueryBoosting QueryConstant Score QueryDisjunction Max QueryFunction Score Query Boolean Query在之前已经介绍过了,今天来看一下 Boosting Query 用法,其实也非常简单&…...

Clickhouse基于文件复制写入
背景 目前clickhouse社区对于数据的写入主要基于文件本地表、分布式表方式为主,但缺乏大批量快速写入场景下的数据写入方式,本文提供了一种基于clickhouse local 客户端工具分布式处理hdfs数据表文件,并将clickhouse以文件复制的方式完成写入…...

梅赛德斯-奔驰将成为首家集成ChatGPT的汽车制造商
ChatGPT的受欢迎程度毋庸置疑。OpenAI这个基于人工智能的工具,每天能够吸引无数用户使用,已成为当下很受欢迎的技术热点。因此,有许多公司都在想方设法利用ChatGPT来提高产品吸引力,卖点以及性能。在汽车领域,梅赛德斯…...
QT-播放原始PCM音频流
QT multimedia audioplay.h /************************************************************************* 接口描述:原始音频播放类 拟制: 接口版本:V1.0 时间:20220922 说明: ********************************…...
【杂谈】聊聊我是如何从Java转入Web3的
我先说说我基本的一个情况吧: 我是之前是一位从业了传统web2行业三年的Java开发,在2018年尾才开始去关注区块链的,之前虽然也有混迹在币圈,但是没怎么关注到币圈的内在运行逻辑。 后面因为当时元宇宙和Web3的概念特别火&a…...

ArrayList
目录 1.ArrayList简介 2.ArrayList的构造 2.1ArrayList() 2.2ArrayList(Collection c) 2.3ArrayList(int initialCapacity) 3.ArrayList常见操作 4.ArrayList的遍历的遍历 1.ArrayList简介 在集合框架中, ArrayList 是一个普通的类,实现了 List…...
不重启Docker能添加自签SSL证书镜像仓库吗?
应用背景 在企业应用Docker规划初期配置非安全镜像仓库时,有时会遗漏一些仓库没配置,但此时应用程序已经在Docker平台上部署起来了,体量越大就越不会让人去直接重启Docker。 那么,不重启Docker能添加自签SSL证书镜像仓库吗&…...

Ajax介绍
1.与服务器进行数据交换:通过 Ajax 可以给服务器发送请求,并获取服务器响应的数据。 2.异步交互:可以在 不重新加载整个页面 的情况下,与服务器交换数据并 更新部分网页 的技术,如: 搜索联想、用户名是否可…...
docker 学习--02 常用命令
docker 学习–02 常用命令 docker 学习-- 01 基础知识 docker 学习-- 03 环境安装(win10) 文章目录 docker 学习--02 常用命令1. 帮助启动类命令1.1启动docker1.2 停止docker1.3 重启docker1.4 查看docker1.5 设置开机自启1.6 查看docker概要信息1.7 查…...
socks5 保障网络安全与爬虫需求的完美融合
Socks5代理:跨足网络安全和爬虫领域的全能选手 Socks5代理作为一种通用的网络协议,为多种应用场景提供了强大的代理能力。它不仅支持TCP和UDP的数据传输,还具备更高级的安全特性,如用户身份验证和加密通信。在网络安全中…...

构建智能医疗未来:人工智能在线上问诊系统开发中的应用
随着人工智能技术的飞速发展,医疗领域也正在逐步迎来一场革命性的变革。其中,人工智能在在线上问诊系统开发中的应用,正为医疗产业带来全新的可能性。本文将深入探讨如何利用代码构建智能医疗未来,以提升线上问诊系统的效率、准确…...

css3-grid:grid 布局 / 基础使用
一、理解 grid 二、理解 css grid 布局 CSS Grid布局是一个二维的布局系统,它允许我们通过定义网格和网格中每个元素的位置和尺寸来进行页面布局。CSS Grid是一个非常强大的布局系统,它不仅可以用于构建网格布局,还可以用于定位元素…...

如何在windows电脑安装多个tomcat服务器和乱码问题
前提条件安装jdk 以17版本为例,将jdk8卸载干净 1.首先进入tomcat官网下载 tomcat网址 这里下载tomcat10为例子 1.1 这里选择方式一 下载解压版 2.解压后拷贝三份 分别命名为 8081、 8082、 8083 3.分别对每个tomcat执行以下操作 3.1 找到tomcat所在webapps文…...

flutter:webview_flutter的简单使用
前言 最近在研究如何在应用程序中嵌入Web视图,发现有两个库不错。 一个是官方维护、一个是第三方维护。因为没说特别的需求,就使用了官方库,实现一些简单功能是完全ok的 基本使用 官方文档 https://pub-web.flutter-io.cn/packages/webv…...

Ansys Zemax | 手机镜头设计 - 第 1 部分:光学设计
本文是 3 篇系列文章的一部分,该系列文章将讨论智能手机镜头模组设计的挑战,从概念、设计到制造和结构变形的分析。本文是三部分系列的第一部分,将专注于OpticStudio中镜头模组的设计、分析和可制造性评估。(联系我们获取文章附件…...
jvm从入门到精通
jvm 1.jvm与java体系结构...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...