Spring容器结构

文章目录

    • 1.基本介绍
        • 1.Spring5官网
        • 2.API文档
        • 3.Spring核心学习内容
        • 4.几个重要概念
    • 2.快速入门
        • 1.需求分析
        • 2.入门案例
          • 1.新建Java项目
          • 2.导入jar包
          • 3.编写Monster.java
          • 4.src下编写Spring配置文件
            • 1.创建spring配置文件,名字随意,但是需要放在src下
            • 2.创建Spring face
            • 3.创建Application Context
            • 4.编写内容
          • 5.测试SpringBeanTest
        • 3.类加载路径
          • 1.代码输出类加载路径
          • 2.结果
          • 3.解释
    • 3.Spring容器结构剖析
        • 1.beanFactory
        • 2.beanFactory内的beanDefinitionMap字段
        • 3.beanFactory内的singletonObjects字段
        • 4.beanFactory内的beanDefinitionNames字段
        • 5.练习:得到beans.xml中的所有bean对象的id
        • 6.小结
    • 4.实现简单Spring基于xml配置程序
        • 1.需求分析
        • 2.思路分析
        • 3.具体实现
          • 1.引入dom4j的jar包
          • 2.代码实例
            • 1.SxsApplicationContext.java
            • 2.SxsApplicationContextTest.java
            • 3.结果
    • 5.课后练习
        • 1.练习一
          • 1.问题答案
            • 不会报错,系统默认分配id
          • 2.代码
        • 2.练习二
          • 1.src/beans.xml
          • 2.Car.java
          • 3.SpringBeanTest.java
          • 4.结果

1.基本介绍

1.Spring5官网

官网

2.API文档

image-20240216093600443

3.Spring核心学习内容

image-20240216093833815

image-20240216093844324

4.几个重要概念

image-20240216095816092

image-20240216095712479

2.快速入门

1.需求分析

image-20240216100016865

2.入门案例
1.新建Java项目

image-20240216100355167

2.导入jar包

image-20240216100710831

3.编写Monster.java
package com.sxs.spring.bean;/*** Entity* @author 孙显圣* @version 1.0*/
public class Monster {private Integer monsterId;private String name;private String skill;//无参构造器,一定要给,底层是反射创建对象public Monster() {}public Monster(Integer monsterId, String name, String skill) {this.monsterId = monsterId;this.name = name;this.skill = skill;}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 + '\'' +'}';}
}
4.src下编写Spring配置文件
1.创建spring配置文件,名字随意,但是需要放在src下

image-20240216101154858

2.创建Spring face

image-20240216101309077

3.创建Application Context

image-20240216101345496

image-20240216101359718

4.编写内容
<?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"><!--1.配置monster对象2.在beans中可以配置多个bean3.bean表示就是一个java对象4.class属性用于指定类的路径->spring底层使用反射创建5.id属性表示该java对象在spring容器中的id,通过id来获取对象6.<property name="monsterId" value="100"/>用于给该对象的属性赋值--><bean class="com.sxs.spring.bean.Monster" id="monster01"><property name="monsterId" value="100"/><property name="name" value="牛魔王"/><property name="skill" value="芭蕉扇"/></bean>
</beans>
5.测试SpringBeanTest
package com.sxs.spring.test;import com.sxs.spring.bean.Monster;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @author 孙显圣* @version 1.0*/
public class SpringBeanTest {@Testpublic void getMonster() {//创建容器ApplicationContext,该容器是对应于一个xml配置文件ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");//第一种获取bean对象的方式//1.直接获取配置文件中的bean对象,不指定泛型Object monster01 = ioc.getBean("monster01");//2.这是一个Object类型的方法,指向一个monster类型的对象,所以需要向下转型Monster monster = (Monster) monster01;//3.输出信息System.out.println(monster);//第二种获取bean对象的方式//1.获取配置文件中的bean对象,指定泛型,则这个方法就是泛型类型的Monster monster011 = ioc.getBean("monster01", Monster.class);//2.输出信息System.out.println(monster011);}
}

image-20240216104249911

3.类加载路径
1.代码输出类加载路径
    //验证类加载路径@Testpublic void classPath() {//输出类加载路径System.out.println(this.getClass().getResource("/").getPath());//所以new ClassPathXmlApplicationContext("beans.xml");//相当于获取/D:/Intelij_IDEA_Project/spring/spring/out/production/spring/下的beans.xml}
2.结果

image-20240216105139346

3.解释

可以看出,读取的实际是spring下面的文件,对应于项目中的src下,可以理解为在项目中src/就是类加载路径

image-20240216105213459

3.Spring容器结构剖析

1.beanFactory

image-20240216135854116

2.beanFactory内的beanDefinitionMap字段

image-20240216140143563

image-20240216140617119

image-20240216141901228

3.beanFactory内的singletonObjects字段

image-20240216142036670

image-20240216142116406

4.beanFactory内的beanDefinitionNames字段

image-20240216142954682

5.练习:得到beans.xml中的所有bean对象的id
    //获取beans.xml中所有对象的id@Testpublic void getAllId() {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");String[] beanDefinitionNames = ioc.getBeanDefinitionNames();for (String beanDefinitionName : beanDefinitionNames) {System.out.println(beanDefinitionName);}}

image-20240216144231937

6.小结
  1. 根据xml文件创建一个对象
  2. 里面有三个字段
    1. 一个存储xml中的bean对象信息
    2. 一个存储单例bean对象
    3. 一个存储xml中所有bean对象id
  3. 根据xml文件获取容器的执行流程
    1. 读取配置文件
    2. 反射创建bean对象
    3. 把bean对象放到容器的字段中

4.实现简单Spring基于xml配置程序

1.需求分析

image-20240216144607489

2.思路分析

image-20240216145058346

3.具体实现
1.引入dom4j的jar包
2.代码实例
1.SxsApplicationContext.java
package com.sxs.spring.sxsapplicationcontext;import com.sxs.spring.bean.Monster;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** 实现ApplicationContext的简单机制** @author 孙显圣* @version 1.0*/
public class SxsApplicationContext {//存储单例对象的字段private ConcurrentHashMap<String, Object> singletonObjects = new ConcurrentHashMap<>();//构造器,用于读取xml文件,默认在src下public SxsApplicationContext(String iocBeanXmlFileName) throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException {//获取类路径String path = this.getClass().getResource("/").getPath();//dom4j读取文件SAXReader saxReader = new SAXReader();Document read = saxReader.read(new File(path + iocBeanXmlFileName));Element rootElement = read.getRootElement();//获取二级元素的第一个Element bean = (Element) rootElement.elements("bean").get(0);//获取属性信息String classAllPath = bean.attributeValue("class");String id = bean.attributeValue("id");//获取元素信息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");//反射创建对象Monster对象Class<?> aClass = Class.forName(classAllPath);Monster o = (Monster) aClass.newInstance();//为属性赋值o.setMonsterId(monsterId);o.setName(name);o.setSkill(skill);//放到单例对象中singletonObjects.put(id, o);}//提供一个getBean方法,获取id对应的bean对象public <T> T getBean(String id, Class<T> aClass) {for (Map.Entry<String, Object> stringObjectEntry : singletonObjects.entrySet()) {if (stringObjectEntry.getKey().equals(id)) {//返回T类型的bean对象return (T) stringObjectEntry.getValue();}}return null;}}
2.SxsApplicationContextTest.java
package com.sxs.spring.sxsapplicationcontext;import com.sxs.spring.bean.Monster;
import org.dom4j.DocumentException;/*** @author 孙显圣* @version 1.0*/
public class SxsApplicationContextTest {public static void main(String[] args) throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException {SxsApplicationContext sxsApplicationContext = new SxsApplicationContext("beans.xml");//获取bean对象Monster monster01 = sxsApplicationContext.getBean("monster01", Monster.class);System.out.println(monster01);}
}
3.结果

image-20240216154035256

5.课后练习

1.练习一

image-20240216155213519

image-20240216155202399

1.问题答案
不会报错,系统默认分配id

image-20240216162313190

image-20240216160453153

2.代码
    //得到系统默认分配的id并且得到bean对象@Testpublic void getDefaultIdToFindBean() {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");//获取所有bean对象String[] beanDefinitionNames = ioc.getBeanDefinitionNames();for (String beanDefinitionName : beanDefinitionNames) {System.out.println(ioc.getBean(beanDefinitionName));}}

image-20240216162750025

2.练习二

image-20240216162844830

1.src/beans.xml
    <bean class="com.sxs.spring.bean.Car" id="car"><property name="name" value="奔驰"/><property name="id" value="100"/><property name="price" value="10.2"/></bean>
2.Car.java
package com.sxs.spring.bean;/*** @author 孙显圣* @version 1.0*/
public class Car {private Integer id;private String name;private Double price;public Car() {}public Car(Integer id, String name, Double price) {this.id = id;this.name = name;this.price = price;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}@Overridepublic String toString() {return "Car{" +"id=" + id +", name='" + name + '\'' +", price=" + price +'}';}
}
3.SpringBeanTest.java
    //得到car对象@Testpublic void getCarObject() {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");Car car = ioc.getBean("car", Car.class);System.out.println(car);}
4.结果

image-20240216164553986

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言-指针

1. 指针是什么 指针理解的2个要点&#xff1a; 1.1. 指针是内存中一个最小单元的编号&#xff0c;也就是地址 1.2 平时口语中说的指针&#xff0c;通常指的是指针变量&#xff0c;是用来存放内存地址的变量 总结&#xff1a;指针就是地址&#xff0c;口…

电力系统卫星授时信号安全隔离装置防护方案

电力系统是国家关键基础设施&#xff0c; 电力安全关系国计民生&#xff0c; 是国家安全的重要保障&#xff0c; 与政治安全、经济安全、 网络安全、社会安全等诸多领域密切关联。电网运行情况瞬息万变&#xff0c;为了在其发生事故时能够及时得到处理&#xff0c;需要统一的时…

2.6 类型安全配置属性

无论是Propertes配置还是YAML配置&#xff0c;最终都会被加载到Spring Environment中。 Spring提供了注解Value以及EnvironmentAware接口来将Spring Environment 中的数据注入到属性上&#xff0c;SpringBoot对此进一步提出了类型安全配置属性(Type-safeConfiguration Propert…

【华为笔试题汇总】2024-04-17-华为春招笔试题-三语言题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是KK爱Coding &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f…

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第五套

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第五套 (共9套&#xff0c;有答案和解析&#xff0c;答案非官方&#xff0c;仅供参考&#xff09;&#xff08;共九套&#xff0c;每套四十个选择题&#xff09; 部分题目分享&#xff0c;完整版获取&#xff08;WX:didadida…

OSPF的P2P和Broadcast

OSPF为什么会有P2P和BROADCAST两种类型 OSPF&#xff08;开放最短路径优先&#xff09;协议中存在P2P&#xff08;点对点&#xff09;和BROADCAST&#xff08;广播多路访问&#xff09;两种网络类型&#xff0c;主要是为了适应不同类型的网络环境和需求。具体分析如下&#xf…

ETL工具-nifi干货系列 第十三讲 nifi处理器QueryDatabaseTable查询表数据实战教程

1、处理器QueryDatabaseTable&#xff0c;该组件生成一个 SQL 查询&#xff0c;或者使用用户提供的语句&#xff0c;并执行它以获取所有在指定的最大值列中值大于先前所见最大值的行。查询结果将被转换为 Avro 格式&#xff0c;如下图所示&#xff1a; 本示例通过QueryDatabase…

初识SpringMVC(SpringMVC学习笔记一)

1 、还是熟悉的配方&#xff0c;先创建一个父Maven项目&#xff08;忘记怎么创建项目了就去前面翻笔记&#xff09;&#xff0c;导入通用的配置依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…

【Vue3】setup语法糖的使用

文章目录 setup简介使用vite-plugin-vue-setup-extend插件 指定组件名字 setup简介 <script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖 相比较普通的<script> ,它有以下优势&#xff1a; 更少的样板内容&#xff0c;更简洁的代码。能够使用纯…

一种多信号线粒体靶向荧光探针,用于同时区分生物硫醇并实时可视化其在癌细胞和肿瘤模型中的代谢

文献来源:https://www.sciencedirect.com/science/article/pii/S003991402300855X? 该探针应用&#xff1a; 用于区分生物硫醇&#xff0c;并依次检验代谢物 。 实时监测细胞、斑马鱼和肿瘤中的生物硫醇代谢。 一、背景介绍 生物硫醇 &#xff08;1&#xff09;种类 生…

基于springboot实现人口老龄化社区服务与管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现人口老龄化社区服务与管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了人口老龄化社区服务与管理平台的开发全过程。通过分析人口老龄化社区服务与管理平台方面的不足&#xff…

Node.js 中的 RSA 加密、解密、签名与验证详解

引言 在现代的网络通信中&#xff0c;数据安全显得尤为重要。RSA加密算法因其非对称的特性&#xff0c;广泛应用于数据的加密、解密、签名和验证等安全领域。本文将详细介绍RSA算法的基本原理&#xff0c;并结合Node.js环境&#xff0c;展示如何使用内置的crypto模块和第三方库…

Python接口自动化 —— Web接口(2)

1.2.3 HTTP HTTP概念 Hyper Text Transfer Protocal超文本传输协议&#xff0c;基于tcp/ip通信协议来传递数据&#xff0c;属于应用层协议主要特点: 无连接: 每次连接只处理一个请求&#xff0c;服务器处理完请求并受到客户端应答后就断开连接媒体独立。 只要服务器和客…

ActiveMQ 07 集群配置

Active MQ 07 集群配置 官方文档 http://activemq.apache.org/clustering 主备集群 http://activemq.apache.org/masterslave.html Master Slave TypeRequirementsProsConsShared File System Master SlaveA shared file system such as a SANRun as many slaves as requ…

【日常记录】【CSS】SASS循环的使用

文章目录 1、引言2、安装3、举例4、参考链接 1、引言 目前在任何项目框架中&#xff0c;都会有css 预处理器&#xff0c;目前一般使用 sass、less 这俩其中之一&#xff0c;它可以简化css的书写 Sass 是一款强化 CSS 的辅助工具&#xff0c;它在 CSS 语法的基础上增加了变量 (v…

HarmonyOS开发实例:【分布式数据服务】

介绍 分布式数据服务(Distributed Data Service&#xff0c;DDS)为应用程序提供不同设备间数据分布式的能力。通过调用分布式数据接口&#xff0c;应用程序将数据保存到分布式数据库中。通过结合帐号、应用和分布式数据服务对属于不同的应用的数据进行隔离&#xff0c;保证不同…

【kubeEdge】离线部署

部署 kubeEdge 在线部署 在线方式部署直接执行以下命令&#xff0c;会联网下载需要的安装文件执行安装 $ keadm init --advertise-address{ip} --kubeedge-version{version} --kube-config{config_path}&#xff0c; 离线部署 离线准备工作 所有下载操作均在可以联网的机…

VulnHub系列 DC-4靶机 渗透详细过程 | 红队打靶

VulnHub系列 DC-4靶机详细渗透测试过程 目录 VulnHub系列 DC-4靶机详细渗透测试过程一、将靶机导入到虚拟机当中二、渗透流程主机发现端口扫描Web渗透暴力破解命令执行反弹shellSSH暴力破解提权 一、将靶机导入到虚拟机当中 靶机地址&#xff1a; https://download.vulnhub.c…

JVM复习

冯诺依曼模型与计算机处理数据过程相关联&#xff1a; 冯诺依曼模型&#xff1a; 输入/输出设备存储器输出设备运算器控制器处理过程&#xff1a; 提取阶段&#xff1a;输入设备传入原始数据&#xff0c;存储到存储器解码阶段&#xff1a;由CPU的指令集架构ISA将数值解…

【leetcode面试经典150题】34.有效的数独(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…