新文章
大语言模型
使用 Assert 断言
使用语义化的模型转换
1 |
|
ORM 还是 半ORM?
Mybatis 是半 orm 的框架,orm 的代表框架为 JPA. orm 与数据库高度解耦,只需要指定数据库即可,而 Mybatis 需要依赖数据库书写 SQL, 所以 orm 适合一些数据量小,无多表关联,数据库接口不稳定的项目
获取类路径下的资源
需要介绍一下以下的几个概念:
ClassLoader: 在Java中,ClassLoader(类加载器)是一个重要的组件,它用于加载Java类文件到Java虚拟机(JVM)中以进行执行。ClassLoader的主要功能是动态地查找和加载Java类,使Java程序可以在运行时加载和使用类,而不需要在编译时将所有类都包含在一个单独的文件中。一旦获得了类加载器,通常可以使用该类加载器来获取类路径上的资源。类加载器提供了一种方便的机制,用于查找和加载类路径中的资源。一般情况下,可以使用类加载器的
getResource()或getResourceAsStream()方法来获取资源的 URL 或输入流,这使得在类路径上查找和访问资源变得相对容易。
获取 ClassLoader 的方法
通过类的getClassLoader()方法:在任何类的实例上,您可以调用getClassLoader()方法来获取加载该类的类加载器。例如:
1 | ClassLoader classLoader = YourClass.class.getClassLoader(); |
这将返回加载YourClass类的类加载器。
通过当前线程的上下文类加载器:可以使用Thread.currentThread().getContextClassLoader()来获取当前线程的上下文类加载器。这在某些情况下很有用,特别是在多线程应用中,因为线程的上下文类加载器可以用于加载资源。
1 | ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); |
通过系统类加载器:可以使用ClassLoader.getSystemClassLoader()来获取系统类加载器,也称为应用程序类加载器。
1 | ClassLoader classLoader = ClassLoader.getSystemClassLoader(); |
这将返回应用程序类加载器,通常用于加载应用程序的类。
通过类的静态方法:某些类加载器的实例可以通过静态方法获得,例如ClassLoader.getSystemClassLoader()用于获取系统类加载器,ClassLoader.getPlatformClassLoader()用于获取平台类加载器。这些方法适用于特定的类加载器类型。
1 | ClassLoader classLoader = ClassLoader.getSystemClassLoader(); |
获取类路径下的资源
- 使用ClassLoader的getResource()方法:
1 | ClassLoader classLoader = YourClass.class.getClassLoader(); |
这将返回资源的URL。请替换 "path/to/resource/file.ext" 为您要查找的资源路径。
- 使用ClassLoader的getResourceAsStream()方法:
1 | ClassLoader classLoader = YourClass.class.getClassLoader(); |
这将返回资源的输入流,您可以使用它来读取资源内容。
- 使用Class的getResource()方法:
1 | URL resourceURL = YourClass.class.getResource("/path/to/resource/file.ext"); |
请在路径前加上斜杠 /,以确保从类路径的根目录开始查找资源。
- 使用Class的getResourceAsStream()方法:
1 | InputStream resourceStream = YourClass.class.getResourceAsStream("/path/to/resource/file.ext"); |
同样,请在路径前加上斜杠 /。
- 使用系统属性 “user.dir” 来获取当前工作目录:
1 | String currentDirectory = System.getProperty("user.dir"); |
SpringBoot 中获取类路径下的资源
- 使用
ResourceLoader注入:Spring Boot允许您在应用程序中注入ResourceLoader,以便轻松获取资源。您可以在任何Spring管理的组件(如Service、Controller等)中注入ResourceLoader,然后使用它来获取资源。例如:
1 |
|
使用classpath:前缀指定资源位于类路径中。
- 使用
Resource注入:您还可以直接注入Resource类型的Bean,这使您可以在整个应用程序中方便地获取资源。首先,确保您的Spring Boot应用程序上下文中已经配置了资源加载器,并且可以使用@Autowired注解注入Resource类型的Bean。
1 |
|
Spring Boot会自动配置Resource以便访问类路径资源。
- 使用
ResourceUtils工具类:Spring Boot还提供了一个方便的ResourceUtils工具类,可以用于获取类路径上的资源。例如:
1 | Resource resource = ResourceUtils.getURL("classpath:templates/pdf_templates/PDF模板.pdf" ); |
这些方式都让您能够轻松地获取类路径上的资源,并且与Spring Boot的资源加载机制集成得很好。选择其中一种方式,根据您的应用程序和编码风格的需要。
- ClassPathResource
1 | ClassPathResource resource = new ClassPathResource("templates/pdf_templates/PDF模板.pdf"); |
开发常见错误:
点赞的并发问题: 连续点击点赞按钮可能会造成点赞数累加到额外情况
分析: 其实就是多线程的安全问题,对于共享资源(用户是否点赞)没做同步处理(synconized(user))
