From ba814ca68ba1fa2e1fd365fefe4a5b235c6b6a08 Mon Sep 17 00:00:00 2001 From: xuchengsheng Date: Thu, 9 Nov 2023 21:10:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96readme=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GroovyBeanDefinitionReaderDemo.java | 18 ++----- .../spring-resource-documentLoader/README.md | 38 +++++++------- .../spring-resource-resourceLoader/README.md | 43 +++++++++------- spring-resources/spring-resource/README.md | 51 ++++++++++--------- 4 files changed, 77 insertions(+), 73 deletions(-) diff --git a/spring-beans/spring-bean-groovyBeanDefinitionReader/src/main/java/com/xcs/spring/GroovyBeanDefinitionReaderDemo.java b/spring-beans/spring-bean-groovyBeanDefinitionReader/src/main/java/com/xcs/spring/GroovyBeanDefinitionReaderDemo.java index c3cf627..20ef241 100644 --- a/spring-beans/spring-bean-groovyBeanDefinitionReader/src/main/java/com/xcs/spring/GroovyBeanDefinitionReaderDemo.java +++ b/spring-beans/spring-bean-groovyBeanDefinitionReader/src/main/java/com/xcs/spring/GroovyBeanDefinitionReaderDemo.java @@ -22,19 +22,9 @@ public class GroovyBeanDefinitionReaderDemo { // 加载 Groovy 文件并注册 Bean 定义 reader.loadBeanDefinitions(new ClassPathResource("my-beans.groovy")); - while (true){ - // 获取MyService - MyService myService = factory.getBean(MyService.class); - // 打印消息 - myService.showMessage(); - - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - reader.loadBeanDefinitions(new ClassPathResource("my-beans.groovy")); - } + // 获取MyService + MyService myService = factory.getBean(MyService.class); + // 打印消息 + myService.showMessage(); } } diff --git a/spring-resources/spring-resource-documentLoader/README.md b/spring-resources/spring-resource-documentLoader/README.md index 8a0ee95..1b66ad2 100644 --- a/spring-resources/spring-resource-documentLoader/README.md +++ b/spring-resources/spring-resource-documentLoader/README.md @@ -1,28 +1,32 @@ ## DocumentLoader - [DocumentLoader](#documentloader) - - [一、知识储备](#一知识储备) - - [二、基本描述](#二基本描述) - - [三、主要功能](#三主要功能) - - [四、接口源码](#四接口源码) - - [五、主要实现](#五主要实现) - - [六、最佳实践](#六最佳实践) - - [七、与其他组件的关系](#七与其他组件的关系) - - [八、常见问题](#八常见问题) + - [一、基本信息](#一基本信息) + - [二、知识储备](#二知识储备) + - [三、基本描述](#三基本描述) + - [四、主要功能](#四主要功能) + - [五、接口源码](#五接口源码) + - [六、主要实现](#六主要实现) + - [七、最佳实践](#七最佳实践) + - [八、与其他组件的关系](#八与其他组件的关系) + - [九、常见问题](#九常见问题) +### 一、基本信息 -### 一、知识储备 +✒️ **作者** - Lex 📝 **博客** [掘金](https://juejin.cn/user/4251135018533068/posts) 📚 **源码地址** - [GitHub](https://github.com/xuchengsheng/spring-reading) + +### 二、知识储备 1. **XML 解析技术** + 了解 XML 解析技术,如 DOM(文档对象模型)和 SAX(简单 API for XML)。`DocumentLoader` 通常使用 DOM 来加载和解析 XML 文档,因此理解 DOM 操作是重要的。 2. **资源加载** - + 了解如何使用 Java 资源加载机制,例如 `ClassLoader` 和 `Resource`,来获取 XML 配置文件。Spring 使用这些机制来加载配置文件。[点击查看Resource接口](https://github.com/xuchengsheng/spring-reading/tree/master/spring-resources/spring-resource),[点击查看ClassLoader接口](https://github.com/xuchengsheng/spring-reading/tree/master/spring-resources/spring-resource-resourceLoader) + + 了解如何使用 Java 资源加载机制,例如 [`ResourceLoader`](https://github.com/xuchengsheng/spring-reading/tree/master/spring-resources/spring-resource-resourceLoader) 和 [`Resource`](https://github.com/xuchengsheng/spring-reading/tree/master/spring-resources/spring-resource),来获取 XML 配置文件。Spring 使用这些机制来加载配置文件。 -### 二、基本描述 +### 三、基本描述 `DocumentLoader` 接口是 Spring 框架中的一个核心接口,用于加载和解析 XML 文档,通常用于解析 Spring 配置文件。它定义了一种方法来加载 XML 文档并将其解析为一个 `org.w3c.dom.Document` 对象,以便在 Spring 应用程序中使用,允许开发人员获取和操作 XML 配置文件的内容。这个接口允许配置文件的加载和解析过程在后台自动进行,以支持 Spring 应用的初始化和配置。 -### 三、主要功能 +### 四、主要功能 1. **加载 XML 文档**: + `DocumentLoader` 接口定义了一个方法,用于加载 XML 文档,可以从不同来源(例如文件、资源、URL 等)获取 XML 内容。 @@ -35,7 +39,7 @@ 5. **错误处理** + `DocumentLoader` 接口还提供了一个 `ErrorHandler` 接口,用于处理 XML 解析过程中的错误信息,以便及时捕获和处理问题。 -### 四、接口源码 +### 五、接口源码 `DocumentLoader` 接口用于加载和解析XML文档的策略,它接受一个`InputSource`,一个实体解析器`EntityResolver`,一个错误处理器`ErrorHandler`,验证模式`validationMode`(可以是DTD或XSD验证),以及一个布尔值`namespaceAware`,表示是否启用XML命名空间支持。方法返回一个加载后的`Document`对象。 @@ -69,7 +73,7 @@ public interface DocumentLoader { } ``` -### 五、主要实现 +### 六、主要实现 1. **`DefaultDocumentLoader`** + `DefaultDocumentLoader` 是 Spring 框架的默认实现,它负责加载和解析XML配置文件,以支持Spring应用程序的初始化和配置。这个实现提供了灵活性,可以根据需要自定义配置文件的加载和解析行为。如果需要使用不同的加载策略或验证模式,可以通过配置来指定不同的`DocumentLoader`实现。 @@ -88,7 +92,7 @@ classDiagram ~~~ -### 六、最佳实践 +### 七、最佳实践 使用 Spring 框架的默认文档加载器(`DefaultDocumentLoader`)加载和解析XML配置文件,并以递归方式打印XML文档的详细信息,包括元素名称、属性和文本内容。通过创建一个 `Resource` 对象表示要加载的XML文件,然后使用 `DefaultDocumentLoader` 进行加载和解析,并最后递归打印文档内容。 @@ -206,7 +210,7 @@ Element: beans Text: ``` -### 七、与其他组件的关系 +### 八、与其他组件的关系 1. **`XmlBeanDefinitionReader`** + `XmlBeanDefinitionReader` 是用于读取和解析 XML 配置文件的类,它在 Spring 应用程序上下文的初始化过程中使用 `DefaultDocumentLoader` 来加载和解析配置文件。这是 Spring IOC 容器的关键组件之一,用于注册和管理 Bean 定义。 @@ -215,7 +219,7 @@ Element: beans 3. **Spring Web MVC 配置** + 在 Spring Web MVC 应用程序中,通常会使用 `DispatcherServlet` 配置中的 `` 元素来指定 Spring 配置文件,这个配置文件将由 `DefaultDocumentLoader` 解析以配置 Web 应用程序上下文。 -### 八、常见问题 +### 九、常见问题 1. **XML 文档路径和资源定位问题** + 确保能够正确找到并加载XML文档,包括检查路径、文件是否存在以及资源定位的正确性。 diff --git a/spring-resources/spring-resource-resourceLoader/README.md b/spring-resources/spring-resource-resourceLoader/README.md index 8241463..58938dd 100644 --- a/spring-resources/spring-resource-resourceLoader/README.md +++ b/spring-resources/spring-resource-resourceLoader/README.md @@ -1,30 +1,35 @@ ## ResourceLoader - [ResourceLoader](#resourceloader) - - [一、知识储备](#一知识储备) - - [二、基本描述](#二基本描述) - - [三、主要功能](#三主要功能) - - [四、接口源码](#四接口源码) - - [五、主要实现](#五主要实现) - - [六、最佳实践](#六最佳实践) - - [七、与其他组件的关系](#七与其他组件的关系) - - [八、常见问题](#八常见问题) + - [一、基本信息](#一基本信息) + - [二、知识储备](#二知识储备) + - [三、基本描述](#三基本描述) + - [四、主要功能](#四主要功能) + - [五、接口源码](#五接口源码) + - [六、主要实现](#六主要实现) + - [七、最佳实践](#七最佳实践) + - [八、与其他组件的关系](#八与其他组件的关系) + - [九、常见问题](#九常见问题) -### 一、知识储备 +### 一、基本信息 + +✒️ **作者** - Lex 📝 **博客** [掘金](https://juejin.cn/user/4251135018533068/posts) 📚 **源码地址** - [github](https://github.com/xuchengsheng/spring-reading) + +### 二、知识储备 1. **Spring 资源抽象** - - `org.springframework.core.io.Resource` 接口及其各种实现 [点击查看Resource接口](https://github.com/xuchengsheng/spring-reading/blob/master/spring-resources/spring-resource)。 + - [`Resource`](https://github.com/xuchengsheng/spring-reading/blob/master/spring-resources/spring-resource) 接口及其各种实现。 2. **路径和模式解析** - Spring 中的路径解析,特别是使用 ant 风格的路径模式,例如 `classpath*:com/example/**/*.xml`。 3. **理解不同的资源类型** - 文件资源、类路径资源、URL 资源、JAR 中的资源等。 -### 二、基本描述 +### 三、基本描述 `org.springframework.core.io.ResourceLoader` 是 Spring 框架中的一个关键接口,它定义了如何获取资源(例如类路径资源、文件系统资源或网页资源)的策略。这个接口是 Spring 资源加载抽象的核心,使得应用程序可以从不同的资源位置以统一的方式加载资源。 -### 三、主要功能 +### 四、主要功能 1. **统一资源加载** - `ResourceLoader` 提供了一个标准化的方法来加载资源,不论资源是存放在类路径、文件系统、网络URL还是其他位置。 @@ -39,7 +44,7 @@ 6. **内置实现与整合** - Spring 提供了默认的 `ResourceLoader` 实现,如 `DefaultResourceLoader`。但更重要的是,`org.springframework.context.ApplicationContext` 也实现了 `ResourceLoader`,这意味着 Spring 上下文本身就是一个资源加载器。 -### 四、接口源码 +### 五、接口源码 `ResourceLoader` 接口为 Spring 框架定义了资源加载策略。它提供了获取资源的方法,并公开了其使用的 `ClassLoader`。通过这种策略,资源可以从各种来源(如类路径、文件系统等)以统一方式加载。这提供了资源加载的灵活性和一致性,并支持各种资源描述符,如 URL、类路径等。此外,它还允许对资源句柄进行多次重新使用和读取。 @@ -127,11 +132,11 @@ public interface ResourcePatternResolver extends ResourceLoader { } ``` -### 五、主要实现 +### 六、主要实现 -1. `DefaultResourceLoader` +1. **`DefaultResourceLoader`** + 这是基本的资源加载器实现。它可以处理 "classpath:" 前缀的资源,如果没有提供这样的前缀,它会尝试使用类加载器或文件系统来加载资源。 -2. `PathMatchingResourcePatternResolver` +2. **`PathMatchingResourcePatternResolver`** + 这个类不仅实现了 `ResourceLoader` 接口,还实现了 `ResourcePatternResolver` 接口。它扩展了 `DefaultResourceLoader` 的功能,支持 "classpath*:" 这样的模式来加载匹配的所有资源。 ~~~mermaid @@ -162,7 +167,7 @@ classDiagram ~~~ -### 六、最佳实践 +### 七、最佳实践 **`DefaultResourceLoader`** @@ -241,7 +246,7 @@ File = myfile2.txt File = myfile3.txt ``` -### 七、与其他组件的关系 +### 八、与其他组件的关系 1. **`ApplicationContext`** + 所有的 Spring `ApplicationContext` 都实现了 `ResourceLoader`。这意味着我们可以使用 Spring 上下文本身来加载资源。 @@ -264,7 +269,7 @@ File = myfile3.txt 7. **`PathMatchingResourcePatternResolver`** + 它是 `ResourcePatternResolver` 的一个实现,它扩展了 `ResourceLoader` 来处理以 "classpath*:" 开头的资源模式,这允许加载所有匹配的资源,而不仅仅是第一个找到的资源。 -### 八、常见问题 +### 九、常见问题 1. **如何加载类路径资源?** - 使用前缀 "classpath:",例如:`loader.getResource("classpath:myconfig.xml")`。 diff --git a/spring-resources/spring-resource/README.md b/spring-resources/spring-resource/README.md index ba65ff3..211e774 100644 --- a/spring-resources/spring-resource/README.md +++ b/spring-resources/spring-resource/README.md @@ -1,17 +1,22 @@ ## Resource - [Resource](#resource) - - [一、知识储备](#一知识储备) - - [二、基本描述](#二基本描述) - - [三、主要功能](#三主要功能) - - [四、接口源码](#四接口源码) - - [五、主要实现](#五主要实现) - - [六、最佳实践](#六最佳实践) - - [七、与其他组件的关系](#七与其他组件的关系) - - [八、常见问题](#八常见问题) + - [一、基本信息](#一基本信息) + - [二、知识储备](#二知识储备) + - [三、基本描述](#三基本描述) + - [四、主要功能](#四主要功能) + - [五、接口源码](#五接口源码) + - [六、主要实现](#六主要实现) + - [七、最佳实践](#七最佳实践) + - [八、与其他组件的关系](#八与其他组件的关系) + - [九、常见问题](#九常见问题) -### 一、知识储备 +### 一、基本信息 + +✒️ **作者** - Lex 📝 **博客** [掘金](https://juejin.cn/user/4251135018533068/posts) 📚 **源码地址** - [GitHub](https://github.com/xuchengsheng/spring-reading) + +### 二、知识储备 1. **I/O知识** + 了解文件、路径、输入/输出流等基础概念。 @@ -20,11 +25,11 @@ 3. **URL和URI概念** + 这对于理解如何从网络或其他协议中加载资源是必要的。 -### 二、基本描述 +### 三、基本描述 `Resource` 是 Spring 框架中用于简化和统一对底层资源(如文件、classpath 资源、URL 等)的访问的一个核心接口。它为不同来源的资源提供了一个共同的抽象,并隐藏了具体资源访问的细节。在 Java 开发中,资源的访问是常见的需求,如读取配置文件、图片、音频等。但 Java 的标准库为不同类型的资源提供了不同的访问机制:例如,对于文件系统中的资源,我们可能使用 `java.io.File`;对于 classpath 中的资源,我们可能使用 `ClassLoader` 的 `getResource` 或 `getResourceAsStream` 方法;对于网络资源,我们可能使用 `java.net.URL`。这些不同的机制意味着我们需要了解和使用多种方式来访问资源,这导致的问题是代码复杂性增加、重复代码以及可能的错误。为了提供一个统一、简化和更高级的资源访问机制,Spring 框架引入了 `Resource` 接口,这个接口为所有的资源提供了一个统一的抽象。 -### 三、主要功能 +### 四、主要功能 1. **统一的资源抽象** + 无论资源来自于文件系统、classpath、URL 还是其他来源,`Resource` 接口都为其提供了一个统一的抽象。 @@ -43,7 +48,7 @@ 8. **多种实现** + Spring 提供了多种 `Resource` 的实现,以支持不同来源的资源,如 `ClassPathResource`、`FileSystemResource` 和 `UrlResource` 等。 -### 四、接口源码 +### 五、接口源码 `InputStreamSource` 是一个简单的接口,用于提供一个输入流。它被设计为可以多次返回一个新的、未读取的输入流,这对于那些需要多次读取输入流的API。 @@ -154,17 +159,17 @@ public interface Resource extends InputStreamSource { } ``` -### 五、主要实现 +### 六、主要实现 -1. `ClassPathResource` +1. **`ClassPathResource`** + 用于加载 classpath 下的资源。 -2. `FileSystemResource` +2. **`FileSystemResource`** + 用于访问文件系统中的资源。 -3. `UrlResource` +3. **`UrlResource`** + 用于基于 URL 的资源。 -4. `ServletContextResource` +4. **`ServletContextResource`** + 用于 Web 应用中的资源。 -5. `ByteArrayResource` & `InputStreamResource` +5. **`ByteArrayResource`** & **`InputStreamResource`** + 基于内存和流的资源表示。 ~~~mermaid @@ -221,7 +226,7 @@ classDiagram ~~~ -### 六、最佳实践 +### 七、最佳实践 **`ClassPathResource`** @@ -308,7 +313,7 @@ public class InputStreamResourceDemo { } ``` -### 七、与其他组件的关系 +### 八、与其他组件的关系 1. **`BeanFactory&ApplicationContext`** + `BeanFactory`和应用上下文`ApplicationContext`在实例化和配置Bean时通常需要访问资源。`Resource` 接口提供了一种统一的方式来加载资源文件,这对于配置和初始化Bean非常有用。Bean定义中可以包含资源引用,使Bean能够使用这些资源。 @@ -319,13 +324,13 @@ public class InputStreamResourceDemo { 3. **`PropertyPlaceholderConfigurer`** + `PropertyPlaceholderConfigurer`是Spring框架中用于替换属性占位符的类。它可以将属性值从资源文件中读取,然后替换配置文件中的占位符。这是通过 `locations` 属性指定的资源文件实现的。 -4. **`MVC框架`** +4. **MVC框架** + Spring的MVC框架(如Spring MVC)通常需要处理文件上传和静态资源。`Resource` 接口及其实现可以用于管理和提供这些资源。`Resource`接口与`ResourceLoader`一起被用于加载静态资源,例如图像、样式表和JavaScript文件。 -5. **`自定义资源加载和处理`** +5. **自定义资源加载和处理** + 我们自己也可以使用 `Resource` 接口自定义资源加载和处理逻辑。例如,我们可以创建一个自定义的 `Resource` 实现,用于加载资源文件,执行特定的处理逻辑,然后将处理后的资源提供给应用程序。 -### 八、常见问题 +### 九、常见问题 1. **如何选择合适的 `Resource` 实现?** - `ClassPathResource`: 用于访问类路径下的资源。