Spring框架学习笔记(一):Spring基本介绍(包含IOC容器底层结构)

1 官方资料 

1.1 官网

https://spring.io/

1.2 进入 Spring5

下拉 projects, 进入 Spring Framework

进入 Spring5 github

1.3 在maven项目中导入依赖

<dependencies><!--加入spring开发的基本包--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.8</version></dependency><!--加入spring开发切面编程需要的包--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.3.8</version></dependency>
</dependencies>

 1.4 官方文档

在线文档 : https://docs.spring.io/spring-framework/docs/current/reference/html/
线: spring-framework-5.3.8\docs\reference\html\index.html
线API:spring-framework-5.3.8/docs/javadoc-api/index.html

Spring核心内容

上图说明:

(1)Spring 核心学习内容 IOC AOP, jdbcTemplate, 声明式事务
(2)IOC: 控制反转 , 可以管理 java 对象
(3)AOP : 切面编程
(4)JDBCTemplate : spring 提供一套访问数据库的技术
(5) 声明式事务 : 基于 ioc/aop 实现事务管理
(6)IOC, AOP 是重点和难点

3 Spring的几个重要概念

(1)Spring 可以整合其他的框架(Spring 是管理框架的框架)

(2)Spring 有两个核心的概念: IOC AOP

(3)IOC(Inversion Of Control 反转控制)

  • 传统的开发模式[JdbcUtils / 反射]

程序------>环境(程序读取环境配置,然后自己创建对象.)

解读:程序员编写程序, 在程序中读取配置信息;创建对象, new 或者 反射方式;使用对象完成任务

  • IOC 的开发模式 [EmpAction EmpService EmpDao Emp] 

程序<-----容器(容器创建好对象,程序直接使用.)

解读: 

1 Spring 根据配置文件 xml/ 注解 创建对象, 并放入到容器 (ConcurrentHashMap) , 并且可以完成对象之间的依赖
2 、当需要使用某个对象实例的时候 , 就直接从容器中获取即可
3 、程序员可以更加关注如何使用对象完成相应的业务
4. DI—Dependency Injection 依赖注入,可以理解成是 IOC 的另外叫法 .
5. Spring 最大的价值,通过配置,给程序提供需要使用的
web [Servlet (Action/Controller) ]/Service/Dao/[JavaBean/entity] 对象 ,
这个是核心价值所在,也是 ioc 的具体体现 , 实现解耦.

4 Spring快速入门

4.1 需求说明

通过 Spring 的方式( 配置文件) ,获取 JavaBean: Monster 的对象,并给该对象属性赋值,输出该对象信息.

4.2 实现步骤

(1)创建一个maven项目,在pom.xml文件中导入以下依赖

<dependencies><!--加入spring开发的基本包--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.8</version></dependency><!--加入spring开发切面编程需要的包--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.3.8</version></dependency>
</dependencies>

(2) 创建 Moster 的javabean/entity,无参构造器一定要写

public class Monster {private Integer monsterId;private String name;private String skill;//全参构造器public Monster(Integer monsterId, String name, String skill) {this.monsterId = monsterId;this.name = name;this.skill = skill;}//无参构造器一定要写,Spring反射创建对象时,需要使用public Monster() {}public Integer getMonsterId() {return monsterId;}public void setMonsterId(Integer monsterId) {this.monsterId = monsterId;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSkill() {return skill;}public void setSkill(String skill) {this.skill = skill;}@Overridepublic String toString() {return "Monster{" +"monsterId=" + monsterId +", name='" + name + '\'' +", skill='" + skill + '\'' +'}';}
}

(3) 新建一个容器配置文件:鼠标右键目录名 --> new --> XML Configuration --> Spring Config,然后给配置文件取个名字,这里取beans(对于Maven项目XML文件通常在 src/main/resources 目录)

点击 创建 Spring facet ,然后点击确定

 

 (4)在xml文件中配置Moster对象,在beans标签加入以下配置

 注意:将class属性值修改为指定类的全路径

<!--1. 配置monster对象/javabean2. 在beans中可以配置多个bean3. 一个bean表示就是一个java对象4. class属性是用于指定类的全路径->spring底层使用反射创建5. id属性表示该java对象在spring容器中的id, 通过id可以获取到对象6. <property name="monsterId" value="100"> 用于给该对象的属性赋值
-->
<bean class="com.spring.bean.Monster" id="monster01"><property name="monsterId" value="100"/><property name="name" value="牛魔王"/><property name="skill" value="芭蕉扇"/>
</bean><bean class="com.spring.bean.Monster" id="monster02"><property name="monsterId" value="1001"/><property name="name" value="牛魔王~"/><property name="skill" value="芭蕉扇~"/>
</bean>

(5)新建一个测试类来获取容器中的对象

public class SpringBeanTest {@Testpublic void getMonster(){//1. 创建容器 ApplicationContext//2. 该容器和容器配置文件关联ApplicationContext ioc =new ClassPathXmlApplicationContext("beans.xml");//3. 通过getBean获取对应的对象//   默认返回的是Object , 但是运行类型Monster//Object monster01 = ioc.getBean("monster01");Monster monster01 = (Monster) ioc.getBean("monster01");//4. 输出System.out.println("monster01=" + monster01 + " 运行类型=" + monster01.getClass());System.out.println("monster01=" + monster01 + "属性name=" + monster01.getName() +" monserid=" + monster01.getMonsterId());//5. 也可以在获取的时候,直接指定Class类型, 可以再次获取Monster monster011 = ioc.getBean("monster01", Monster.class);System.out.println("monster011=" + monster011);System.out.println("monster011.name=" + monster011.getName());//6. 查看容器注入了哪些bean对象,会输出bean的idSystem.out.println("================================");String[] beanDefinitionNames = ioc.getBeanDefinitionNames();for (String beanDefinitionName : beanDefinitionNames) {System.out.println("beanDefinitionName=" + beanDefinitionName);}System.out.println("================================");System.out.println("ok~~~");}
}

运行结果:

4.3 注意事项

(1)该代码为什么读取到beans.xml文件

ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");

该代码通过类路径加载配置文件,可通过以下方式输出类加载路径

File f = new File(this.getClass().getResource("/").getPath());
System.out.println(f);

maven项目的类加载路径是:target\classes

(2)debug 看看 spring 容器结构/机制

 

(3) 当调用getBean(),方法获取对象时,会去beanDefinitionMap中去查找,如果发生该bean是单例的,就会返回 singletonobject 中初始化好了的对象,如果不是,就会动态的通过反射机制返回一个临时创建的对象

 5 实现简单的基于XML配置的Spring

5.1 需求说明

(1)自己写一个简单的 Spring 容器, 通过读取 beans.xml,获取第 1 个 JavaBean: Monster 的
对象,并给该的对象属性赋值,放入到容器中, 输出该对象信息
(2)也就是说,不使用 Spring 原生框架,我们自己简单模拟实现

5.2 思路分析

(1)使用xml的解析技术-Dom4j
(2)读取beans.xml
(3)解析得到monster对象的id,classpath,属性
(4)使用反射,创建对象
(5)放入到ioc容器(hashmap)
(6)提供一个getBean方法

5.3 实现步骤

(1)在maven项目中添加dom4j依赖

第一种方式:如果导入低版本(1.6.1),需要如下两个依赖

<dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version>
</dependency>
<dependency><groupId>jaxen</groupId><artifactId>jaxen</artifactId><version>1.1.1</version>
</dependency>

第二种方式:如果导入高版本(2.0.0),需要如下一个依赖

<dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.0.0</version>
</dependency>

(2)实现容器类 WwjApplicationContext,java

注意:项目系统目录不能有中文,或者会找不到XML文件

package com.spring.wwjApplicationContext;import com.spring.bean.Monster;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.io.File;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;/*** 1. 这个程序用于实现Spring的一个简单容器机制* 2. 这里实现如何将beans.xml文件进行解析,并生成对象,放入容器中* 3. 提供一个方法 getBean(id) 返回对应的对象*/
public class WwjApplicationContext {private ConcurrentHashMap<String, Object> singletonObjects =new ConcurrentHashMap<>();//构造器//接收一个容器的配置文件 比如 beans.xml, 该文件默认在resourcespublic WwjApplicationContext(String iocBeanXmlFile) throws Exception {//1. 得到类加载路径
//        String path = this.getClass().getClassLoader().getPath();String path = this.getClass().getResource("/").getPath();//2. 创建 SaxreaderSAXReader saxReader = new SAXReader();//3. 得到Document对象Document document =saxReader.read(new File(path + iocBeanXmlFile));//4. 得到rootDocumentElement rootElement = document.getRootElement();//5. 得到第一个bean-monster01Element bean = (Element) rootElement.elements("bean").get(0);//6. 获取到第一个bean-monster01的相关属性String id = bean.attributeValue("id");String classFullPath = bean.attributeValue("class");List<Element> property = bean.elements("property");//遍历Integer monsterId =Integer.parseInt(property.get(0).attributeValue("value"));String name = property.get(1).attributeValue("value");String skill = property.get(2).attributeValue("value");//7. 使用反射创建对象.=> 回顾反射机制Class<?> aClass = Class.forName(classFullPath);//这里o对象就是Monster对象Monster o = (Monster) aClass.newInstance();//给o对象赋值o.setMonsterId(monsterId);o.setName(name);o.setSkill(skill);//8. 将创建好的对象放入到singletonObjectssingletonObjects.put(id, o);}public Object getBean(String id) {return singletonObjects.get(id);}
}

(3)创建main类测试

package com.spring;import com.spring.bean.Monster;
import com.spring.wwjApplicationContext.WwjApplicationContext;public class AppMain {public static void main(String[] args) throws Exception {WwjApplicationContext ioc = new WwjApplicationContext("beans.xml");Monster monster01 = (Monster)ioc.getBean("monster01");System.out.println("monster01 = " + monster01);}
}

运行结果:

Spring 原生容器底层结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3029242.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

多址通信方式的抗噪声性能和系统容量对比

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

手撕C语言题典——移除链表元素(单链表)

目录 前言 一.思路 1&#xff09;遍历原链表&#xff0c;找到值为 val 的节点并释放 2&#xff09;创建新链表 二.代码实现 1)大胆去try一下思路 2&#xff09;竟然报错了&#xff1f;&#xff01; 3&#xff09;完善之后的成品代码 搭配食用更佳哦~~ 数据结构之单…

mysql集群NDBcluster引擎在写入数据时报错 (1114, “The table ‘ads‘ is full“)

问题描述&#xff1a;mysql集群在写入数据时&#xff0c;出现上述报错 问题原因&#xff1a;表数据已满&#xff0c;一般是在集群的管理节点设置里面datamemory的值太小&#xff0c;当数据量超过该值时就会出现该问题 解决方案&#xff1a; 修改集群管理节点的config.ini里面…

DS:顺序表、单链表的相关OJ题训练(2)

欢迎各位来到 Harper.Lee 的学习世界&#xff01; 博主主页传送门&#xff1a;Harper.Lee的博客主页 想要一起进步的uu欢迎来后台找我哦&#xff01; 一、力扣--141. 环形链表 题目描述&#xff1a;给你一个链表的头节点 head &#xff0c;判断链表中是否有环。如果链表中有某个…

burp靶场xss漏洞(初级篇)

靶场地址 http://portswigger.net/web-security/all-labs#cross-site-scripting 第一关&#xff1a;反射型 1.发现搜索框直接注入payload <script>alert(111)</script> ​ 2.出现弹窗即说明攻击成功 ​ 第二关&#xff1a;存储型 1.需要在评论里插入payload …

TriCore: Architecture

说明 本文是 英飞凌 架构文档 TriCore TC162P core archiecture Volume 1 of 2 (infineon.com) 的笔记&#xff0c;稍作整理方便查阅&#xff0c;错误之处&#xff0c;还请指正&#xff0c;谢谢 :) 1. Architecture 2. General Purpose & System Register 名词列表&#…

【全部更新】2024数维杯B题详细成品文章代码思路结果分享

生物质和煤共热解问题的研究 摘要 这个问题背景主要涉及生物质和煤共热解的研究。在共热解过程中&#xff0c;生物质和煤一起在高温和缺氧条件下热解&#xff0c;产生气体、液体和固体产物。研究生物质和煤共热解油的产率和品质机理对提高能源利用效率、促进资源综合利用和确保…

【YOLO 系列】基于YOLO V8的金属表面缺陷检测检测识别系统【python源码+Pyqt5界面+数据集+训练代码】

前言&#xff1a; 金属表面缺陷的及时检测对于保障产品质量和生产安全至关重要。然而&#xff0c;传统的人工检测方法往往效率低下、耗时长&#xff0c;并且容易受主观因素影响。为了解决这一问题&#xff0c;我们提出了基于深度学习技术的金属表面缺陷检测系统。 本项目采用…

Windows下安装Node.js、npm和electronic,并运行一个Hello, World!脚本程序

20240510 By wdhuag 目录 简介&#xff1a; 参考&#xff1a; 安装Node.js 安装npm 配置npm&#xff1a; 修改包存放目录和缓存目录 切换镜像源 使用 nrm 切换镜像源 安装Electron 运行一个Hello, World!脚本程序 安装Yarn JavaScript 指南 简介&#xff1a; Nod…

pdffactory pro8.0虚拟打印机(附注册码)

PdfFactory pro是一款非常受欢迎的PDF虚拟打印机&#xff0c;可以帮助用户将你的其他文档保存为PDF格式。请为用户提供打印/发送/加密等多种实用功能&#xff0c;以及一套完善的PDF打印方案。 使用说明 下载pdfFactory Pro压缩包&#xff0c;解压后&#xff0c;双击exe文件&am…

好景盒式磁带随声听

少年时代柜子里翻出来的磁带录音机电路板 两颗芯片&#xff0c;FM芯片&#xff0c;电机驱动 CD9088CBD6650

力扣HOT100 - 739. 每日温度

解题思路&#xff1a; 单调栈 class Solution {public int[] dailyTemperatures(int[] temperatures) {int length temperatures.length;int[] ans new int[length];Deque<Integer> stack new LinkedList<>();for (int i 0; i < length; i) {int temperatu…

BW4HANA混合建模 用ADSO的哪个视图?

写日志的ADSO除了1,2,3表之外。还会有6,7,8view。8view是上了BW4HANA2.0之后激活ADSO就会生成的。如果旧版本没有8&#xff0c;那就RSDG_ADSO_ACTIVATE激活一下。 如果勾了外部HANA视图&#xff0c;那就等于说还有一个HANA view。 首先咱知道ADSO是BW里面用来物理存储&#xf…

十大排序算法之->希尔排序

一、希尔排序简介 希尔排序&#xff0c;也称为缩小增量排序&#xff0c;是由D.L. Shell于1959年提出的。它的核心思想是将整个待排序的记录序列分割成若干个子序列&#xff0c;这些子序列的元素是相隔一定“增量”的。然后对这些子序列分别进行直接插入排序。随着增量的逐步减…

基于flowable没有规则的并发网关流程跳转记录分析

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

从传统到现代:水表的远程抄表革命

1.引言&#xff1a;技术驱动的转型 在过去的几十年里&#xff0c;我们的生活方式被科技的快速发展深深影响&#xff0c;其中就包括了公用设施的管理方式。传统水表的远程抄表系统就是这样一个例子&#xff0c;它将老旧的手动抄表模式转变为高效、精确的自动化系统。 2.传统水…

JUC下的CompletableFuture详解

详细介绍 CompletableFuture是Java 8引入的一个实现Future接口的类&#xff0c;它代表一个异步计算的结果。与传统的Future相比&#xff0c;CompletableFuture提供了更丰富的功能&#xff0c;比如链式调用、组合异步操作、转换结果、异常处理等&#xff0c;极大地增强了Java在…

C语言:__attribute__((packed))

一、简介 在使用结构体的时候&#xff0c;经常要根据结构体的长度来进行相关判断。但是按照C语言的规则&#xff0c;会对不同类型的数据类型进行自动对齐。有时候就会造成一些问题&#xff0c;如果不需要使用自动对齐的功能&#xff0c;就需要使用到本章的关键字。 二、自动对…

ICode国际青少年编程竞赛- Python-4级训练场-while语句入门

ICode国际青少年编程竞赛- Python-4级训练场-while语句入门 1、 while Flyer.disappear():wait() Dev.step(2)2、 Dev.step(1) while Flyer.disappear():wait() Dev.step(5)3、 while Flyer[0].disappear():wait() Dev.step(3) Dev.step(-1) while Flyer[0].disappear():…

爬虫-无限debug场景 解决方式

解决无限debug 场景1 1. 鼠标右键 选择 continue to here&#xff08;此处不停留&#xff09;2. 鼠标右键 选择 edite breakpoint 设置 10 保证条件不成立 这行永远不执行3.方法置空 1. 方法调用加断点2. 控制台 setInterval function name() {}4. 替换文件 5. hoo…