大语言模型

星火

使用 Assert 断言

使用语义化的模型转换

1
2
3
4
5
6
7
8
9
10
11
12
13
@PostMapping
public User addUser(UserInputDTO userInputDTO){
User user = convertFor(userInputDTO);

return userService.addUser(user);
}

private User convertFor(UserInputDTO userInputDTO){

User user = new User();
BeanUtils.copyProperties(userInputDTO,user);
return user;
}

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();
获取类路径下的资源
  1. 使用ClassLoader的getResource()方法
1
2
ClassLoader classLoader = YourClass.class.getClassLoader();
URL resourceURL = classLoader.getResource("path/to/resource/file.ext");

这将返回资源的URL。请替换 "path/to/resource/file.ext" 为您要查找的资源路径。

  1. 使用ClassLoader的getResourceAsStream()方法
1
2
ClassLoader classLoader = YourClass.class.getClassLoader();
InputStream resourceStream = classLoader.getResourceAsStream("path/to/resource/file.ext");

这将返回资源的输入流,您可以使用它来读取资源内容。

  1. 使用Class的getResource()方法
1
URL resourceURL = YourClass.class.getResource("/path/to/resource/file.ext");

请在路径前加上斜杠 /,以确保从类路径的根目录开始查找资源。

  1. 使用Class的getResourceAsStream()方法
1
InputStream resourceStream = YourClass.class.getResourceAsStream("/path/to/resource/file.ext");

同样,请在路径前加上斜杠 /

  1. 使用系统属性 “user.dir” 来获取当前工作目录
1
2
3
String currentDirectory = System.getProperty("user.dir");
String resourcePath = currentDirectory + "/src/main/resources/path/to/resource/file.ext";
File resourceFile = new File(resourcePath);
SpringBoot 中获取类路径下的资源
  1. 使用ResourceLoader注入:Spring Boot允许您在应用程序中注入ResourceLoader,以便轻松获取资源。您可以在任何Spring管理的组件(如Service、Controller等)中注入ResourceLoader,然后使用它来获取资源。例如:
1
2
3
4
5
6
7
@Autowired
private ResourceLoader resourceLoader;

public void loadResource() {
Resource resource = resourceLoader.getResource("classpath:templates/pdf_templates/PDF模板.pdf");
// 执行操作,如获取资源的URL或InputStream
}

使用classpath:前缀指定资源位于类路径中。

  1. 使用Resource注入:您还可以直接注入Resource类型的Bean,这使您可以在整个应用程序中方便地获取资源。首先,确保您的Spring Boot应用程序上下文中已经配置了资源加载器,并且可以使用@Autowired注解注入Resource类型的Bean。
1
2
3
4
5
6
@Autowired
private Resource myResource;

public void loadResource() {
// 执行操作,如获取资源的URL或InputStream
}

Spring Boot会自动配置Resource以便访问类路径资源。

  1. 使用ResourceUtils工具类:Spring Boot还提供了一个方便的ResourceUtils工具类,可以用于获取类路径上的资源。例如:
1
2
Resource resource = ResourceUtils.getURL("classpath:templates/pdf_templates/PDF模板.pdf"	);
// 执行操作,如获取资源的URL或InputStream

这些方式都让您能够轻松地获取类路径上的资源,并且与Spring Boot的资源加载机制集成得很好。选择其中一种方式,根据您的应用程序和编码风格的需要。

  1. ClassPathResource
1
2
ClassPathResource resource = new ClassPathResource("templates/pdf_templates/PDF模板.pdf");
InputStream inputStream = resource.getInputStream();

开发常见错误:

点赞的并发问题: 连续点击点赞按钮可能会造成点赞数累加到额外情况

分析: 其实就是多线程的安全问题,对于共享资源(用户是否点赞)没做同步处理(synconized(user))