Spring学习笔记-1
本文最后更新于:2023年6月7日 晚上
开发环境搭建
我选择的IDE
是vscode
,原因是轻巧、简单、好用(最重要的是免费),不过在进行开发之前,我们需要对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
面板,里面应该会自动更新,参考下图:
我们可以直接从APPS
里面启动我们想要启动的应用,这里我启动的是spring-boot-complete
,启动完成后参考下图:
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 |
|
另外一种是.yml
格式:
1 |
|
.yml
格式的格式说明:
- 键冒号后面需要带一个空格
- 每个层级的缩进用两个空格
需要注意的是.yml
配置文件不支持@PropertySource
注解来导入配置,但是可以使用@ConfigurationProperties
注解。
配置绑定
参数绑定
首先编写application.yml
配置文件:
1 |
|
然后新建UserProperties
参数类进行参数绑定:
1 |
|
注意一下一般参数类的命名规范:XxxProperties
。
使用@ConfigurationProperties
注解可以将配置参数映射到一个Java Bean
上,该注解中的prefix
或value
参数用于指定要映射的参数前缀,前缀格式为英文小写,多个前缀以-
分隔。
因为@ConfigurationProperties
注解绑定配置参数需要用到类的setter
方法,所以这里用了@Data
注解。Lombok
中的@Data
注解用于在编译的时候生成类的setter
、getter
、构造器、toString
等方法。
然后在启动类上添加@EnableConfigurationProperties
注解,用于指定要启用的@ConfigurationProperties
参数类,使其生效:
1 |
|
乱七八糟的
其实这里放的是我看一个项目时候顺道学习的东西
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工程中,通常会使用一些常见的文件夹来存放特定类型的文件,这样可以更好地组织代码和资源。以下是这些文件夹的作用及其用途的简要说明:
config
文件夹:这个文件夹通常用来存放一些配置文件,例如数据库配置文件、缓存配置文件、Spring配置文件等。在Spring Boot中,我们通常会使用Java类来代替传统的XML配置文件,这些Java类通常位于config
文件夹中。controller
文件夹:这个文件夹通常用来存放控制器(Controller)类,这些类用于处理HTTP请求并返回HTTP响应。控制器类通常是Spring MVC应用程序的核心,用于解析和处理请求,调用其他的服务层(Service)和数据访问层(DAO)类,并最终返回响应。dao
文件夹:这个文件夹通常用来存放数据访问对象(Data Access Object,DAO)类。DAO类通常是用于访问持久化存储层(例如数据库)的类。这些类通常封装了访问数据的逻辑,并与其他层(例如服务层)进行协作,从而实现应用程序的业务逻辑。handler
文件夹:这个文件夹通常用来存放异常处理器(Exception Handler)类。异常处理器类用于捕获和处理应用程序中的异常,并将它们转换为适当的HTTP响应。异常处理器通常会拦截控制器抛出的异常,根据异常的类型生成适当的HTTP响应,并将其发送回客户端。service
文件夹:这个文件夹通常用来存放服务层(Service)类。服务层类用于实现应用程序的业务逻辑。这些类通常封装了业务逻辑,并与其他层(例如数据访问层)进行协作,从而实现应用程序的功能。utils
文件夹:这个文件夹通常用来存放工具类(Utility Class)。工具类通常包含了一些静态方法,用于执行一些通用的、可重用的功能。例如,可以编写一个StringUtils
类,其中包含一些静态方法,用于执行字符串操作。vo
文件夹:这个文件夹通常用来存放值对象(Value Object,VO)类。值对象通常是一些简单的Java类,用于传递数据。它们通常用于在不同层之间传递数据,例如在控制器层和服务层之间。值对象通常不具有行为,而只包含一些属性和getter/setter方法。
那么在某些文件夹中还存在子文件夹,同样的,我向ChatGPT发起提问,问它dao
文件夹下的mapper
和pojo
文件夹是什么:
是的,通常情况下在dao
文件夹下会再次细分为mapper
和pojo
文件夹。mapper
文件夹:该文件夹通常包含一些MyBatis的 Mapper 接口,这些接口用于定义数据访问的 SQL 操作。MyBatis 是一种流行的持久化框架,它使用 XML 或注解来映射 Java 对象和数据库表之间的关系。在mapper
文件夹中,通常会创建一个接口,该接口定义了一组与数据库交互的方法,例如插入数据、更新数据、查询数据等。同时,MyBatis 还提供了一些注解来描述 SQL 语句,例如@Select
、@Update
、@Insert
等,这些注解通常会与接口方法一起使用。pojo
文件夹:该文件夹通常包含一些与数据库表对应的 Java 类,也称为实体类或 POJO(Plain Old Java Object)类。这些类通常与数据库表的每个字段对应,每个字段通常会映射到类中的一个属性。这些类通常使用注解来描述它们与数据库表之间的映射关系,例如@Table
、@Column
等。在访问数据库时,这些类通常用于存储和传输数据。同时,为了方便使用,通常还会在这些类中提供一些 getter 和 setter 方法。
综上所述,mapper
文件夹通常包含与数据库交互相关的 MyBatis Mapper 接口和 SQL 语句的注解,而pojo
文件夹通常包含与数据库表对应的 Java 实体类或 POJO 类。这两个文件夹通常一起使用,以实现应用程序与数据库的数据访问。
继续提问service
文件夹下的子文件夹:
通常情况下,在service
文件夹下会再次细分为excel
、impl
和thread
文件夹。excel
文件夹:该文件夹通常包含一些处理 Excel 文件的类,例如读取 Excel 文件、写入 Excel 文件、生成 Excel 报表等。在这个文件夹中,通常会使用一些第三方的 Excel 处理库,例如 Apache POI、EasyExcel 等。通过这些库,我们可以方便地读取和写入 Excel 文件,并在应用程序中对 Excel 数据进行处理和分析。impl
文件夹:该文件夹通常包含一些服务接口的实现类,这些实现类通常与数据库交互,并提供业务逻辑的处理。在这个文件夹中,通常会创建一些与服务接口相对应的实现类,这些实现类通常使用 Spring 框架的注解来标识自己,并与数据库访问相关的 DAO 层进行协作。通过这些实现类,我们可以将服务接口中定义的业务逻辑转化为实际的代码实现,并与数据库进行交互。thread
文件夹:该文件夹通常包含一些与多线程编程相关的类,例如线程池、任务队列、定时任务等。在这个文件夹中,通常会使用 Java 的多线程编程机制来实现一些并发操作,例如通过线程池来管理并发请求,通过任务队列来实现异步处理等。通过这些类,我们可以提高应用程序的并发性能,并更好地利用多核 CPU 的计算资源。
综上所述,excel
文件夹通常包含处理 Excel 文件的类,impl
文件夹通常包含服务接口的实现类,thread
文件夹通常包含与多线程编程相关的类。这三个文件夹通常一起使用,以实现应用程序的业务逻辑处理和并发处理。
继续提问,vo
文件夹下的dos
、excelVo
、param
和QuesVo
是什么:
在 Spring Boot 项目中,通常会使用 VO(Value Object,值对象)模式来传递数据,这种模式可以将多个实体类的属性组合成一个对象,便于传递和操作。在vo
文件夹中,通常会包含一些用于传递数据的 VO 类,例如:Do
:Do
表示Domain Object
,是实体类(Entity)的一种命名方式,通常用于表示数据库中的一张表或者一组相关的表。Do
对象通常包含数据库表的所有字段,以及相应的 getter 和 setter 方法。ExcelVo
:在实际开发中,经常需要将数据导出为 Excel 文件或者从 Excel 文件中导入数据。为了方便数据的导入导出,我们可以定义一个ExcelVo
类,用于存储导出或者导入的数据,并在类中定义相应的属性和方法,以方便操作。Param
:Param
表示Parameter
,用于封装方法调用所需的参数,通常是一个 Java Bean,包含多个属性和相应的 getter 和 setter 方法。QuesVo
:在实际开发中,经常需要处理问卷调查相关的数据。为了方便数据的传递和操作,我们可以定义一个QuesVo
类,用于封装问卷调查相关的数据,例如问卷标题、问题列表、答案选项等。
综上所述,vo
文件夹下的Do
、ExcelVo
、Param
和QuesVo
分别表示数据库实体类、Excel 数据、方法参数和问卷调查相关数据的 VO 类,它们用于传递和操作相应的数据。
可能有用的写法
List转换成流获取指定属性
1 |
|
List转换成流再用过滤器过滤获取指定数据
1 |
|
使用stream进行数据分组
1 |
|
使用stream的groupBy统计数据
1 |
|
js计算百分比
1 |
|
Excel表相关
合并相同垂直列写法:
1 |
|
依赖某一列来合并写法:
1 |
|
el-date-picker相关
1 |
|
希望本文章能够帮到您~