专题三:Spring源码中新建module

前面我们构建好了Spring源码,接下来肯定迫不及待来调试啦,来一起看看大名鼎鼎ApplicationContext

新建模块

1、基础步骤

1.1 自定义模块名称如:spring-self

1.2 选择构建工具因为spring使用的是gradle,所以这边需要我们切换默认选择

1.3 选择DSL,这个也和源码保持一致

1.4 这个看自己,如果不想选择的话,记得父工程引用的时候修改下对应的名称和依赖

1.5 设置组织id与别名。

2、重要文件

build.gradle

plugins {id 'java'
}group = 'org.springframework'
version = '5.2.6.RELEASE'repositories {mavenCentral()
}
// 引入依赖
dependencies {testImplementation platform('org.junit:junit-bom:5.9.1')testImplementation 'org.junit.jupiter:junit-jupiter'compile(project(":spring-context"))optional(project(":spring-context"))}test {useJUnitPlatform()
}

这里我们目前只使用到了context所以先只是引入了context;后续需要引用不同模块的是在添加即可,修改了依赖引入以后记得构建下工程,防止因为缓存导致项目没有引入依赖的。

setting.gradle

pluginManagement {repositories {maven { url 'https://maven.aliyun.com/repository/public/' }gradlePluginPortal()maven { url 'https://repo.spring.io/plugins-release' }}
}
apply from: "$rootDir/gradle/build-cache-settings.gradle"include "spring-aop"
include "spring-aspects"
include "spring-beans"
include "spring-context"
include "spring-context-support"
include "spring-context-indexer"
include "spring-core"
include "kotlin-coroutines"
project(':kotlin-coroutines').projectDir = file('spring-core/kotlin-coroutines')
include "spring-expression"
include "spring-instrument"
include "spring-jcl"
include "spring-jdbc"
include "spring-jms"
include "spring-messaging"
include "spring-orm"
include "spring-oxm"
include "spring-test"
include "spring-tx"
include "spring-web"
include "spring-webmvc"
include "spring-webflux"
include "spring-websocket"
include "framework-bom"
include "integration-tests"rootProject.name = "spring"
rootProject.children.each {project ->project.buildFileName = "${project.name}.gradle"
}
include 'spring-self'

spring-self.gradle

有个小细节,如果想和spring源码的gradle保持一致,重点看这段代码:

rootProject.name = "spring"
rootProject.children.each {project ->
    project.buildFileName = "${project.name}.gradle"
}

此时我们只要将include 'spring-self' 放到这段代码上方即可,这样我们的build.gradle 就可以改成与spring同样的命令风格spring-self.gradle

3、代码编写

代码目录

实体类

public class JmUser {private String name;private String age;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}
}

Xml

<?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"><bean id="jmUser" class="org.springframework.dto.JmUser"><property name="name" value="测试一" /><property name="age" value="18" /></bean></beans>

主方法

public class Main {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");JmUser jmUser = (JmUser)context.getBean("jmUser");System.out.println(jmUser.getName());System.out.println(jmUser.getAge());}
}

运行结果

模块代码流程梳理

在Spring框架中,为ApplicationContext设置配置位置是初始化过程中的一个重要步骤。以下是如何为AbstractApplicationContext设置配置位置的步骤:

使用构造函数设置配置位置

当创建ApplicationContext的实例时,可以通过构造函数传递配置文件的位置。例如,使用ClassPathXmlApplicationContext

ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");

这里,"configLocations.xml"是配置文件的名称,它应该位于类路径(classpath)下。

使用setConfigLocations方法

如果你需要在创建ApplicationContext实例后设置配置位置,可以使用setConfigLocations方法:

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.core.io.ClassPathResource;public class SpringApp {public static void main(String[] args) {AbstractApplicationContext context = new ClassPathXmlApplicationContext();// 设置配置文件的位置String[] configLocations = new String[] {"configLocations.xml"};context.setConfigLocations(configLocations);// 初始化ApplicationContextcontext.refresh();// ... 应用上下文已经初始化,可以获取Bean等操作 ...// 关闭ApplicationContextcontext.close();}
}

在这个例子中,首先创建了一个ClassPathXmlApplicationContext的实例,然后使用setConfigLocations方法设置了配置文件的位置。注意,refresh()方法在设置配置位置之后调用,以确保配置被加载。

默认配置位置

如果未设置配置位置,某些ApplicationContext的实现可能会使用默认的配置文件位置。例如,ClassPathXmlApplicationContext如果没有指定配置位置,会尝试查找类路径下的applicationContext.xml文件。

注意事项

  • 确保配置文件的路径是正确的,并且文件是可访问的。
  • 如果配置文件使用了相对路径,请注意它是基于类路径的。
  • 在调用refresh()方法之前设置配置位置,以确保配置被正确加载。

通过上述步骤,你可以为Spring的ApplicationContext设置配置位置,并根据需要进行初始化。

下一章节,我将进入源码,一步一图源码注释给大家看。

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

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

相关文章

Android 如何通过代码实时设置EditTextView光标

背景&#xff1a;换肤框架下&#xff0c;QA进行深色浅色切换说输入框光标颜色没有改变&#xff0c;转UI结果UI说需要修改&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 本来有方法可以设置&#xff0c;但是 设置后未生效。重新进入该页面才生效&#xff01;&a…

Android 集成OpenCV

记录自己在学习使用OpenCV的过程 我使用的是4.10.0 版本 Android 集成OpenCV 步骤 下载OpenCV新建工程依赖OpenCV初始化及逻辑处理 1、下载OpenCV 并解压到自己的电脑 官网 地址&#xff1a;https://opencv.org/releases/ 个人地址&#xff1a;https://pan.baidu.com/s/19f…

这款新的 AI 语音助手击败了 OpenAI,成为 ChatGPT 最受期待的功能之一

OpenAI 推迟了 ChatGPT 令人印象深刻的语音模式&#xff0c;这让许多 AI 聊天机器人的粉丝感到不安&#xff0c;但他们现在可能已经被挖走了。法国人工智能开发商 Kyutai 推出了一款名为 Moshi 的实时语音 AI 助手。 Moshi 旨在通过语音&#xff08;如 Alexa 或 Google Assista…

三、数据库系统(考点篇)试题

聚簇索引&#xff0c;也叫簇类索引&#xff0c;原理是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序于聚簇索引的索引页面指针指向数据页面&#xff0c;所以使用聚簇索引查找数据几乎总是比使用非聚簇索引快。每张表只能建一个聚簇索引&#xff0c;并且建聚簇索引需…

在VMware中安装Linux RHEL8操作系统

Linux操作系统安装 任务目标 了解虚拟机平台VMWARE的安装步骤。 了解RHEL8的安装步骤。 熟悉安装所必须的硬件环境。 任务要求 在VMWARE虚拟机平台上安装RHEL8&#xff0c;要求使用root用户成功登录&#xff0c;关闭虚拟机做好快照。将安装步骤记录在下方“操作步骤”&am…

51单片机嵌入式开发:3、STC89C52操作8八段式数码管原理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 STC89C52操作8八段式数码管原理 1 8位数码管介绍1.1 8位数码管概述1.2 8位数码管原理1.3 应用场景 2 原理图图解2.1 74HC573原理2.2 74HC138原理2.3 数码管原理 3 数码管程序…

跟《经济学人》学英文:2024年07月06日这期:Finishing schools for the age of TikTok

Finishing schools for the age of TikTok Unsure how to be polite at work? Ask a digital etiquette guru 不确定如何在工作中保持礼貌&#xff1f;请教一位数字礼仪大师 “Finishing schools” 是指专门为年轻女性提供礼仪、社交技巧、文化修养等教育的学校&#xff0c;…

【Kafka】记录一次Kafka消费者重复消费问题

文章目录 现象业务背景排查过程Push与Pull 现象 用户反馈消费者出现消息积压&#xff0c;并且通过日志看&#xff0c;一直重复消费&#xff0c;且没有报错日志。 业务背景 用户的消费者是一个将文件做Embedding的任务&#xff0c;&#xff08;由于AI技术的兴起&#xff0c;大…

关注推送---Feed流,推模式实现的个人分析及其思考。

本篇文章记录我们实际开发过程中&#xff0c;关注推送场景的个人思考&#xff0c;以及解析。 文章目录 前言一、关注推送是什么&#xff1f;是什么是Feed流&#xff1f;二、解决关注推送问题的技术方案1.理论模型的选取2.数据类型的选取 三、理论模型的选取三、数据类型的选取总…

Appium+python自动化(四十一)-Appium自动化测试框架综合实践 - 即将落下帷幕(超详解)

1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现。到今天为止&#xff0c;大功即将告成&#xff1b;框架所需要的代码实现都基本完成。 2.data数据封装 2.1使用背景 在实际项目过程中&#xff0c;我们的数据可能是存储在一个数据文件中&#x…

最小代价生成树实现(算法与数据结构设计)

课题内容和要求 最小代价生成树的实现&#xff0c;分别以普利姆算法和克鲁斯卡尔算法实现最小代价生成树&#xff0c;并分析两种算法的适用场合。 数据结构说明 普利姆算法实现最小代价生成树的图采用邻接表存储结构&#xff0c;还有辅助数据结构&#xff0c;数组nearest&am…

SR-IOV学习笔记

参考&#xff1a;《深入浅出DPDK》&前人的各种博客 SR-IOV全称Single Root IO Virtualization&#xff0c;单根虚拟化(多么高大上的名字>.<)&#xff0c;是 Intel 在 2007年提出的一种基于硬件的虚拟化解决方案。 虚拟化背景 那什么又是虚拟化呢&#xff1f;抽象来…

gptoolbox matlab工具箱cmake 调试笔记

一、问题描述 起因&#xff1a;在matlab中运行Offset surface of triangle mesh in matlab的时候报错&#xff1a; 不支持将脚本 signed_distance 作为函数执行: E:\MATLAB_File\gptoolbox\mex\signed_distance.m> 出错 offset_bunny (第 22 行) D signed_distance(BC,V,F…

dotnet ef工具使用

设置工具安装目录 dotnet tool install dotnetsay --tool-path G:\dotnet-tools安装 dotnet tool install --global dotnet-ef更新 dotnet tool update --global dotnet-ef查看版本 dotnet ef --version创建迁移文件 # 只有一个dbcontext dotnet ef migrations add init #…

HDF4文件转TIF格式

HDF4 HDF4&#xff08;Hierarchical Data Format version 4&#xff09;是一种用于存储和管理机器间数据的库和多功能文件格式。它是一种自描述的文件格式&#xff0c;用于存档和管理数据。 HDF4与HDF5是两种截然不同的技术&#xff0c;HDF5解决了HDF4的一些重要缺陷。因此&am…

【硬件产品经理】硬件产品手板设计

目录 简介 硬件手板 手板资料 作者简介 简介 今天来聊聊产品手板这个话题。 到了手板这个层面其实就属于产品设计细节了&#xff0c; 无论你对整个开发体系如何如何了解&#xff0c; 对公司管理流程如何如何精通。 最终都是要回归到业务细节中去的&#xff0c; 你可能…

Python中解决os.listdir命令读取文件乱序问题方法

Python中使用对话框批量打开文件时出现乱序问题的解决方法 一、问题描述二、os.listdir读取文件乱序问题解决方法 欢迎学习交流&#xff01; 邮箱&#xff1a; z…1…6.com 网站&#xff1a; https://zephyrhours.github.io/ 一、问题描述 有时候为了方便&#xff0c;我们在进…

Docker-基础

一&#xff0c;Docker简介&#xff0c;功能特性与应用场景 1.1 Docker简介 Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux机器上&#xff0c;也可以实现虚拟化&#xff0c;容器…

vue计算属性 computed

计算属性 computed 模板语法的表达式虽然方便&#xff0c;但也只能用来做简单的操作。如果在模板中写太多逻辑&#xff0c;会让模板变得臃肿&#xff0c;难以维护。因此我们推荐使用计算属性来描述依赖响应式状态的复杂逻辑。 模板语法&#xff1a;模板语法链接 <template…

表单自定义组件 - 可选择卡片SelectCard

import React from react; import styles from ./index.module.less;type OptionsType {/*** 每个item渲染一行&#xff0c;第0项为标题*/labels?: any[];/*** 自定义渲染内容*/label?: string | React.ReactNode;value: any; }; interface IProps {value?: any;onChange?…