Spring学习笔记-1

本文最后更新于:2023年6月7日 晚上

开发环境搭建

我选择的IDEvscode,原因是轻巧、简单、好用(最重要的是免费),不过在进行开发之前,我们需要对vscode进行一些环境搭建和配置。
如何在vscode上面编写Java程序和编写Spring Boot项目,在vscode的官方文档中都能够找到,在这里放出链接:

  • Setting up VS Code for Java development
  • Spring Boot in Visual Studio Code
    在搭建环境过程中如果遇到问题,请善用搜索引擎或者技术群群友
    根据上面两个网站走完流程,应该能够成功启动一个Spring Boot项目。
    当然了,如果不想自己创建一个Spring Boot应用的话,也可以直接使用git clone拉一个项目直接运行测试结果,这里以https://github.com/spring-guides/gs-spring-boot.git为例。
    使用Ctrl+Shift+P打开命令面板,输入git clone,然后输入https://github.com/spring-guides/gs-spring-boot.git,选好文件夹,等待完成即可。
    拉取完成之后,切换到左边侧栏的Spring Boot Dashboard面板,里面应该会自动更新,参考下图:
    1638
    我们可以直接从APPS里面启动我们想要启动的应用,这里我启动的是spring-boot-complete,启动完成后参考下图:
    1638

SpringBoot配置

自定义配置类

Spring 3.0之后,不再需要XML配置文件了,可以使用@Configuration注解来代替XML配置文件。而@SpringBootConfiguration是Spring Boot应用的专用配置类注解,其作用等效于@Configuration,用哪个都可以。
Spring 3.0+中有一整套的注解来代替XML配置文件中的定义,如@Bean等。

导入配置

Spring Boot会自动扫描当前包下的配置类,但是如果配置类在其他子包中,又或者在依赖的jar包中,我们就需要手动导入配置类,使用@Import注解来导入配置类。
不过@SpringBootApplication注解包含了@ComponentScan注解并扫描所有子包目录,所以一般来说即使配置类在其他子包中,我们也不需要自己导入配置类。必要时,直接使用@ComponentScan来添加要扫描的路径,会比@Import方便。
如果这些配置类都在类扫描路径下,就不需要通过@Import导入了。
Spring框架还提供了一个@ImportResource注解,可以用于导入额外的XML配置文件,指定要导入的文件路径即可。

配置文件

配置文件有两种格式,一种是.properties格式:

1
2
3
4
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/db_example
spring.datasource.username=springuser
spring.datasource.password=ThePassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

另外一种是.yml格式:

1
2
3
4
5
6
spring:
datasource:
url: jdbc:mysql://${MYSQL_HOST:localhost}:3306/db_example
username: springuser
password: ThePassword
driver-class-name: com.mysql.cj.jdbc.Driver

.yml格式的格式说明:

  • 键冒号后面需要带一个空格
  • 每个层级的缩进用两个空格
    需要注意的是.yml配置文件不支持@PropertySource注解来导入配置,但是可以使用@ConfigurationProperties注解。

配置绑定

参数绑定

首先编写application.yml配置文件:

1
2
3
4
5
6
7
8
9
user:
name: Maple
age: 18
params:
first: China
second: 2
accountInf:
account: 123456
password: 123456

然后新建UserProperties参数类进行参数绑定:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Data
@ConfigurationProperties(prefix = "user")
public class UserProperties {
private String name;
private int age;
private Map<String, String> params;
private AccountInf accountInf;
}

@Data
class AccountInf {
private String account;
private String password;
}

注意一下一般参数类的命名规范:XxxProperties
使用@ConfigurationProperties注解可以将配置参数映射到一个Java Bean上,该注解中的prefixvalue参数用于指定要映射的参数前缀,前缀格式为英文小写,多个前缀以-分隔。
因为@ConfigurationProperties注解绑定配置参数需要用到类的setter方法,所以这里用了@Data注解。Lombok中的@Data注解用于在编译的时候生成类的settergetter、构造器、toString等方法。
然后在启动类上添加@EnableConfigurationProperties注解,用于指定要启用的@ConfigurationProperties参数类,使其生效:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@SpringBootApplication
@RequiredArgsConstructor
@EnableConfigurationProperties(value = { UserProperties.class })
@Slf4j
public class DemoApplication {

private final UserProperties userProperties;

@Bean
public CommandLineRunner commandLineRunner() {
return (args) -> {
log.info("user properties: {}", userProperties);
};
}

public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}

}

乱七八糟的

其实这里放的是我看一个项目时候顺道学习的东西

AOP面向切面编程

先上在哪看的概念(公众号:CoderLi):AOP 概念篇
AOP就是Aspect Oriented Programming的缩写,也就是面向切面编程,是Spring(注意不是Spring Boot)框架中的一个重要内容。
ok,不整这些看了有的没的东西,对我来说,它十分像C#中的委托。首先,我们在某个业务类中有某个业务方法,在执行这个方法前,我们需要进行检查(或说执行某个方法),在执行完这个方法后,我们也需要进行检查(或说执行另一个方法),这时候我们还有另外一个业务类和业务方法,它也需要和前面所说的那样做,那为了这里能够减少重复工作量,AOP就是为此而生的(确信),它先把执行前和执行后要执行的检查提取出来,如果有什么地方需要用的,直接进行注入即可。
一个流行的Java AOP框架就是AspectJ,那么在我这个项目里用到的也是它。
AOP相关的概念有(此处出自上面文章,我怕上边文章哪天挂了看不到了):

  • 连接点:程序执行的某个特定位置,比如某个方法调用前、调用后,方法抛出异常后,对类成员的访问以及异常处理程序块的执行等。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就是连接点。它自身还可以嵌套其他的 Joinpoint。AOP 中的 Joinpoint 可以有多种类型:构造方法调用,字段的设置和获取,方法的调用,方法的执行,异常的处理执行,类的初始化。Spring 仅支持方法执行类型的 Joinpoint。
  • 切点:如果连接点相当于数据中的记录,那么切点相当于查询条件,一个切点可以匹配多个连接点。所以切点表示一组 Joinpoint ,这些 Jointpoint 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
  • 通知:是织入到目标类连接点上的一段程序代码。Spring 提供的通知接口都是带方位名的,如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice 等。我们通过 AOP 将横切关注功能加到原有的业务逻辑上,这是对原有业务逻辑的一种增强,可以是前置、后置、返回后、抛出异常时等。其实 Advice 翻译成“增强”更合理,更能准确表达其本质。既然大部分文献都是称为通知,我们这里也称为通知。
  • 织入(注入):织入是将Advice通知添加到目标类具体连接点上的过程。编译器织入、动态织入。
  • Aspect 切面:Pointcut(切点)和Advice(通知)组成的

SpringBoot工程结构

这部分我直接向ChatGPT发起提问,以下是得到的回答:

在一个Spring Boot工程中,通常会使用一些常见的文件夹来存放特定类型的文件,这样可以更好地组织代码和资源。以下是这些文件夹的作用及其用途的简要说明:

  1. config 文件夹:这个文件夹通常用来存放一些配置文件,例如数据库配置文件、缓存配置文件、Spring配置文件等。在Spring Boot中,我们通常会使用Java类来代替传统的XML配置文件,这些Java类通常位于config文件夹中。
  2. controller 文件夹:这个文件夹通常用来存放控制器(Controller)类,这些类用于处理HTTP请求并返回HTTP响应。控制器类通常是Spring MVC应用程序的核心,用于解析和处理请求,调用其他的服务层(Service)和数据访问层(DAO)类,并最终返回响应。
  3. dao 文件夹:这个文件夹通常用来存放数据访问对象(Data Access Object,DAO)类。DAO类通常是用于访问持久化存储层(例如数据库)的类。这些类通常封装了访问数据的逻辑,并与其他层(例如服务层)进行协作,从而实现应用程序的业务逻辑。
  4. handler 文件夹:这个文件夹通常用来存放异常处理器(Exception Handler)类。异常处理器类用于捕获和处理应用程序中的异常,并将它们转换为适当的HTTP响应。异常处理器通常会拦截控制器抛出的异常,根据异常的类型生成适当的HTTP响应,并将其发送回客户端。
  5. service 文件夹:这个文件夹通常用来存放服务层(Service)类。服务层类用于实现应用程序的业务逻辑。这些类通常封装了业务逻辑,并与其他层(例如数据访问层)进行协作,从而实现应用程序的功能。
  6. utils 文件夹:这个文件夹通常用来存放工具类(Utility Class)。工具类通常包含了一些静态方法,用于执行一些通用的、可重用的功能。例如,可以编写一个StringUtils类,其中包含一些静态方法,用于执行字符串操作。
  7. vo 文件夹:这个文件夹通常用来存放值对象(Value Object,VO)类。值对象通常是一些简单的Java类,用于传递数据。它们通常用于在不同层之间传递数据,例如在控制器层和服务层之间。值对象通常不具有行为,而只包含一些属性和getter/setter方法。
    那么在某些文件夹中还存在子文件夹,同样的,我向ChatGPT发起提问,问它dao文件夹下的mapperpojo文件夹是什么:
    是的,通常情况下在 dao 文件夹下会再次细分为 mapperpojo 文件夹。
  8. mapper 文件夹:该文件夹通常包含一些MyBatis的 Mapper 接口,这些接口用于定义数据访问的 SQL 操作。MyBatis 是一种流行的持久化框架,它使用 XML 或注解来映射 Java 对象和数据库表之间的关系。在 mapper 文件夹中,通常会创建一个接口,该接口定义了一组与数据库交互的方法,例如插入数据、更新数据、查询数据等。同时,MyBatis 还提供了一些注解来描述 SQL 语句,例如 @Select@Update@Insert 等,这些注解通常会与接口方法一起使用。
  9. pojo 文件夹:该文件夹通常包含一些与数据库表对应的 Java 类,也称为实体类或 POJO(Plain Old Java Object)类。这些类通常与数据库表的每个字段对应,每个字段通常会映射到类中的一个属性。这些类通常使用注解来描述它们与数据库表之间的映射关系,例如 @Table@Column 等。在访问数据库时,这些类通常用于存储和传输数据。同时,为了方便使用,通常还会在这些类中提供一些 getter 和 setter 方法。
    综上所述,mapper 文件夹通常包含与数据库交互相关的 MyBatis Mapper 接口和 SQL 语句的注解,而 pojo 文件夹通常包含与数据库表对应的 Java 实体类或 POJO 类。这两个文件夹通常一起使用,以实现应用程序与数据库的数据访问。
    继续提问service文件夹下的子文件夹:
    通常情况下,在 service 文件夹下会再次细分为 excelimplthread 文件夹。
  10. excel 文件夹:该文件夹通常包含一些处理 Excel 文件的类,例如读取 Excel 文件、写入 Excel 文件、生成 Excel 报表等。在这个文件夹中,通常会使用一些第三方的 Excel 处理库,例如 Apache POI、EasyExcel 等。通过这些库,我们可以方便地读取和写入 Excel 文件,并在应用程序中对 Excel 数据进行处理和分析。
  11. impl 文件夹:该文件夹通常包含一些服务接口的实现类,这些实现类通常与数据库交互,并提供业务逻辑的处理。在这个文件夹中,通常会创建一些与服务接口相对应的实现类,这些实现类通常使用 Spring 框架的注解来标识自己,并与数据库访问相关的 DAO 层进行协作。通过这些实现类,我们可以将服务接口中定义的业务逻辑转化为实际的代码实现,并与数据库进行交互。
  12. thread 文件夹:该文件夹通常包含一些与多线程编程相关的类,例如线程池、任务队列、定时任务等。在这个文件夹中,通常会使用 Java 的多线程编程机制来实现一些并发操作,例如通过线程池来管理并发请求,通过任务队列来实现异步处理等。通过这些类,我们可以提高应用程序的并发性能,并更好地利用多核 CPU 的计算资源。
    综上所述,excel 文件夹通常包含处理 Excel 文件的类,impl 文件夹通常包含服务接口的实现类,thread 文件夹通常包含与多线程编程相关的类。这三个文件夹通常一起使用,以实现应用程序的业务逻辑处理和并发处理。
    继续提问,vo文件夹下的dosexcelVoparamQuesVo是什么:
    在 Spring Boot 项目中,通常会使用 VO(Value Object,值对象)模式来传递数据,这种模式可以将多个实体类的属性组合成一个对象,便于传递和操作。在 vo 文件夹中,通常会包含一些用于传递数据的 VO 类,例如:
  13. DoDo 表示 Domain Object,是实体类(Entity)的一种命名方式,通常用于表示数据库中的一张表或者一组相关的表。Do 对象通常包含数据库表的所有字段,以及相应的 getter 和 setter 方法。
  14. ExcelVo:在实际开发中,经常需要将数据导出为 Excel 文件或者从 Excel 文件中导入数据。为了方便数据的导入导出,我们可以定义一个 ExcelVo 类,用于存储导出或者导入的数据,并在类中定义相应的属性和方法,以方便操作。
  15. ParamParam 表示 Parameter,用于封装方法调用所需的参数,通常是一个 Java Bean,包含多个属性和相应的 getter 和 setter 方法。
  16. QuesVo:在实际开发中,经常需要处理问卷调查相关的数据。为了方便数据的传递和操作,我们可以定义一个 QuesVo 类,用于封装问卷调查相关的数据,例如问卷标题、问题列表、答案选项等。
    综上所述,vo 文件夹下的 DoExcelVoParamQuesVo 分别表示数据库实体类、Excel 数据、方法参数和问卷调查相关数据的 VO 类,它们用于传递和操作相应的数据。

可能有用的写法

List转换成流获取指定属性

1
2
List<User> users = userMapper.selectList();
List<String> ids = users.stream().map(User::getId).collect(Collectors.toList());

List转换成流再用过滤器过滤获取指定数据

1
2
3
// 假设用户类型type = 0为管理员,type = 1为普通用户
List<User> users = userMapper.selectList();
List<User> admin = users.stream().filter(e -> Objects.equals(e.getType(), 0).collect(Collectors.toList());

使用stream进行数据分组

1
2
3
4
5
// 根据用户的年龄进行分组
List<User> users = userMapper.selectList();
Map<String, List<User>> collect = users.stream().collect(Collectors.groupingBy(User::getAge));
// 再将其中所有值提取出来,重新组成一个List
List<List<User>> collectList = new ArrayList<>(collect.values());

使用stream的groupBy统计数据

1
2
3
4
5
6
7
8
9
10
// 根据用户的性别进行分组,并统计个分组的数据总数
List<User> users = userMapper.selectList();
Map<String, Long> aLong = users.stream().collect(Collectors.groupingBy(User::getSex,Collectors.counting()));
// 要访问其中的数据,使用foreach
for (String key: aLong.keySet()){
System.out.println(key + ": " + aLong.getKey(key));
}
aLong.forEach((k, v) -> {
System.out.println(k + ": " + v);
});

js计算百分比

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 计算百分比
* @param {number} num 分子
* @param {number} total 分母
* @returns {number} 返回数百分比
*/
function Percentage(num, total) {
if (num == 0 || total == 0){
return 0;
}
return (Math.round(num / total * 10000) / 100.00);// 小数点后两位百分比
}

Excel表相关

合并相同垂直列写法:

1
@Excel(name='xxx', mergeVertical=true)

依赖某一列来合并写法:

1
@Excel(name = "报表类型", mergeRely = {0}, mergeVertical = true)

el-date-picker相关

1
2
3
4
5
6
以下两句不加的话,发送的载荷里面显示的日期会往前一天,但是到后端其实又没问题,不是很懂
<el-date-picker
...
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
></el-date-picker>

这里有一只爱丽丝

希望本文章能够帮到您~


Spring学习笔记-1
https://map1e-g.github.io/2023/04/26/spring-learning-1/
作者
MaP1e-G
发布于
2023年4月26日
许可协议