Spring | Spring框架最基本核心的jar包、Spring的入门程序、依赖注入
目录:
- 1.Spring框架最基本、最核心的jar包
- 2.Spring的入门程序
- 3.依赖注入
- 3.1 依赖注入的概念
- 3.2 依赖注入的实现方式
1.Spring框架最基本、最核心的jar包
Spring是一个轻量级框架,Spring最基本、最核心的的jar包括 : beans、context、core、expression。
- spring-core.jar : 这个jar包 包含spring框架基本的核心工具类,这是其他组件的基本核心。
- spring-beans.jar : 这个jar包是所有应用都能用到的,它包含了访问配置文件、 创建和管理Bean (BeanFactory)、进行IOC/DI操作相关的类。
(BeanFactory能添加和管理bean,其底层是通过IOC :控制反转(Inversion of Control,IoC)的方式来管理bean。IOC是一种设计思想,它将传统的程序中的对象依赖关系由直接依赖改为间接依赖,实现了程序中各个模块的解耦,降低了模块间的耦合度,提高了代码的可维护性和可复用性。
ps :
BeanFactory是属于旧方式的管理Bean的方式,开发中一般使用ApplicationContext方式来替代BeanFactory来管理bean。)- spring-context.jar : 这个jar包功能是建立在 core和beans 的基础上实现的,他在基础的IOC功能上提供扩展服务,此外还提供许多企业级服务的支持,有邮件服务、任务调度、JNDI定位,EJB集成、远程访问、缓存以及多种视图层框架的支持。
ps :
spring-context.jar 中的 ApplicationContext 能替代 BeanFactory 的添加和管理Bean,开发中更常用。ApplicationContext管理bean底层也是IOC。- spring-expression.jar : 主要用于在Spring应用中表达和解析表达式。该功能在Spring 3.0中引入。
2.Spring的入门程序
第一步、在DIEA中创建一个Java项目,添加web功能模块。
第二步、在项目WEB-INF目录中创建lib文件夹,存放Spring框架最基本核心的jar包,让jar包生效。
获取spring框架基本核心jar包第三步、创建UserDao接口 和 UserDaoImpl实现类
UserDao.java (接口)public interface UserDao {public void say();}UserDaoImpl.java (实现类)
public class UserDaoImpl implements UserDao{ //实现类//重写实现类中的方法@Overridepublic void say() {System.out.println("UserDaoImpl say hello World !");} }第四步、创建ApplicationContext.xml,其中添加和配置bean的信息 ( 用ApplicationContext的方式来在IOC容器中添加和管理bean)
<?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"><!-- 将UserDaoImpl这个类交给Spring容器管理,即Beans管理,让其创建对象的实例 --><!-- 通过创建 ApplicationContext的方式来添加和管理Bean --><bean id="userDaoImpl" class="com.myh.ioc.UserDaoImpl"/> </beans>第五步、创建ApplicationContext获得bean,创建测试类使用bean。
public class TestIoC {public static void main(String[] args) {//1.初始化spring容器,加载配置文件ApplicationContext applicationContext =new ClassPathXmlApplicationContext("ApplicationContext.xml");//2.通过容器获得userDaoImpl实例UserDaoImpl userDaoImpl = (UserDaoImpl)applicationContext.getBean("userDaoImpl");//3.调用实例职工的say()方法userDaoImpl.say();} }
3.依赖注入
3.1 依赖注入的概念
依赖注入( Dependency Injection, 简称DI) 与 控制反转 (loC) 的含义相同,只不过这两个称呼是从两个角度描述的同一个概念 ( 不同角度下描述的同一概念 )。
当某个Java对象 (调用者) 需要调用另一个Java对象( 被调用者,即被依赖对象)时。在 传统模式 下,调用者通常会采用 “new被调用者” 的代码方式来创建对象,如下图所示。这种方式会导致调用者 与 被调用者之间的 耦合性增加,不利于后期项目的升级和维护。
在使用Spring 框架之后,对象的实例不再由调用者来创建,而是由Spring 容器来创建。
Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移到了Spring容器,控制权发生了反转,这就是Spring的 控制反转 ( IOC )。从Spring容器的角度来看,Spring 容器负责将被依赖对象赋值给调用者的成员变量,这相当于为
调用者注入了它依赖的实例,这就是Spring的 依赖注入 ( DI) ,如下图所示。
ps :
控制主导权有“调用者” 转变为 “spring容器”,控制权发生转变,叫“控制反转” ( IOC ),控制反转的实际操作是 : “依赖注入” ( DI )。
3.2 依赖注入的实现方式
依赖注入的作用就是在使用Spring 框架创建对象时,动态右地将其所依赖的对象注入Bean组件中,其实现方式通常有两种,一种是属性 setter方法注入,另一种是 构造方法注入,具体介绍如下。
属性setter方法注入 : (最为常用)
指Spring容器使用setter方法注入被依赖的实例(对象)。通过调用无参构造器或无参静态工厂方法实例化Bean后,调用该Bean的setter方法,即可实现基于setter方法的依赖注入。构造方法注入 :
指Spring容器使用构造方法注入被依赖的实例。基于构造方法的依赖注入通过调用带参数的构造方法来实现,每个参数代表着一个依赖。属性setter方法注入的例子:
UserService.java
public interface UserDao {public void say();}UserServiceImpl.java
public class UserServiceImpl implements UserService{//声明UserDao属性 (被调用者实例)private UserDao userDao; // "userDao"为 Bean实例中相应的 “属性名”//添加UserDao属性的setter方法,用于依赖注入public void setUserDao(UserDao userDao){this.userDao = userDao;}//实现接口中的方法@Overridepublic void say() {//调用userDao中的say()方法this.userDao.say();System.out.println("userServiceImpl say hello World!");} }ApplicationContext.xml (其中添加以下代码)
<?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"><!-- 将UserDaoImpl这个类交给Spring容器管理,即Beans管理,让其创建对象的实例 --><!-- 通过创建 ApplicationContext的方式来添加和管理Bean --><bean id="userDaoImpl" class="com.myh.ioc.UserDaoImpl"/><!-- 在IOC容器中创建一个id为“userServiceImpl“的Bean,该Bean用于实例化 UserServiceImpl类的信息 --><bean id="userServiceImpl" class="com.myh.ioc.UserServiceImpl"><!-- 将id为"userDao"的Bean实例注入到 userService实例中 --><!-- name : 表示Bean实例中相应的 “属性名”ref : 用于指定其属性值--><property name="userDao" ref="userDaoImpl"/><!-- property标签用于调用Bean实例中的 setUserDao() 方法完成属性赋值 --></bean></beans>TestDI.java (测试类)
public class TestDI {public static void main(String[] args) {//1.初始化spring容器,加载配置文件ApplicationContext applicationContext =new ClassPathXmlApplicationContext("ApplicationContext.xml");//2.通过容器获取UserService实例UserServiceImpl userServiceImpl = (UserServiceImpl) applicationContext.getBean("userServiceImpl"); //getBean()中参数为配置bean对应的id名//3.调用实例中的say()方法userServiceImpl.say();} }以上为Spring容器 属性setter注入 的方式,也是实际开发中最为常用的一种方式。
相关文章:
Spring | Spring框架最基本核心的jar包、Spring的入门程序、依赖注入
目录: 1.Spring框架最基本、最核心的jar包2.Spring的入门程序3.依赖注入3.1 依赖注入的概念3.2 依赖注入的实现方式 1.Spring框架最基本、最核心的jar包 Spring是一个轻量级框架,Spring最基本、最核心的的jar包括 : beans、context、core、expression。 …...
[晓理紫]每日论文推送(有中文摘要,源码或项目地址)--大模型相关、扩散模型、视觉导航
专属领域论文订阅 VX关注{晓理紫|小李子},每日更新论文,如感兴趣,请转发给有需要的同学,谢谢支持 分类: 大语言模型LLM视觉模型VLM扩散模型视觉导航具身智能,机器人强化学习开放词汇,检测分割 LLM 标题:…...
【软件项目管理_软件工程】软件项目管理课后相关习题
(1)需求分析是回答系统必须(A)的问题。 A.做什么 B.怎么做 C.何时做 D.为谁做(2)WBS非常重要,下列哪项不是其很重要的原因(D)。 A.帮助组织工作 B.防止遗漏工作 C.为项目估算提供…...
Docker-Compose:教你入门到精通
引言 在当今的软件开发和运维领域,容器技术已经成为了一种非常重要的技术。而Docker-Compose作为Docker的重要工具之一,可以帮助我们轻松地管理和运行容器化的应用程序。本文将详细介绍Docker-Compose的入门到精通知识,帮助你更好地掌握这项技…...
软件设计不是CRUD(10):低耦合模块设计理论——业务抽象:从需求中提取业务维度
接上文《软件设计不是CRUD(9):低耦合模块设计理论——设计落地所面临的挑战》 2、什么是业务抽象 业务抽象是一种将需求落地成模块功能的设计思想,是对业务需求和技术设计进行转换、隔离的一种分析方法。经过业务抽象后的业务模块一般具有较高的业务屈服度,能更大程度满…...
S1-08 流和消息缓冲区
流缓冲区 流缓冲区一般用在不同设备或者不同进程间的通讯,为了提高数据处理效率和性能,设置的一定大小的缓冲区,流缓冲区可以用来存储程序中需要处理的数据、对象、报文等信息,使程序对可以对这些信息进行预处理、排序、过滤、拆…...
Java重修第五天—面向对象3
通过学习本篇文章可以掌握如下知识 1、多态; 2、抽象类; 3、接口。 之前已经学过了继承,static等基础知识,这篇文章我们就开始深入了解面向对象多态、抽象类和接口的学习。 多态 多态是在继承/实现情况下的一种现象…...
【征稿进行时|见刊、检索快速稳定】2024年经济发展与旅游管理国际学术会议(ICEDTM 2024)
【征稿进行时|见刊、检索快速稳定】2024年经济发展与旅游管理国际学术会议(ICEDTM 2024) 2024 International Conference Economic Development and Tourism Management(ICEDTM 2024) 一、【会议简介】 ICEDTM 2024将围绕"旅游管理”“经济发展”的最新研究领域ÿ…...
瑞_Java开发手册_(四)安全规约
🙊前言:本文章为瑞_系列专栏之《Java开发手册》的安全规约篇。由于博主是从阿里的《Java开发手册》学习到Java的编程规约,所以本系列专栏主要以这本书进行讲解和拓展,有需要的小伙伴可以点击链接下载。本文仅供大家交流、学习及研…...
Docker 安全必知:最佳实践、漏洞管理与监控策略
容器安全是实施和管理像 Docker 这样的容器技术的关键方面。它包括一组实践、工具和技术,旨在保护容器化应用程序及其运行的基础架构。在本节中,我们将讨论一些关键的容器安全考虑因素、最佳实践和建议。 容器隔离 隔离对于确保容器化环境的强大性和安全…...
【Flutter】多线程
Flutter 作为一个跨平台的UI库,前面的Flutter 架构有涉及到,Flutter 架构中的运行的多个线程。那么最为一个Flutter开发者,我们如何创建线程呢 多线程 上述我们提及到了,架构层涉及的多线程问题。比如说 主线程, 平台线程&#x…...
STM32-实时时钟RTC-1
...
node(express.js创建项目)+连接mysql数据库
1.node npm的安装 2.express的安装 全局安装:npm install express -gnpm install -g express-generator// ps: 4.0版本把generator分离出来了,需要单独安装3.创建express项目 express 项目名称 cd 项目名称 npm install npm start4.项目中安装数据库 npm install…...
【FLV】记录 H.264的解析
参考 FLV 文件格式分析 知乎大神的FLV文件格式分析。 FLV 首先下发9个字节的FLV 头 -2024-01-08 11:38:29.698 INFO [32196] [evplayer_client_main@153] player clinet run … 2024-01-08 11:38:29.702 INFO [2276] [evplayer_client_main::<lambda_1>::operator ()@14…...
nodejs+vue+ElementUi音乐分享社交网站77l8j
本文介绍的系统主要分为两个部分:一是前台界面:用户通过注册登录可以实现音乐播放、新闻浏览、留言评论等功能;另一个是后台界面:音乐网站管理员对用户信息进行管理,上传更新音乐资源,发布最新音乐资讯等功…...
进销存+小程序商城:实现批发零售企业的互联网转型与管理升级
在当今互联网高速发展的时代,越来越多的批发零售企业开始开始考虑转型。在这个行业中,企业要想取得更好的发展,就要积极地拥抱互联网。专属的订货商城小程序是企业转型的第一步。通过将进销存与订货商城一体化,企业可以更好地满足…...
Tomcat解压打包文件和并部署
一、文件压缩和上传解压 1.本地打包好dist.tar.gz文件 2.通过xftp拖拽上传到知道文件夹下,或者通过命令: cp dist.tar.gz /path/to/destination/folder注:将dist.tar.gz复制到 /path/to/destination/folder文件夹下,该文件夹只是举个例子怎么复制和解压! 3.进入/path/…...
JDK17
JDK 17是Java开发工具包(Java Development Kit)的一个版本。JDK是用于开发和运行Java应用程序的软件包,它包含了编译器、调试器、运行时环境和其他一些实用工具。JDK 17是Java的最新版本,它提供了许多新的功能、增强和改进。 使用…...
使用Docker运行SRS Stack
SRS Stack | SRS (ossrs.net) Docker 推荐使用Docker运行SRS Stack: docker run --restart always -d -it --name srs-stack -v $HOME/data:/data \-p 2022:2022 -p 2443:2443 -p 1935:1935 -p 8000:8000/udp -p 10080:10080/udp \registry.cn-hangzhou.aliyun…...
git安装教程 Windows 附安装包链接
Git是一款分布式源代码管理工具(版本控制工具) 。 git的作用 当你需要做一个大工程的时候,文件的管理无疑是非常庞大的工作,因为你需要不断的修改更新文件内容,同时可能还要保留旧版本保证可以复原,这样就需要备份多个版本的文件…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

