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

Spring面试篇章——Spring基本概述

Spring 的基本概述

Spring学习的核心内容—一图胜千言

在这里插入图片描述

  • IOC:控制反转,可以管理 Java 对象
  • AOP:切面编程
  • JDBCTemplate:是Spring提供一套访问数据库的技术,应用性强,相对好理解
  • 声明式事务:基于IOC / AOP实现事务管理

Spring的几个重要概念

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

2、Spring有两个核心的概念:IOC和AOP

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

  • 传统的开发模式(JdbcUtils / 反射)

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

在这里插入图片描述

1、程序员编写程序,在程序中读取到配置信息

2、创建对象,new Object() // 反射方式

3、使用对象完成任务

  • IOC的开发模式

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

在这里插入图片描述

1、Spring 根据配置文件XML / 注解来创建对象,并放入到容器(ConcurrentHashMap)中,并且可以完成对象之间的依赖

2、当需要使用某个对象实例的时候,就直接从容器中获取即可

3、程序员可以更加关心如果使用对象完成相应的业务(以前是new => 注解 / 配置方式)

4、DI—Dependency Injection 依赖注入(是实现IOC的一种方法)

5、Spring最大的价值,通过配置给程序提供需要使用的web层[ Servlet(Action / Controller) ]/Service/Dao/[ JavaBean/Entity ]对象

  • 这个是核心价值所在,也是IOC的具体体现,实现解耦

在这里插入图片描述

Spring的快速入门

需求说明

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

在这里插入图片描述

完成步骤

  • 下载Spring的开发包:https://spring.io/projects/spring-framework#learn

在这里插入图片描述

代码实现

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:util="http://www.springframework.org/schema/util"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/utilhttps://www.springframework.org/schema/util/spring-util.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.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.zan.spring.bean.Monster" id="monster01"><!--    <bean class="com.zan.spring.bean.Monster">--><property name="monsterId" value="100"/><property name="name" value="牛魔王"/><property name="skill" value="芭蕉扇"/></bean></beans>
public class SpringBeanTest {@Testpublic void getMonster() {// 1. 创建容器 ApplicationContext// 2. 该容器和容器配置文件是相关联的 - 读取到的是out文件夹下的beans.xml文件ApplicationContext iocContext = new ClassPathXmlApplicationContext("beans.xml");// 3. 通过getBean获取对应的对象(传入ID)//    默认返回的是Object,但是运行类型是Monster
//        Object monster01 = iocContext.getBean("monster01");Monster monster01 = (Monster) iocContext.getBean("monster01");// 4. 输出System.out.println("monster01=" + monster01 + " 运行类型=" + monster01.getClass());System.out.println("monster01=" + monster01 + " 获取对应的属性name=" + monster01.getName());// 5. 也可以在获取的时候,直接指定Class类型,可以再次获取Monster monster011 = iocContext.getBean("monster01", Monster.class);System.out.println("monster011=" + monster011);System.out.println("monster011.name=" + monster011.getName());// 6. 查看容器注入了哪些bean对象,获取所有的beanNameString[] beanDefinitionNames = iocContext.getBeanDefinitionNames();for (String beanDefinitionName : beanDefinitionNames) {System.out.println(beanDefinitionName);}System.out.println("ok~~~");}// 验证类加载路径@Testpublic void classPath() {File file = new File(this.getClass().getResource("/").getPath());// 看到类的加载路径System.out.println("file = " + file);// file = D:\Code\Java\Learn\Spring\spring-review\out\production\spring-review}
}

Debug查看Spring容器结构/机制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

手动开发 - 简单的Spring基于XML配置的程序

需求说明

  • 自己写一个简单的Spring容器, 通过读取beans.xml,获取第1个JavaBean:Monster的 对象,并给该的对象属性赋值,放入到容器中, 输出该对象信息

在这里插入图片描述
在这里插入图片描述

  • 也就是不使用 Spring 的原生框架,我们自己简单模拟实现

需求分析

在这里插入图片描述

代码实现

1、导入 Dom4j.jar 包

2、编写ZanApplicationContext

public class ZanApplicationContext {private ConcurrentHashMap<String, Object> singletonObjects = new ConcurrentHashMap<>();// 构造器// 接受一个容器的配置文件,比如 beans.xmlpublic ZanApplicationContext(String iocBeanXmlPath) throws Exception {// 1. 得到类加载路径String path = this.getClass().getResource("/").getPath();// 2. 创建SAXReaderSAXReader saxReader = new SAXReader();// 3. 获取文档Document对象Document document = saxReader.read(new File(path + iocBeanXmlPath));// 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");// 遍历
//        for (Element element : property) {
//            String value = element.attributeValue("value");
//            System.out.println(value);
//        }// 这里简便获取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); // 获取对应的class对象// 这是的o对象就是一个Monster对象Monster o = (Monster) aClass.newInstance();// 给o对象赋值// 使用反射赋值
//        Method[] declaredMethods = aClass.getDeclaredMethods();
//        for (Method declaredMethod : declaredMethods) {
//            Object invoke = declaredMethod.invoke(o);
//
//        }o.setMonsterId(monsterId);o.setName(name);o.setSkill(skill);// 8. 将创建好的对象放入到singleObjects中singletonObjects.put(id, o);}public Object getBean(String id) {// 还可以严谨一下return singletonObjects.get(id);}
}
  • Test类
public class ZanApplicationContextTest {public static void main(String[] args) throws Exception {ZanApplicationContext zanApplicationContext = new ZanApplicationContext("beans.xml");Monster monster01 = (Monster) zanApplicationContext.getBean("monster01");System.out.println(monster01);}
}

在这里插入图片描述

Spring原生容器底层结构

在这里插入图片描述

补充:可以不进行分配ID,系统会默认分配ID,分配ID的规则为全类名#1,全类名#1 …

相关文章:

Spring面试篇章——Spring基本概述

Spring 的基本概述 Spring学习的核心内容—一图胜千言 IOC&#xff1a;控制反转&#xff0c;可以管理 Java 对象AOP&#xff1a;切面编程JDBCTemplate&#xff1a;是Spring提供一套访问数据库的技术&#xff0c;应用性强&#xff0c;相对好理解声明式事务&#xff1a;基于IOC …...

股票预测模型中注意力多层Attention RNN LSTM 的应用

全文链接&#xff1a;https://tecdat.cn/?p37152 原文出处&#xff1a;拓端数据部落公众号 Attention 机制是一种在神经网络处理序列数据时极为关键的技术&#xff0c;它赋予了模型“聚焦”能力&#xff0c;能够自动评估输入序列中各部分的重要性。通过为序列中的每个元素分…...

C语言 | Leetcode C语言题解之第313题超级丑数

题目&#xff1a; 题解&#xff1a; int nthSuperUglyNumber(int n, int* primes, int primesSize) {long dp[n 1];int pointers[primesSize];for (int i 0; i < primesSize; i) {pointers[i] 0;}long nums[primesSize];for (int i 0; i < primesSize; i) {nums[i] …...

PHP健身微信小程序系统源码

&#x1f3cb;️‍♀️健身新潮流&#xff01;解锁“健身微信小程序”的全方位塑形秘籍 &#x1f4f1;开篇&#xff1a;掌中健身房&#xff0c;随时随地动起来 你还在为找不到合适的健身场地或教练而烦恼吗&#xff1f;是时候告别这些束缚&#xff0c;拥抱“健身微信小程序”…...

树组件 el-tree 数据回显

树组件 el-tree 数据回显 树型结构的数据回显问题&#xff1a; 这里我只放了核心代码&#xff0c;主要是如何获取选中的树节点的id集合和如何根据树节点的id集合回显数据 大家根据需要自行更改&#xff01; <el-tree ref"authorityRef" node-key"id" …...

54、PHP 实现希尔排序

题目&#xff1a; PHP 实现希尔排序 描述&#xff1a; 思路分析&#xff1a;希尔排序是基于插入排序的&#xff0c;区别在于插入排序是相邻的一个个比较&#xff08;类似于希尔中h1的情形&#xff09;&#xff0c;而希尔排序是距离h的比较和替换。 希尔排序中一个常数因子n&a…...

linux 虚拟机解压arm-linux-gcc-4.6.4-arm-x86_64.tar.bz2并arm-linux-gcc

解压到当前目录&#xff1a;tar -jxvf arm-linux-gcc-4.6.4-arm-x86_64.tar.bz2解压到指定目录&#xff1a;tar -jxvf arm-linux-gcc-4.6.4-arm-x86_64.tar.bz2 -C /xx/xxx/xxx-C大写&#xff0c;后面接要解压的路径解压后得到一个 opt文件夹 在/usr/local/bin 下创建新的…...

泛化的最近点迭代法(Generalized-ICP)

Generalized-ICP算法是由斯坦福大学的Aleksandr V. Segal、Dirk Haehnel和Sebastian Thrun提出的&#xff0c;于2009年在Robotics science and system会议上发表。 GICP是一种ICP算法的变体&#xff0c;其原理与ICP算法相同&#xff0c;之所以称为泛化的ICP算法是因为大多数ICP…...

Java | Leetcode Java题解之第313题超级丑数

题目&#xff1a; 题解&#xff1a; class Solution {public int nthSuperUglyNumber(int n, int[] primes) {int[] dp new int[n 1];int m primes.length;int[] pointers new int[m];int[] nums new int[m];Arrays.fill(nums, 1);for (int i 1; i < n; i) {int minN…...

单细胞数据整合-去除批次效应harmony和CCA (学习)

目录 单细胞批次效应学习 定义 理解 常用的去批次方法-基于Seurat 1&#xff09; Seurat-integration&#xff08;CCA&#xff09; 2&#xff09; Seurat-harmony 去批次代码 ①Seurat-integration&#xff08;CCA&#xff09; ②Seurat-harmony 单细胞批次效应学习 …...

MuRF代码阅读

对图像Size的处理, 以适应Transformer 在MVSPlat 当中使用 Center_Crop 裁剪图像&#xff0c;适用于 Transformer 的32 倍数&#xff0c; 其中 焦距 f 不变化&#xff0c;只改变 cx,cy.MuRF 直接对图像进行 插值&#xff0c;合成理想的 size. 根据 ori_size 和 inference_size…...

pycharm无法导入pyside2模块;“ModuleNotFoundError: No module named ‘PySide2“

参考博客&#xff1a; 1&#xff09;pycharm中配置pyqt designer和pyside2【功能是在pycharm中可以打开designer,并且可以把.ui文件转换为.py文件】 https://blog.csdn.net/kuntliu/article/details/117219237 2&#xff09;.ui转化为.py后&#xff0c;点击运行&#xff0c;报错…...

c语言指针中“数组名的理解”以及“一维数组传参”的本质

数组名的理解 数组名就是数组首元素的地址。 例如&#xff1a;输入一个数组的所有元素&#xff0c;再打印出来。 另一种写法 以上可以看出&#xff1a;*arri&#xff09; arr[i] 也即是&#xff1a;*(iarr)i[arr] 本质上无区别 1&#xff1a;数组就是数组&#xff0c;是一块…...

计算机毕业设计Python+Flask微博舆情分析 微博情感分析 微博爬虫 微博大数据 舆情监控系统 大数据毕业设计 NLP文本分类 机器学习 深度学习 AI

基于Python/flask的微博舆情数据分析可视化系统 python爬虫数据分析可视化项目 编程语言&#xff1a;python 涉及技术&#xff1a;flask mysql echarts SnowNlP情感分析 文本分析 系统设计的功能&#xff1a; ①用户注册登录 ②微博数据描述性统计、热词统计、舆情统计 ③微博数…...

KubeBlocks v0.9 解读|最高可管理 10K 实例的 InstanceSet 是什么?

实例&#xff08;Instance&#xff09;是 KubeBlocks 中的基本单元&#xff0c;它由一个 Pod 和若干其它辅助对象组成。为了容易理解&#xff0c;你可以先把它简化为一个 Pod&#xff0c;下文中将统一使用实例这个名字。 InstanceSet 是一个通用 Workload API&#xff0c;负责…...

ZW3D二次开发_菜单_禁用/启用表单按钮

1.如图示&#xff0c;ZW3D可以禁用表单按钮&#xff08;按钮显示灰色&#xff09; 2.禁用系统默认表单按钮&#xff0c;可以在菜单空白处右击&#xff0c;点击自定义&#xff0c;找到相关按钮的名称&#xff0c;如下图。 然后使用代码&#xff1a; char name[] "!FtAllBo…...

windows子系统wsl完成本地化设置locale,LC_ALL

在 Windows 的子系统 Linux&#xff08;WSL&#xff09;环境中&#xff0c;解决本地化设置问题可以采取以下步骤&#xff1a; 1. **检查本地化设置**&#xff1a; 打开你的 WSL 终端&#xff08;比如 Ubuntu、Debian 等&#xff09;&#xff0c;运行以下命令来查看当前的本…...

MYSQL 根据条件order by 动态排序

文章目录 案例1&#xff1a;根据动态值的不同&#xff0c;决定某个字段是升序还是降序案例2&#xff1a;根据动态值的不同&#xff0c;决定使用哪个字段排序 最近在做大数据报表时&#xff0c;遇到这样一种情况&#xff0c;若是A类型&#xff0c;则部门按照正序排序&#xff1b…...

DirectX修复工具下载安装指南:电脑dll修复拿下!6种dll缺失修复方法!

在日常使用电脑的过程中&#xff0c;不少用户可能会遇到“DLL文件缺失”的错误提示&#xff0c;这类问题往往导致程序无法正常运行或系统出现不稳定现象。幸运的是&#xff0c;DirectX修复工具作为一款功能强大的系统维护软件&#xff0c;能够有效解决大多数DLL文件缺失问题&am…...

vue3(1)虚拟数字键盘的封装,(2)以及子组件改变父组件变量的值进而使子组件实时响应值的变化,(3)子组件调用父组件中的方法(带参)

父组件 <template><div><!-- 数字键盘 --><NumericKeyboardv-model:myDialogFormVisible"myDialogFormVisible" :myValueRange"myValueRange"submit"numericKeyboardSubmitData"/></div> </template><s…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...