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 …

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

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

相关文章

docker compse简介与安装

目录 1. Docker Compose 简介 2. Docker Compose 安装 2.1 在 Ubuntu 上安装 Docker Compose 2.1.1 通过 apt 安装 2.1.2 使用官方脚本安装最新版本 2.2 在 CentOS 上安装 Docker Compose 2.2.2 使用官方脚本安装最新版本 2.2.3 使用 pip 安装 2.3 在 openEuler 上安装…

Python面试宝典第25题:括号生成

题目 数字n代表生成括号的对数&#xff0c;请设计一个函数&#xff0c;用于能够生成所有可能的并且有效的括号组合。 备注&#xff1a;1 < n < 8。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())()"…

【ArcGIS+CityEngine】自行制作Lod1城市大尺度白膜数据

数据准备 50多个城市建筑矢量数据 链接&#xff1a;https://pan.baidu.com/s/1FiwTfXDwQ6tMDRACAwUZwQ 提取码&#xff1a;DYSK 数据分析 数据属性Floor&#xff0c;为建筑物楼层信息&#xff0c;据此信息下面将在CityEngine软件生成Lod1白膜数据。 软件准备 CityEngi…

创建了Vue项目,需要导入什么插件以及怎么导入

如果你不知道怎么创建Vue项目,建议可以看一看这篇文章 怎么安装Vue的环境和搭建Vue的项目-CSDN博客 1.在idea中打开目标文件 2.系在一个插件Vue.js 3.下载ELement UI 在Terminal中输入 # 切换到项目根目录 cd vueadmin-vue # 或者直接在idea中执行下面命令 # 安装element-u…

[GYCTF2020]Blacklist1

打开题目 判断注入类型&#xff0c;输入1试试 输入2 输入1 判断为字符型注入 堆叠查询2;show databases;# 然后来输入2; show tables;#来查看数据库的表 然后我们通过FlagHere表来查看列输入2;show columns from FlagHere;# 来查看列 、 重新构造payload&#xff1a;0;HAND…

基于FPGA的高精度多通道同步AD采集系统开发及数字信号处理算法应用,基于FPGA的多通道同步AD采集系统开发及数字信号处理算法实现

FPGA多通道同步AD采集 AD7606 8通道16位高精度同步采集系统开发&#xff0c;采样率200KSPS&#xff0c;采集数据支持DDR3缓存、串口发送、USB2.0上传、千兆以太网上传等。 支持基于FPGA的数字信号处理算法开发 ID:77500703611886617 塞纳河山 FPGA多通道同步AD采集是一项基于…

官宣!新增博士硕士点审核结果已出!附查询方法

2024年7月31日&#xff0c;新增博士硕士学位授权结果正式公示&#xff01; 多所高校&#xff0c;新增博士和硕士学位授权点 大家可前往该网站查询&#xff1a;https://zjpy.cdgdc.edu.cn/sqshjggb 另外说明一下&#xff0c;这些学校不一定今年就开展招生工作 一切以学校的官…

9.Redis的Set类型

Redis的Set结构与java中的HashSet类似。 可以看做是一个value为null的HashMap。 特点 1.无序 2.元素不可重复 3.查找快 4.支持交集、并集、差集等功能 应用场景 实现共同关注&#xff0c;共同好友。 常见命令 sadd key 元素1 元素2 给set集合添加一个或多个元素 smem…

Kimi+AiPPT的正确打开方式!文档一键转换PPT!限时免费!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工具测评,AI效率提升,AI行业洞察。关注我,AI之路不迷路,2024我们一起变强。 我之前…

做管理,一定要避开这6个坑,才能成就优秀管理者

做管理&#xff0c;一定要避开这6个坑&#xff0c;才能成就优秀管理者 一、被平庸的员工绑架 要是领导不敢或者不愿意惩罚或者开除那些没完成任务的员工&#xff0c;那优秀的员工就会觉得&#xff0c;做得好做得差都一样&#xff0c;那谁还愿意努力呢&#xff1f; 二、总想改变…

基于双PI控制器结构的六步逆变器供电无刷直流电机调速simulink仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 无刷直流电机&#xff08;BLDCM&#xff09;原理 4.2 六步换相逆变器 4.3 双PI控制器设计 5.完整工程文件 1.课题概述 基于双PI控制器结构的六步逆变器供电无刷直流电机调速simulink仿真。双PI控制…

DockerCompose部署示例

目录 前言 1. 初识DockerCompose 2. 安装DockerCompose 3. 部署微服务项目 1&#xff09;找一个目录&#xff0c;创建一个新的cloud-demo文件夹。 2&#xff09;在cloud-demo文件夹创建一个docker-compose.yml文件&#xff0c;然后编写下面内容&#xff1a; 3&#xff09…

【视频讲解】后端增删改查接口有什么用?

B站视频地址 B站视频地址 前言 “后端增删改查接口有什么用”&#xff0c;其实这句话可以拆解为下面3个问题。 接口是什么意思&#xff1f;后端接口是什么意思&#xff1f;后端接口中的增删改查接口有什么用&#xff1f; 1、接口 概念&#xff1a;接口的概念在不同的领域中…

R语言统计分析——自编函数

参考资料&#xff1a;R语言统计分析【第2版】 一个函数的结构大致如此&#xff1a; myfunction<-function(arg1,arg2,...){ statements return(object) } 函数中的对象只在函数内部使用。返回对象的数据类型是任意的。 假设我们要编写一个函数&#xff0c;用来计算数据对象…

2、postgresql运行架构

2 运行架构 以为编译安装为模板讲解各个文件功能作用&#xff0c;切换为postgres用户 目录位置数据库数据目录/pgdata/10/data安装包目录/opt/pg10/ 2.1 安装包目录详解 -bash-4.2$ pwd /opt/pg10 -bash-4.2$ tree -L 1 . . ├── bin #应用程序 ├── include #c/c…

Debian12 安装Docker 用 Docker Compose 部署WordPress

服务器准备&#xff1a; 以root账号登录&#xff0c;如果不是root&#xff0c;后面指令需要加sudo apt update apt install apt-transport-https ca-certificates curl gnupg lsb-release添加GPG密钥&#xff0c;推荐国内源 curl -fsSL https://mirrors.aliyun.com/docker…

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

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

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

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

8.Redis的List类型

Redis中的list跟java中的LinkedList比较相似&#xff0c;可以看做是一个双向链表的结构。 既可以支持正向检索和反向检索。 特点 1.有序 2.元素可以重复 3.插入和删除快 4.查询速度一般 应用场景 点赞和评论功能&#xff0c;都会存在一个顺序&#xff0c;谁先评论&…

从入门到自动化:一篇文章掌握Python的80%

Python作为一种高级编程语言&#xff0c;以其简洁明了的语法和强大的功能性&#xff0c;在全球编程社区内享有极高的声誉。本文将带领你从Python的基础语法入手&#xff0c;介绍其常用库的应用&#xff0c;以及如何将Python用于数据分析、网络爬虫和简单的自动化任务&#xff0…