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

    @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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python景区票务人脸识别系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Zabbix监控内容

目录 一、自定义监控内容 1、在客户端创建自定义key 1.1明确需要执行的linux命令 1.2创建zabbix监控项配置文件&#xff0c;用于自定义Key 1.3服务端验证测试 2、在Web界面创建自定义监控模板 2.1创建模板 2.2创建应用集&#xff08;用于管理监控项&#xff09; 2.3创建…

探索音质与价格的平衡点:iBasso DX260播放器体验

专业的音乐播放器作为音乐爱好者们追求高音质体验的重要工具&#xff0c;但是因为市面上这类产品价格差距往往很大&#xff0c;选择也是非常丰富&#xff0c;所以对于新手来说往往会难以抉择。而且今天的音乐播放器在高端和低端市场也是有着云泥之别&#xff0c;想要找一款在价…

PCB---Design Entry cis 绘图 导出

修改纸张大小&#xff1a; 画图前准备&#xff1a;导入 画图&#xff1a; 习惯&#xff1a; 电源朝上 地朝下 配置pbc_footprint编号&#xff1a; 都配置好编号就可以导出了 导出&#xff1a;

SGI_STL空间配置器源码剖析(五)_S_chunk_alloc函数、oom和优点

_S_chunk_alloc函数是操作自由链表分配小内存、内存不够时还会调用开辟内存函数&#xff0c;个人认为是空间配置器源码中最精华的一个函数&#xff0c;其思想真是精辟&#xff01; _S_chunk_alloc代码及解析如下&#xff1a; /* We allocate memory in large chunks in order…

腾讯云优惠券介绍及领取教程详解

腾讯云是腾讯集团倾力打造的云计算品牌&#xff0c;提供全球领先的云计算、大数据、人工智能等技术产品与服务&#xff0c;以卓越的科技能力打造丰富的行业解决方案&#xff0c;构建开放共赢的云端生态&#xff0c;推动产业互联网建设&#xff0c;助力各行各业实现数字化升级。…

深入理解JVM中的G1垃圾收集器原理、过程和参数配置

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;垃圾收集&#xff08;GC&#xff09;是一个自动管理内存的过程&#xff…

信息系统项目管理师0053:设计和实施(4信息系统管理—4.1管理方法—4.1.3设计和实施)

点击查看专栏目录 文章目录 4.1.3设计和实施1.设计方法2.架构模式4.1.3设计和实施 开展信息系统设计和实施,首先需要将业务需求转换为信息系统架构,信息系统架构为将组织业务战略转换为信息系统的计划提供了蓝图。信息系统是支持组织中信息流动和处理的所有基础,包括硬件、软…

消息中间件Kafka分布式数据处理平台

目录 一.Kafka基本介绍 1.定义 2.特点 &#xff08;1&#xff09;高吞吐量、低延迟 &#xff08;2&#xff09;可扩展性 &#xff08;3&#xff09;持久性、可靠性 &#xff08;4&#xff09;容错性 &#xff08;5&#xff09;高并发 3.系统架构 &#xff08;1&#…

向量数据库与图数据库:理解它们的区别

作者&#xff1a;Elastic Platform Team 大数据管理不仅仅是尽可能存储更多的数据。它关乎能够识别有意义的见解、发现隐藏的模式&#xff0c;并做出明智的决策。这种对高级分析的追求一直是数据建模和存储解决方案创新的驱动力&#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采…

手机拍照技术

拍照技巧 说明: 本文将主要介绍摄影和手机常见技巧&#xff1b; 1. 摄影的基本知识 **说明&#xff1a;**关于摄影&#xff0c;手机和相机的原理都是相同的&#xff0c;不同的是相机在很多方面优于手机&#xff0c;但是专业的设备对于我们这种的非专业的人来说&#xff0c;刚…

OpenCV从入门到精通实战(二)——文档OCR识别(tesseract)

导入环境 导入必要的库 numpy: 用于处理数值计算。 argparse: 用于处理命令行参数。 cv2: OpenCV库&#xff0c;用于图像处理。 import numpy as np import argparse import cv2设置命令行参数 ap argparse.ArgumentParser() ap.add_argument("-i", "--imag…

如何获取手机root权限?

获取手机的 root 权限通常是指在 Android 设备上获取超级用户权限&#xff0c;这样用户就可以访问和修改系统文件、安装定制的 ROM、管理应用权限等。然而&#xff0c;需要注意的是&#xff0c;获取 root 权限可能会导致手机失去保修、安全性降低以及使系统变得不稳定。在获取 …

CSS3 新特性 box-shadow 阴影效果、圆角border-radius

圆角 使用CSS3 border-radius属性&#xff0c;你可以给任何元素制作"圆角"&#xff0c;border-radius属性&#xff0c;可以使用以下规则&#xff1a; &#xff08;1&#xff09;四个值&#xff1a;第一个值为左上角&#xff0c;第二个值为右上角&#xff0c;第三个值…

EelasticSearch的docker安装-----》es客户端使用!!!

1.Docker安装 docker run -d --name es7 -e ES_JAVA_POTS"-Xms256m -Xmx256m" -e "discovery.typesingle-node" -v /opt/es7/data/:/usr/share/elasticsearch/data -p 9200:9200 -p 9300:9300 elasticsearch:7.14.02.客户端UI工具&#xff0c;Edge浏览器…

她在《繁花》大放异彩,“浪姐”暴瘦15斤,打脸了不看好她的观众

不知不觉&#xff0c;《浪姐》已经迎来第5季了。播到第4季的时候&#xff0c;改名成《乘风破浪2023》&#xff0c;这一季叫《乘风2024》&#xff0c;和前几季相比&#xff0c;热度依然不减。 都说3个女人一台戏&#xff0c;更何况这个节目&#xff0c;每次能请到30位姐姐&…

基于 LSTM 模型的古诗词自动生成算法实现及系统实现

近年来&#xff0c;研究者在利用循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;进行古诗自动生成方面取得了显著的效果。但 RNN 存在梯度问题&#xff0c;导致处理时间跨度较长的序列时 RNN 并不具备长期记忆存储功能。随后&#xff0c;出现的基…

基于Java的新闻发布及管理系统的设计与实现(内附设计LW + PPT+ 源码下载)

Java新闻发布及管理系统的设计与实现 项目名称&#xff1a; Java新闻发布及管理系统的设计与实现 项目技术栈 该项目采用了以下核心技术栈&#xff1a; 后端框架/库&#xff1a; JSP (Java Server Pages)数据库&#xff1a; MySQL前端技术&#xff1a; B/S体系结构开发工具…

selenum操作cookie进行免登陆【爬虫必修课1】

Selenium 操作 Cookie 进行免登录 使用 Selenium 自动化登录网站是一个常见的需求。但是直接输入用户名和密码登录非常不安全,同时每次登录都需要重复这个操作也很麻烦。一个更好的方式是使用 Cookie 进行免登录。 这篇博客就来介绍如何使用 Selenium 实现 Instagram 的免登录…