一起进阶学习JAVA:Spring boot 基本应用
什么是Spring boot
Spring boot是一个轻量级框架,可以简化Spring应用的搭建和开发。
Spring的优缺点
Spring是一个成熟而优秀的开源框架,既然已经是一个成熟而优秀的,那么为什么还要用Spring boot呢?首先得从Spring的优缺点来看。
Spring的优点
Spring是Java企业级也就是J2EE的轻量级替代品。无需开发重量级的Enterprise JavaBean(EJB),SPringle为企业级java开发提供了一种相对简单的开发方法,通过依赖注入(IOC)和面向切面编程(AOP),用简单的Java对象实现了EJB的功能
Spring的缺点
Spring虽然是轻量级的,但是Spring的配置文件却是相当重量级的。最开始Spring使用XML配置,而且在我们开发过程中会配置很多的XML,但是在后来Java引用了基于注解的组件扫描以及基于Java的配置,这是一种类型安全的可重构的配置方式,相当大程度上替代了XML配置的方式。但是这些配置换来的却是开发效率上的损耗。
在Spring的依赖管理上面,开发人员在开发项目的时候需要考虑分析导入与之有依赖关系的的其他库的坐标,一旦选择了错误了依赖库版本会导致各种兼容性上面的问题。排查解决这些问题往往会严重阻碍项目的开发进度。
Spring boot如何解决上述Spring存在的相关问题
Spring boot针对上述Spring出现的问题使用了约定优于配置的思想,可以让开发人员不必在配置与业务逻辑之间进行思维切换
约定优于配置(Convention over Configuration)
约定优于配置(Convention over Configuration),又称约定式编程,是一种软件设计范式。
约定优于配置相当于一个架构师在搭建项目的时候就给开发人员制定出一套规范,比如:模型中有一个名为User的类,那么在我们数据库中与之对应的表的表名就必须为User,只有在实际业务环境中却是需要偏离该规范,那么我们才会对其进行额外的配置。
除了约定优于配置之外,Spring boot还使用了起步依赖以及自动配置的方式。
起步依赖
起步依赖本质上是一个Maven项目的对象模型(Project Object Model҅, POM),定义了对其他库的传递依赖,这些东西加在一起即可支持某项功能。
简单来说,就是把具备某种功能的依赖坐标打包在一起,并提供一些默认功能。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
在spring-boot-starter-parent里就打包了许多基础依赖坐标。
自动配置
Spring boot会自动将一些配置类的bean注册到Ioc容器中,我们在需要的地方使用@autowired或者@resource等注解就可以直接使用。这样我们只需要引入我们需要使用的包,相关的配置我们完全可以不用管,Spring boot会自动注入这些配置bean。
Spring boot的特点
- 可以基于Maven、Gradle等插件创建独立的Spring应用以及创建可执行得Jar、War文件。
- 内嵌Tomcat、Jetty、 Undertow等Servlet容器(无需部署war文件)。
- 提供自动配置的starters 简化构建配置
- 尽可能自动配置spring应用。
- 提供生产指标,例如指标、健壮检查和外部化配置
- 完全没有代码生成和XML配置要求
使用IDEA快速搭建Spring boot项目
- 打开File 》New 》Project…
- 左侧选择Spring Initializr 》选择 Project SDK 》Next(需要保持电脑联网状态,不然点击Next后会卡在检索界面)
- 配置项目信息,然后点击Next
- 配置需要得组件,比如Web组件,持久层组件,测试方面等组件,持久层组件需要勾选驱动,然后点击Next
- 设置项目名和存放路径,点击Finish完成Spring boot项目创建
- 创建成功后IDEA会自动为我们生成项目目录结构
Spring boot 热部署
开发过程中,通常会对业务逻辑代码进行不断的修改测试,在修改后往往需要重启服务,特别是当项目体量较大并且项目启动时间较长的时候,可能我们仅仅修改了某一行代码或者加上某行调试日志代码以及对前端代码进行小幅度的修改,我们都需要重新启动项目,这样的重复操作会极大的降低程序的开发效率,Spring boot框架专门提供了进行热部署的依赖启动器,让我们无需手动重启项目。
- 在pom文件中添加spring-boot-devtools热部署依赖启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
- 在IDEA工具下我们还需要单独配置IDEA的相关功能,选择IDEA界面的File 》Settings打开Compiler面板
- 选择Build 》Compiler,勾选Build project automatically将项目设置为自动编译,然后点击Apply 》OK进行保存
- 在任意界面中使用快捷键Ctrl+Shift+Alt+/ 打开 Maintenance选项框,选中打开Registry面板
- 找到并勾选compiler.automake.allow.when.app.running指定IDEA工具在成语运行过程中自动编译,选择Close关闭即可
Spring boot的配置文件
Spring boot使用一个applicaton.properties 或 application.yaml的配置文件作为全局配置文件来对默认配置值进行修改替换。该文件一般存放在src/main/resource 目录或者类路径的 /config下,但是一般开发环境会选择存放在resources目录下。
applicaton.properties配置文件
我们一般在这类配置文件中去定义Spring boot的相关属性,比如系统属性、环境变量等,也可以自定义配置属性,如数据库相关属性:
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
自定义配置属性:
- 基本类型数据可以直接设置:
custom.attribute=1
custom.attribute2=aaabbbccc
- 列表和数组类型的数据使用都好分隔
custom.attributeList=value1,value2,value3
custom.attributeArray=value1,value2,value3
- Map类型的数据使用key=value方式配置
custom.map.attribute.key1=value1
custom.map.attribute.key2=value2
- 对象类型的数据使用对象名.属性的方式配置
custom.object.xxx.attribute1=value1
custom.objet.xxx.attribute2=value2
application.yaml配置文件
- 基本类型数据可以直接设置:
custom:
attribute: 1
custom:
attribute: aaabbbccc
- 列表和数组类型的数据使用缩进式或行内式,使用带-的一定记得-后面必须加一个空格
custom:
listAndArrary:
attribute:
- value1
- value2
- value3
custom:
listAndArrary:
attribute:
value1,
value2,
value3
custom:
listAndArrary:
attribute: [value1,value2,value3]
- Map类型的数据使用缩进式或行内式的key=value方式配置
custom:
map:
attribute:
key1: value1
key2: value2
custom:
map:
attribute: {key1: value1,key2: value2}
- 对象类型的数据使用对象属性的方式配置
custom:
object:
attribute1: value1
attribute2: value2
attribute2: value3
使用yaml方式配置的时候尤其需要记得符号后面的空格书写
配置处理器
在编写配置文件的时候,很多情况下我们配置的都是我们对象中的自定义属性,Spring boot是无法自动识别并且迪士的的,为了提高我们的编写效率,在使用 @ConfigurationProperties 注解进行属性注入的时候我们可以添加配置处理器的依赖包来达到配置文件提示的功能
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
添加上述依赖后需要重新运行项目启动类或者是用Ctrl+F9进行项目重构方可生效
配置文件属性值注入
Spring boot提供了 @ConfigurationProperties注解用来快速、方便的将配置文件中的自定义属性批量注入到某个Bean对象中的多个对应属性当中去。
如上述提到的提供的配置文件:
@Component
@ConfigurationProperties(prefix = "custom") //将配置文件中以custom开头的属性值注入到该类中
public class Custom{
private int attribute;
private int attribute2;
private List attributeList;
//省略get和set方法
}
使用@ConfigurationProperties注解来进行属性注入必须提供set方法且属性名和配置必须一一对应
@ConfigurationProperties注解同时必须使用@Component将Bean组件放如Spring容器中方可生效
spring提供了 @Value 注解来读取配置文件中的属性来快速注入到Bean中,如下
@Component
public class Custom{
@Value("${custom.attribute}")
private int attribute;
@Value("${custom.attribute2}")
private int attribute2;
@Value("${custom.attributeList}")
private List attributeList;
}
使用@Value注解进行注入的时候也必须使用@Component将Bean组件放如Spring容器中方可生效,但是不需要提供set方法
自定义配置
在我们日常开发过程中可能会根据业务以及功能去分别编写不同的配置文件,这种情况下我们大多不会编写在全局配置文件application的配置文件种。
对于加载这种自定义配置文件,可以使用 @PropertySource注解结合 @Configuration注解的方式来实现。
@PropertySource注解用来指定自定义配置文件的具体位置和名称
@Configuration注解为了保证Spring boot能够扫描该注解
如:我们在resource目录下创建一个custom.properties的自定义配置文件
custom.attribute=1
custom.attribute2=aaabbbccc
编写配置类,提供自定义配置文件中的对应属性,使用@PropertySource完成注入
@Configuration //标明为自定义配置类
@PropertySource("classpath:custom.properties") //指定自定义配置文件的路径和名称
@EnableConfigurationProperties(Custom.class) //开启对应配置类的属性注入功能
@ConfigurationProperties(prefix = "custom") //将配置文件中以custom开头的属性值注入到该类中
public class Custom{
private int attribute;
private int attribute2;
private List attributeList;
//省略get set方法
}
使用@Configuration定义配置类
spring boot为我们提供了许多默认组件的配置类,但是除此之外根据我们的业务逻辑是还需要扩展配置类的,也就是说我们除了使用spring boot提供的配置类之外,我们自己还需要配置我们自己业务逻辑需要的配置类。
在spirng boot中我们可以使用**@Configuration **注解来定义一个配置类,Spring boot会自动扫描这些我们定义了 @Configuration注解的类来注册到Spring容器中,从而替换使用Spring框架开发时的XML配置。
在定义一个配置类后,我们需要在类方法上使用@Bean注解进行组件配置,将方法返回对象注入到Spring容器中,并且组件名称默认使用的时该方法的方法名,同时也可以使用 @Bean注解的name属性和value属性来自定义组件名称。
- 首先我们定义一个需要注册到Spring容器中的类,这是一个空的类,没有使用任何注解和XML配置文件,按照Spring的机制,它时无法被注入到Spring容器中的
public class MyService {
}
- 我们再来定义一个配置类,并使用 @Configuration注解来定义,然后使MyService对象成为一个方法的返回对象注入到Spring容器中
@Configuration //定义该类是配置类
public class MyConfig{
@Bean //将返回对象作为组件注入到Spring容器中,该组件的默认名称为方法名myService
public MyService myService(){
return new MyService();
}
}
随机数设置及参数间引用
在spring boot配置中除了使用上面提到的常规数值配置之外往往需要用到随机数值。
随机数值设置
在Spring boot配置文件中,随机值设置使用到了Spring boot内置的 RandomValuePropertySource类,对一些隐秘属性或者测试数据进行随机注入。
随机值设置的语法是 ${random.xxx},xxx表示需要指定生成的随机数类型和范围,他可以生成随机的整数、UUID或字符串
my.secret=${random.value} // 配置随机值
my.number=${random.int} // 配置随机整数
my.bignumber=${random.long} // 配置随机long类型整数
my.uuid=${random.uuid} // 配置随机uuid类型数
my.number.less.than.ten=${random.int(10)} // 配置小于10的随机整数
my.number.in.range=${random.int[1024,65536]} // 配置[1024-65536]之间的随机整数
上述为RandomValuePropertySource类中的random提供的随机数配置
参数间引用
在Spring boot中后一个配置的属性值是可以引用在这之前配置的其他的属性值
参数间引用的语法是 ${xxx},xxx表示先前在配置文件中配置的属性名
app.name=MyApp
app.description=${app.name} is a Spring Boot application