当前位置: 首页 > news >正文

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包功能是建立在 corebeans 的基础上实现的,他在基础的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的入门程序、依赖注入

目录&#xff1a; 1.Spring框架最基本、最核心的jar包2.Spring的入门程序3.依赖注入3.1 依赖注入的概念3.2 依赖注入的实现方式 1.Spring框架最基本、最核心的jar包 Spring是一个轻量级框架&#xff0c;Spring最基本、最核心的的jar包括 : beans、context、core、expression。 …...

[晓理紫]每日论文推送(有中文摘要,源码或项目地址)--大模型相关、扩散模型、视觉导航

专属领域论文订阅 VX关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 分类: 大语言模型LLM视觉模型VLM扩散模型视觉导航具身智能&#xff0c;机器人强化学习开放词汇&#xff0c;检测分割 LLM 标题:…...

【软件项目管理_软件工程】软件项目管理课后相关习题

(1)需求分析是回答系统必须&#xff08;A&#xff09;的问题。 A.做什么 B.怎么做 C.何时做 D.为谁做(2)WBS非常重要&#xff0c;下列哪项不是其很重要的原因&#xff08;D&#xff09;。 A.帮助组织工作 B.防止遗漏工作 C.为项目估算提供…...

Docker-Compose:教你入门到精通

引言 在当今的软件开发和运维领域&#xff0c;容器技术已经成为了一种非常重要的技术。而Docker-Compose作为Docker的重要工具之一&#xff0c;可以帮助我们轻松地管理和运行容器化的应用程序。本文将详细介绍Docker-Compose的入门到精通知识&#xff0c;帮助你更好地掌握这项技…...

软件设计不是CRUD(10):低耦合模块设计理论——业务抽象:从需求中提取业务维度

接上文《软件设计不是CRUD(9):低耦合模块设计理论——设计落地所面临的挑战》 2、什么是业务抽象 业务抽象是一种将需求落地成模块功能的设计思想,是对业务需求和技术设计进行转换、隔离的一种分析方法。经过业务抽象后的业务模块一般具有较高的业务屈服度,能更大程度满…...

S1-08 流和消息缓冲区

流缓冲区 流缓冲区一般用在不同设备或者不同进程间的通讯&#xff0c;为了提高数据处理效率和性能&#xff0c;设置的一定大小的缓冲区&#xff0c;流缓冲区可以用来存储程序中需要处理的数据、对象、报文等信息&#xff0c;使程序对可以对这些信息进行预处理、排序、过滤、拆…...

Java重修第五天—面向对象3

通过学习本篇文章可以掌握如下知识 1、多态&#xff1b; 2、抽象类&#xff1b; 3、接口。 之前已经学过了继承&#xff0c;static等基础知识&#xff0c;这篇文章我们就开始深入了解面向对象多态、抽象类和接口的学习。 多态 多态是在继承/实现情况下的一种现象&#xf…...

【征稿进行时|见刊、检索快速稳定】2024年经济发展与旅游管理国际学术会议(ICEDTM 2024)

【征稿进行时|见刊、检索快速稳定】2024年经济发展与旅游管理国际学术会议(ICEDTM 2024) 2024 International Conference Economic Development and Tourism Management(ICEDTM 2024) 一、【会议简介】 ICEDTM 2024将围绕"旅游管理”“经济发展”的最新研究领域&#xff…...

瑞_Java开发手册_(四)安全规约

&#x1f64a;前言&#xff1a;本文章为瑞_系列专栏之《Java开发手册》的安全规约篇。由于博主是从阿里的《Java开发手册》学习到Java的编程规约&#xff0c;所以本系列专栏主要以这本书进行讲解和拓展&#xff0c;有需要的小伙伴可以点击链接下载。本文仅供大家交流、学习及研…...

Docker 安全必知:最佳实践、漏洞管理与监控策略

容器安全是实施和管理像 Docker 这样的容器技术的关键方面。它包括一组实践、工具和技术&#xff0c;旨在保护容器化应用程序及其运行的基础架构。在本节中&#xff0c;我们将讨论一些关键的容器安全考虑因素、最佳实践和建议。 容器隔离 隔离对于确保容器化环境的强大性和安全…...

【Flutter】多线程

Flutter 作为一个跨平台的UI库&#xff0c;前面的Flutter 架构有涉及到&#xff0c;Flutter 架构中的运行的多个线程。那么最为一个Flutter开发者&#xff0c;我们如何创建线程呢 多线程 上述我们提及到了&#xff0c;架构层涉及的多线程问题。比如说 主线程, 平台线程&#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分离出来了&#xff0c;需要单独安装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

本文介绍的系统主要分为两个部分&#xff1a;一是前台界面&#xff1a;用户通过注册登录可以实现音乐播放、新闻浏览、留言评论等功能&#xff1b;另一个是后台界面&#xff1a;音乐网站管理员对用户信息进行管理&#xff0c;上传更新音乐资源&#xff0c;发布最新音乐资讯等功…...

进销存+小程序商城:实现批发零售企业的互联网转型与管理升级

在当今互联网高速发展的时代&#xff0c;越来越多的批发零售企业开始开始考虑转型。在这个行业中&#xff0c;企业要想取得更好的发展&#xff0c;就要积极地拥抱互联网。专属的订货商城小程序是企业转型的第一步。通过将进销存与订货商城一体化&#xff0c;企业可以更好地满足…...

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开发工具包&#xff08;Java Development Kit&#xff09;的一个版本。JDK是用于开发和运行Java应用程序的软件包&#xff0c;它包含了编译器、调试器、运行时环境和其他一些实用工具。JDK 17是Java的最新版本&#xff0c;它提供了许多新的功能、增强和改进。 使用…...

使用Docker运行SRS Stack

SRS Stack | SRS (ossrs.net) Docker​ 推荐使用Docker运行SRS Stack&#xff1a; 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的作用 当你需要做一个大工程的时候&#xff0c;文件的管理无疑是非常庞大的工作&#xff0c;因为你需要不断的修改更新文件内容&#xff0c;同时可能还要保留旧版本保证可以复原&#xff0c;这样就需要备份多个版本的文件…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...