Spring容器结构

news2024/10/5 16:25:08

文章目录

    • 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;
    }

    @Override
    public 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中可以配置多个bean
    3.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 {
    @Test
    public 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.代码输出类加载路径
    //验证类加载路径
    @Test
    public 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
    @Test
    public 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对象
    @Test
    public 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;
    }

    @Override
    public String toString() {
        return "Car{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

3.SpringBeanTest.java
    //得到car对象
    @Test
    public void getCarObject() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
        Car car = ioc.getBean("car", Car.class);
        System.out.println(car);
    }
4.结果

image-20240216164553986

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

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

相关文章

蓝桥杯(基础题)

试题 C: 好数 时间限制 : 1.0s 内存限制: 256.0MB 本题总分&#xff1a;10 分 【问题描述】 一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位 &#xff09;上 的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位 &…

张大哥笔记:电脑周边的10大刚需创业小项目

hello&#xff0c;大家好&#xff0c;我是张大哥&#xff0c;今天一口气给大家分享围绕电脑周边的10大刚需创业小项目&#xff0c;本文章旨在帮助大家如何快速切入到细分领域里面搞钱&#xff01; 如何赚钱&#xff0c;无非就是解决人群痛点&#xff0c;你要懂得根据用户痛点去…

知识跟踪模型GraphKT

1 知识跟踪Knowledge Tracing的概念 知识跟踪可以用来解决自适应学习问题。如何通过与教学材料的在线互动来有效地跟踪学生的学习进展&#xff1f;知识跟踪可用于量化学生的知识状态&#xff0c;即对教材所涉及的技能掌握水平。用于评估和模拟学生随着时间推移对技能的认知掌握…

双指针的引入和深入思考(持续更新中)

目录 1.引入双指针 2.使用场景 3.例题引入 1.引入双指针 当我们需要维护某个区间性质的或者是求满足某些性质的区间的长度时&#xff0c;对于一个区间是由左右端点的&#xff0c;我们有简单的枚举左右端点的O()的时间的做法&#xff0c;当时在大多数题目中是不可行的&#…

4核8G配置服务器多少钱?2024年阿里云服务器700元1年价格便宜

4核8G配置服务器多少钱&#xff1f;2024年阿里云服务器700元1年价格便宜。阿里云4核8G服务器租用优惠价格700元1年&#xff0c;配置为ECS通用算力型u1实例&#xff08;ecs.u1-c1m2.xlarge&#xff09;4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选&#xff0c;CPU采…

Java设计模式——代理模式

静态代理&#xff1a; Java静态代理是设计模式中的一种&#xff0c;它通过创建一个代理类来代替原始类&#xff0c;从而提供额外的功能或控制原始类的访问。 如何使用Java静态代理 要创建一个静态代理&#xff0c;你需要有一个接口&#xff0c;一个实现该接口的目标类&#…

Python pyglet制作彩色圆圈“连连看”游戏

原文链接&#xff1a; Python 一步一步教你用pyglet制作“彩色方块连连看”游戏(续)-CSDN博客文章浏览阅读1.6k次&#xff0c;点赞75次&#xff0c;收藏55次。上期讲到相同的色块连接&#xff0c;链接见&#xff1a; Python 一步一步教你用pyglet制作“彩色方块连连看”游戏-…

Java中的容器

Java中的容器主要包括以下几类&#xff1a; Collection接口及其子接口/实现类&#xff1a; List 接口及其实现类&#xff1a; ArrayList&#xff1a;基于动态数组实现的列表&#xff0c;支持随机访问&#xff0c;插入和删除元素可能导致大量元素移动。LinkedList&#xff1a;基…

【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题

文章目录 一、什么是时间复杂度和空间复杂度&#xff1f;1.1 算法效率1.2 时间复杂度的概念1.3 空间复杂度的概念1.4 复杂度计算在算法中的意义 二、时间复杂度的计算2.1 大O渐进表示法2.2 常见时间复杂度计算举例 三、空间复杂度的计算四、Leetcode刷题1. 消失的数2. 旋转数组…

对接实例:致远OA对接金蝶云星空场景解决方案

正文&#xff1a;很多企业在数字化建设得时候&#xff0c;对内部系统间的高效协同与数据流转提出了更高要求。金蝶云星空作为行业领先的ERP解决方案&#xff0c;与专业协同办公平台致远OA的深度对接&#xff0c;在人员管理、组织架构、采购与销售合同、费用审批等在内的全方位企…

javaWeb项目-网上图书商城系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Java技术 Java语…

Flask框架初探-如何在本机发布一个web服务并通过requests访问自己发布的服务-简易入门版

Flask框架初探 在接触到网络框架之前我其实一直对一个事情有疑惑&#xff0c;跨语言的API在需要传参的情况下究竟应该如何调用&#xff0c;之前做过的项目里&#xff0c;我用python做了一个代码使用一个算法得到一个结果之后我应该怎么给到做前端的同学或者同事&#xff0c;之前…

2024腾讯一道笔试题--大小写字母移动

题目&#x1f357; 有一个字符数组,其中只有大写字母和小写字母,将小写字母移到前面, 大写字符移到后面,保持小写字母本身的顺序不变,大写字母本身的顺序不变, 注意,不要分配新的数组.(如:wCelOlME,变为wellCOME). 思路分析&#x1f357; 类似于冒泡排序&#xff0c;两两比较…

JavaSE中的String类

1.定义方式 常见的三种字符串构造 public class Test1 {public static void main(String[] args) {// 使用常量串构造String str1 "abc";System.out.println(str1);// 直接newString对象String str2 new String("ABC");System.out.println(str2);// 使用…

ssm056基于Java语言校园快递代取系统的设计与实现+jsp

校园快递代取系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园快递代取系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短…

node基础 第二篇

01 ffmpeg开源跨平台多媒体处理工具&#xff0c;处理音视频&#xff0c;剪辑&#xff0c;合并&#xff0c;转码等 FFmpeg 的主要功能和特性:1.格式转换:FFmpeg 可以将一个媒体文件从一种格式转换为另一种格式&#xff0c;支持几乎所有常见的音频和视频格式&#xff0c;包括 MP…

工业控制(ICS)---OMRON

OMRON FINS 欧姆龙厂商 命令代码(Command CODE)特别多&#xff0c;主要关注读写相关&#xff0c;如&#xff1a; Memory Area Read (0x0101) Memory Area Write (0x0102) Multiple Memory Area Read (0x0104) Memory Area Transfer (0x0105) Parameter Area Read (0x0201) Pa…

ARM_day8:温湿度数据采集应用

1、IIC通信过程 主机发送起始信号、主机发送8位(7位从机地址1位传送方向(0W&#xff0c;1R))、从机应答、发数据、应答、数据传输完&#xff0c;主机发送停止信号 2、起始信号和终止信号 SCL时钟线&#xff0c;SDA数据线 SCL高电平&#xff0c;SDA由高到低——起始信号 SC…

Linux时间同步练习

题目如下&#xff1a; 一.配置server主机要求如下&#xff1a; 1.server主机的主机名称为 ntp_server.example.com 2.server主机的IP为&#xff1a; 172.25.254.100 3.server主机的时间为1984-11-11 11&#xff1a;11&#xff1a;11 4.配置server主机的时间同步服务要求可以被所…

突破数据存储瓶颈!转转业财系统亿级数据存储优化实践

1.背景 1.1 现状 目前转转业财系统接收了上游各个业务系统&#xff08;例如&#xff1a;订单、oms、支付、售后等系统&#xff09;的数据&#xff0c;并将其转换为财务数据&#xff0c;最终输出财务相关报表和指标数据&#xff0c;帮助公司有效地进行财务管理和决策。 转转业…