Spring系列18:Resource接口及内置实现

Spring整理系列(07)——通过Spring Resource接口获取资源 一、Resources介绍Resources :获取资源文件的统一接口。二、Resources接口主要实现类有 ClassPathResource:获取类路径下的资源文件 UrlResource:URL对应的资源,根据一个URL地址即可创建 FileSystemResource:获取文件系统里面的资源 ServletContextResource:ServletContext封装的资源,用于访问 S 阅读详情

Python微信订餐小程序课程视频

https://edu.youkuaiyun.com/course/detail/36074

Python实战量化交易理财系统

https://edu.youkuaiyun.com/course/detail/35475

本文内容

  1. Resource接口的定义
  2. Resource接口的内置实现
  3. ResourceLoader接口
  4. ResourceLoaderAware 接口

Resource接口的定义

Java 的标准 java.net.URL 类和各种 URL 前缀的标准处理程序不足以满足所有对低级资源的访问。 例如没有标准化的 URL 实现可用于访问需要从类路径或相对于 ServletContext 获取的资源。 虽然可以为专门的 URL 前缀注册新的处理程序(类似于现有的前缀处理程序如 http:),但这通常相当复杂,并且 URL 接口仍然缺乏一些理想的功能,例如检查是否存在的方法 指向的资源。

针对上述这种情况,Spring 提供了更强大的接口Resource用于对低级资源的抽象访问,其定义和主要接口方法说明如下。

package org.springframework.core.io;

public interface Resource extends InputStreamSource {

	// 特定资源是否存在
	boolean exists();

    // 内容非空可通过#getInputStream()读取
	default boolean isReadable() {
		return exists();
	}

    // 资源对应的InputStream是否已经打开,不能多次读取,应读取后关闭避免资源泄漏
	default boolean isOpen() {
		return false;
	}

    // 是否是 File 类型,配合 #getFile()
	default boolean isFile() {
		return false;
	}

	// 获取 URL
	URL getURL() throws IOException;

	// 获取URI
	URI getURI() throws IOException;

	// 获取 File
	File getFile() throws IOException;

	// 资源内容长度
	long contentLength() throws IOException;

	// 上次修改的时间戳
	long lastModified() throws IOException;

	// 给定路径创建资源
	Resource createRelative(String relativePath) throws IOException;

	// 获取文件名非全路径
	@Nullable
	String getFilename();

	// 获取资源描述
	String getDescription();

}

Resource接口继承了InputStreamSource,其定义如下。

package org.springframework.core.io;

public interface InputStreamSource {
	// 获取资源对应的 InputStream
	InputStream getInputStream() throws IOException;
}

Resource接口并不是用于完全取代java.net.URL,而是尽可能地通过其实现类来包装URL进行处理,如UrlResource 包装一个 URL 并使用包装的 URL 来完成它的的功能。具体看下一节的内置实现。

Resource接口的内置实现

UrlResource

UrlResource 包装了 java.net.URL,可用于访问通常可通过 URL 访问的任何对象,例如文件、HTTP 目标、FTP 目标等。这些资源通过标准前缀来区分,file:用于访问文件系统路径,http:用于通过 HTTP 协议访问资源,ftp:用于通过 FTP 访问资源等。

ClassPathResource

ClassPathResource表示应从类路径获取的资源。它使用线程上下文类加载器、给定的类加载器或给定的类来加载资源。可通过特定前缀classpath:指定为该资源。

如果类路径资源驻留在文件系统中,则此 Resource 实现支持解析为 java.io.File,但不支持在 jar 包中且尚未解压的类路径资源。

FileSystemResource

这是 java.io.File 和 java.nio.file.Path 句柄的资源实现。它支持作为File和 URL 的解析。

ServletContextResource

这是 ServletContext 资源的 Resource 实现,它解释相关 Web 应用程序根目录中的相对路径。

它始终支持流访问和 URL 访问,但仅在扩展 Web 应用程序存档并且资源物理位于文件系统上时才允许 java.io.File 访问。它是否被解压并在文件系统上或直接从 JAR 或其他地方(如数据库)访问实际上取决于 Servlet 容器。

ByteArrayResource

给定字节数组的资源实现。它为给定的字节数组创建一个 ByteArrayInputStream。对于从任何给定的字节数组加载内容很有用,而不必求助于单一使用的 InputStreamResource。

InputStreamResource

InputStreamResource 是给定 InputStream 的资源实现。首选 ByteArrayResource 或任何基于文件的 Resource 实现,仅当没有特定的 Resource 实现适用时才应使用它。

与其他 Resource 实现相比,这是一个已打开资源的描述符,接口isOpen()返回true。如果需要将资源描述符保存在某处或需要多次读取流,请不要使用它。

ResourceLoader接口

ResourceLoader 用于加载资源(例如类路径或文件系统资源)的策略接口。

package org.springframework.core.io;

public interface ResourceLoader {

	/** Pseudo URL prefix for loading from the class path: "classpath:". */
	String CLASSPATH\_URL\_PREFIX = ResourceUtils.CLASSPATH_URL_PREFIX;


    // 返回指定资源位置的资源句柄
	Resource getResource(String location);
	
    // 获取 ClassLoader
    // 需要直接访问 ClassLoader 的客户端可以通过 ResourceLoader 统一的方式进行访问,而不是依赖于线程上 下文 ClassLoader。
	@Nullable
	ClassLoader getClassLoader();

}


源码中对于的说明:

  • 句柄应始终是可重用的资源描述符,允许多个 Resource.getInputStream() 调用。
  • 必须支持完全限定的 URL,例如“file:C:/test.dat”。
  • 必须支持类路径伪 URL,例如“classpath:test.dat”。
  • 应该支持相对文件路径,例如“WEB-INF/test.dat”。 (这将是特定于实现的,通常由 ApplicationContext 实现提供。)
  • 资源句柄并不意味着现有资源;需要调用 Resource.exists() 来检查是否存在。

所有 org.springframework.context.ApplicationContext都必须实现该ResourceLoader接口。调用getResource()接口的返回值类型取决于当前context的类型,当前context会自动转换。如下案例。

Resource template = ctx.getResource("some/resource/path/myTemplate.txt");

如ctx是ClassPathXmlApplicationContext返回ClassPathResource;

如ctx是FileSystemXmlApplicationContext返回FileSystemResource;

如ctx是WebApplicationContext返回 ServletContextResource

如果不想依赖context类型决定返回资源的类型,可以指定前缀的方式,强制返回特定类型的资源。如下案例。

Resource template = ctx.getResource("classpath:some/resource/path/myTemplate.txt");
// 返回 ClassPathResource 

Resource template = ctx.getResource("file:///some/resource/path/myTemplate.txt");
Resource template = ctx.getResource("https://myhost.com/resource/path/myTemplate.txt");
// 返回 UrlResource

指定前缀对于资源加载方式和返回的影响对应关系如下表。

前缀例子如何解析
classpath:classpath:com/myapp/config.xml从类路径加载
file:file:///data/config.xml | 从文件系统作为URL` 加载
http:https://myserver/logo.png从文件系统作为 URL 加载
(none)/data/config.xml取决于底层的 ApplicationContext

ResourceLoaderAware 接口

ResourceLoaderAware 接口是一个特殊的回调接口,它标识期望提供 ResourceLoader 引用的组件。其定义如下。

package org.springframework.context;

public interface ResourceLoaderAware extends Aware {
    // 可自定义保存一个ResourceLoader的引用来进行资源加载
	void setResourceLoader(ResourceLoader resourceLoader);
}

由于 org.springframework.context.ApplicationContext实现了 ResourceLoader,因此 bean 还可以实现 ApplicationContextAware 接口并直接使用提供的应用程序上下文来加载资源。从面向接口编程和解耦的角度来说,需要ResourceLoader的来进行资源加载,更推荐实现``ResourceLoaderAware接口。

深一层思考,如果容器中的一个bean需要一个ResourceLoader依赖用于加载资源,除了实现ResourceLoaderAware,是否还有其它方式呢?

ResourceLoader实例会自动注入到IoC容器,我们可通过构造函数、setter方法、@Autowire注解等方式,直接注入该依赖,具体看一看之前Ioc相关的文章。

配置文件当做Resource 注入到bean依赖中

如果某个bean依赖于特定的Resource,那么我们如何快速优雅地注入该依赖呢?直接上代码。

public class MyConfig {
    /**
 * 通过配置文件注入的资源
 */
    private Resource template;

    public Resource getTemplate() {
        return template;
    }

    public void setTemplate(Resource template) {
        this.template = templa
    }
}

MyConfig依赖一个类文件路径下的一个配置文件。

对应的xml文件spring.xml和配置文db.properties件如下:

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="myConfig" class="com.crab.spring.ioc.demo02.MyConfig">
        <property name="template" value="db.properties">property>
    bean>
beans>

url=jdbc:mysql://localhost/test
username=root
password=456
max=1024

运行主程序如下:

package com.crab.spring.ioc.demo02;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

public class ResourceTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring" +
                ".xml");
        MyConfig myConfig = context.getBean(MyConfig.class);
        Resource template = myConfig.getTemplate();
        System.out.println(template);
        System.out.println(template instanceof  ClassPathResource);
    }
}

运行结果:

class path resource [db.properties]
true
class path resource [db.properties]

  • 成功注入了Resourece资源到MyConfig的bean中
  • 注入Resource实际是我们通过ClassPathXmlApplicationContext加载的ClassPathResource

扩展:结合上一篇的资源特定前缀和ApplicationContext的关系,忘了请翻看下,我们也可以指定前缀来加载特定的资源。较为简单就不演示了。

    <bean id="myConfig" class="com.crab.spring.ioc.demo02.MyConfig">
        <property name="template" value="classpath:db.properties">property>
    bean>file:///some/resource/path

    <bean id="myConfig" class="com.crab.spring.ioc.demo02.MyConfig">
        <property name="template" value="file:///some/resource/path">property>
    bean>
// 注入的是FileSystemResource

使用资源路径配置应用上下文

回顾一下,ResourceLoader章节,我们分析了指定资源路径前缀对于资源加载方式的影响,对应关系如下表。下面将分带前缀和不带前缀的方式来配置应用上下文。

前缀例子如何解析
classpath:classpath:com/myapp/config.xml从类路径加载
file:file:///data/config.xml | 从文件系统作为URL` 加载
http:https://myserver/logo.png从文件系统作为 URL 加载
(none)/data/config.xml取决于底层的 ApplicationContext
资源路径不带前缀
ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/appContext.xml");		

上面这个案例资源路径不带前缀,ClassPathXmlApplicationContext将使用ClassPathResource加载在类路径下的资源文件。再来一个案例。

ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/appContext.xml");

FileSystemXmlApplicationContext将使用URLResouce来加载文件系统中的配置文件,这里案例是相对路径。

资源路径带前缀

当指定了资源前缀,则使用指定前缀对应的Resource来加载资源。如下案例。

ApplicationContext ctx =
new FileSystemXmlApplicationContext("classpath:conf/appContext.xml");

对比上一个案例,此处将使用ClassPathResource加载在类路径下的资源文件。

资源路径带前缀和通配符

指定单一的资源文件通过前面2种方式,若需要指定多个资源则可以考虑使用通配符,支持Ant-style和classpath*。

  1. Ant-style通配符
/WEB-INF/*-context.xml
com/mycompany/**/applicationContext.xml
file:C:/some/path/*-context.xml
classpath:com/mycompany/**/applicationContext.xml

当使用Ant-style通配符,解析器遵循更复杂的过程来尝试解析通配符。它为直到最后一个非通配符段的路径生成一个资源,并从中获取一个 URL。它为直到最后一个非通配符段的路径生成一个资源,并从中获取一个 URL。

最后一个非通配符段的路径分2种情况处理:

* 普通的文件路径: 生成`java.io.File`,如`classpath:com/mycompany/**/applicationContext.xml`取到`classpath:com/mycompany`,然后进行遍历。
* 特殊的文件`jar:` 路径:如`classpath:com/mycompany/**/applicationContext.xml`,取到`classpath:com/mycompany` ,将生成 `java.net.JarURLConnection`,或是手动解析 jar `URL`然后遍历 jar 文件的内容来解析通配符。



> 
> 使用 jar `URL`强烈建议测试下是否能正常通过通配符访问到资源
> 
> 
>
  1. classpath*前缀

如下案例

ApplicationContext ctx =
    new ClassPathXmlApplicationContext("classpath*:conf/appContext.xml");

遍历类路径下所有匹配到conf/appContext.xml的资源都会加载。
3. 两种方式可以组合使用

如classpath*:META-INF/*-beans.xml

解决策略相当简单:在最后一个非通配符路径段上使用 ClassLoader.getResources() 调用来获取类加载器层次结构中的所有匹配资源,然后对于每个资源,PathMatcher 解析策略用于通配符子路径。感兴趣的可以了解下PathMatcher 类。

组合使用容易掉坑的2个地方,请注意:

* `classpath*:*.xml`


可能不会从 类路径下的jar 文件的根目录中检索文件,而只能从扩展目录的根目录中检索文件。
* `classpath:com/mycompany/**/service-context.xml`


如果要搜索的根包在多个类路径位置中可用,则不保证资源能够找到匹配的资源。 使用`ClassLoader#getResource(com/mycompany/)`如果多个路径有,则可能只返回第一个,其它的漏掉了。保险的做法是`classpath*:com/mycompany/**/service-context.xml`
彩蛋

出于向后兼容的历史原因, FileSystemXmlApplicationContext关联的FileSystemResource会将所有的资源的非前缀路径统一当做相对路径。上案例

// 2种写法是一样的
ApplicationContext ctx =new FileSystemXmlApplicationContext("conf/context.xml");
ApplicationContext ctx =new FileSystemXmlApplicationContext("/conf/context.xml");
// 2种写法是一样的
ctx.getResource("some/resource/path/myTemplate.txt");
ctx.getResource("/some/resource/path/myTemplate.txt");
// 可以强制不按相对路径处理不,可以的!按URLResource处理
ctx = new FileSystemXmlApplicationContext("file:///conf/context.xml");


总结

本文主要详细说明了

  1. Resource接口的定义和方法说明
  2. Resource接口的内置6种实现
  3. ResourceLoader接口和实现
  4. ResourceLoaderAware 接口使用
  5. 如何使用Resource配置ApplicationContext

这一篇下来,基本Spring关于资源处理和相关接口总体是比较清晰了。

知识分享,转载请注明出处。学无先后,达者为先!

Spring Boot 2.7.18升级后,如何优雅处理循环依赖和过时API? 本文详细解析了Spring Boot 2.7.18版本升级过程中遇到的循环依赖和过时API问题,提供了智能处理循环依赖的设计模式和现代化API替换方案。针对微服务架构的特殊需求,还介绍了依赖管理工具和升级验证策略,帮助开发者优雅完成版本迁移。 阅读详情

相关推荐

【Spring Boot 3】读取resource文件

本文介绍开发Spring Boot应用如何读取resources目录下文件的内容。本文介绍了开发Spring Boot应用读取resources构造Spring实例,构造参数是resources目录下文件的相对路径;调用当前类的方法,方法参数是加上resources目录下文件的相对路径;调用Spring自动注入的对象的方法,方法参数是加上resources目录下文件的相对路径;调用Spring自动注入的对象的方法,方法参数是加上resources目录下文件的相对路径。

又言又语 972

同一接口有多个实现类,怎么来注入一个指定的实现?@Resource、@Autowired、@Qualifier

如果一个接口有2个不同的实现, 那么怎么来Autowire一个指定的实现? 举个例子: 1、接口:ILayer public Interface ILayer{ ...... } 2、实现类:ImageLayerImpl ,实现了ILayer接口。 @Service("imageLayerImpl") public class ImageLayerImpl implimen...

二十同学 8万+

关于spring和web项目开发中的classpath以及依赖的jar包中的classpath的路径,spring MVC装载过程中classpath的扫描

关于SPRING中的CLASSPATH src不是classpath, WEB-INF/classes,lib才是classpath WEB-INF/ 是资源目录, 客户端不能直接访问, 这话是没错,不过现在的IDE编译器在编译时会把src下的文件(是文件,不是.java)移到WEB-INF/classes下。不过值得注意的 是,spring配置文件里这个locations是uri表示,也就是说你写的jdbc.properties是当前相对路径,要访问 classpath记得要这样写:classpath:j

代码讲故事 939

Spring6 中的资源操作:Resources

Java的标准java.net.URL类和各种URL前缀的标准处理程序无法满足所有对low-level资源的访问,比如:没有标准化的 URL 实现可用于访问需要从类路径或相对于 ServletContext 获取的资源。并且缺少某些Spring所需要的功能,例如检测某资源是否存在等。而Spring的Resource声明了访问low-level资源的能力。

码云说的博客 632

告别臃肿VS!仅用Visual Studio 2022 Build Tools为Qt 5.12.12配置MSVC2017开发环境

本文详细介绍了如何仅使用Visual Studio 2022 Build Tools为Qt 5.12.12配置MSVC2017开发环境,避免安装臃肿的完整VS。通过精准选择组件、配置Qt Creator编译器和优化Kit设置,实现高效、精简的Windows平台Qt开发环境搭建,特别适合追求性能和资源优化的开发者。

weixin_30340617的博客 352

利用PLECS实现Boost变换器的闭环控制仿真与优化

本文详细介绍了如何利用PLECS仿真软件实现Boost变换器的闭环控制与优化。从基础原理到开环系统搭建,再到闭环控制设计与动态优化,提供了完整的仿真实践指南。通过PLECS的仿真功能,工程师可以有效诊断问题、优化参数,并实现高性能的DC-DC变换器设计。

weixin_42527401的博客 325

spring @Resource原理及自定义实现

spring @Resource原理及自定义实现

weixin_43931625的博客 1347

快速上手CH340N电路设计(CH340N USB转串口模块 USB Type-C接口 CH340系列芯片讲解)

一、上模块 二、功能分析 l 芯片:CH340N l 输入接口:USB、TYPE-C l 输出接口:TTL(5V\3.3V\GND\TX\RX) l 指示灯:电源、TX、RX 三、CH340x芯片 l CH340 是一个 USB 总线的转接芯片,实现 USB 转串口 l 全速 USB 设备接口,兼容 USB V2.0 l 硬件全双工串口,内置收发缓冲区,支持通讯波特率 50bps~2Mbps l 支持常用的 MODEM 联络信号 RTS、DTR、DCD、RI、DS...

东小东博客 5万+

【第18章】spring-resource

在Spring框架中,Resource是一个关键组件,它位于org.springframework.core.io包中,用于处理资源的加载和访问。Resource接口为资源提供了一个抽象的表示,这些资源可以是文件、类路径上的资源、URL等。通过这个接口,Spring提供了一种统一的方式来加载和操作这些资源,无论它们实际上存储在哪里。Resource接口的主要实现类包括:ClassPathResource:表示类路径下的资源。它使用线程上下文类加载器、给定的类加载器或给定的类来加载资源。

zjg 889

从零开始搭建一个高性能电流镜:手把手教你设计Wide-Swing Cascode结构

本文详细解析了Wide-Swing Cascode电流镜的设计原理与实战流程。针对低压高性能模拟电路设计的核心挑战,文章手把手指导如何从理论分析、参数计算到仿真验证,搭建一个兼具高输出阻抗和低输出电压裕度的电流镜结构,并深入探讨了偏置电路生成、性能优化及版图匹配等关键要点。

weixin_29294975的博客 628

VIVADO网表文件DCP和EDF

为了便于模块化设计,同时保护自己的知识产权,Xilinx VIVADO 提供两种代码封装方法:DCP文件和edf文件。

u014035968的博客 1万+

spring的核心特性Resource

摘要: Spring的Resource是统一资源访问的核心抽象,支持多种来源(classpath、文件系统、URL等),为IoC/AOP等特性提供基础支持。其核心方法如exists()、getInputStream()屏蔽了资源差异,实现安全访问。主要实现包括ClassPathResource(类路径)、FileSystemResource(文件系统)、UrlResource(网络)、ServletContextResource(Web)及流式资源适配器(InputStreamResource需注意单次读取

weixin_71449636的博客 817

PCL 改进快速欧式聚类【2025最新版】

在FEC: Fast Euclidean Clustering for Point Cloud Segmentation一文的基础上对算法进行改进。博客长期更新,本文最近更新时间为:2025年9月16日。

点云侠的博客 2570

Spring的资源访问接口---Resource

转载自:https://www.2cto.com/kf/201803/731102.html JDK提供的访问资源的类(File等)不能很好满足各种某些资源的访问需求。比如缺少从类路径和Web容器的上下文中获取资源的资源操作类。Spring的Resource接口提供了更好用的资源访问能力。Spring使用Resource访问各种资源文件,配置文件资源,国际化属性资源等。 Resource.java...

sxudong2010的博客 307

UFAST车道线检测 Ultra-Fast-Lane-Detection 从环境搭建到复现完成(一)

UFAST车道线检测 Ultra-Fast-Lane-Detection 从环境搭建到复现完成(一)

m0_46364958的博客 4345

R数据分析:广义估计方程式GEE的做法和解释

好久没有更新文章了,因为同学们咨询的问题有点多,另一个原因就是自己实在太懒。。。。 今天继续给大家写广义估计方程式GEE。 In statistics, a generalized estimating equation (GEE) is used to estimate the parameters of a generalized linear model with a possible unknown correlation between outcomes. 上面的英文解释告诉我们,当我们

Codewar的博客 1万+

【Spring系列】- ApplicationContext

ApplicationContext构建于BeanFactory之上,除了拥有BeanFactory支持的所有功能之外,还进一步扩展了基本容器的功能,包括BeanFactoryPostProcessor、BeanPostProcessor以及其他特殊类型bean的自动识别、容器启动后bean实例的自动初始化、国际化的信息支持、容器内事件发布等

m0_68383079的博客 1146

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

spring resource

1.resource的前生后世 前生:public interface Resource extends InputStreamSource public interface InputStreamSource { /** * Return an {@link InputStream}. * <p>It is expected...

150

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

如何使用Spring Boot轻松实现国际化和本地化

轻松实现国际化

做一个有思想的技术人 4108

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

application yml如何用spring xml 配出来_【修炼内功】[spring-framework][1]Resource

阅读源码是一件极其枯燥无比的事情,对于使用频率较高的组件,如果能做到知其然且知其所以然,这对日常工作中不论是问题排查、代码优化、功能扩展等都是利大于弊的,如同老司机开车(对,就是开车),会让你有一种参与感,而不仅仅把它当成一种工具,若能习之精髓、学以致用,那便再好不过!从工作之初便开始接触Spring框架,时至今日也没有认真地正视过它的实现细节,今日开拔,希望能够坚持下来~对于Spring如此“庞...

weixin_31842821的博客 189

.net framework standard core_【修炼内功】[spring-framework][1]Resource

阅读源码是一件极其枯燥无比的事情,对于使用频率较高的组件,如果能做到知其然且知其所以然,这对日常工作中不论是问题排查、代码优化、功能扩展等都是利大于弊的,如同老司机开车(对,就是开车),会让你有一种参与感,而不仅仅把它当成一种工具,若能习之精髓、学以致用,那便再好不过!从工作之初便开始接触Spring框架,时至今日也没有认真地正视过它的实现细节,今日开拔,希望能够坚持下来~对于Spring如此“庞...

weixin_39637363的博客 161

Spring 6 资源Resources 相关操作

Java全能学习+面试指南:https://javaxiaobear.cn1、Spring Resources概述Java的标准java.net.URL类和各种URL前缀的标准处理程序无法满足所有对low-level资源的访问,比如:没有标准化的 URL 实现可用于访问需要从类路径或相对于 ServletContext 获...

weixin_28752627的博客 163
上一篇: 戏说领域驱动设计(五)——子域
下一篇: 2022年了有哪些值得推荐的.NET ORM框架?
pythonxxoo
博客等级 码龄5年 337粉丝 670原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值