文章目录
- 0 SpringBoot简介
- 1SpringBoot的创建和配置
- 1)SpringBoot的核心功能:
- 2 SpringBoot——缓存
- (1)Spring中缓存的使用
- (2)Spring中缓存实现原理
- 3 SpringBoot——定时任务
- (1)SpringBoot定时使用
- (2)SpringBoot定时任务实现原理
- 4 SpringBoot——监控
- (1)SpringBoot监控的使用
- 5 项目发布
- 6常用插件
- (1)RestfulToolkit
- (2)devtools——自动编译
- (3)Save Actions——格式化
0 SpringBoot简介
Spring Boot 是用来简化 Spring 的搭建和开发过程的全新框架。Spring Boot 去除了大量的 xml 配置文件,简化了复杂的依赖管理,配合各种 starter 使用,基本上可以做到自动化配置。Spring 可以做的事情,现在用 Spring boot 都可以做。
SpringBoot的优点:
- 创建项⽬⾮常快,⼏秒钟就可以搭建完成;
- 快速集成插件,Spring Boot 提供了⼊⻔依赖添加,⽤于快速的集成各种框架;
- 内置了 Web 容器(嵌入的Tomcat),运⾏更加⽅便;
- 提供了很多监控的指标;
- 可以完全使⽤代码的⽅式进⾏开发,⽽不需要 XML配置;
- 简化Maven 配置
- 自动配置Spring
1SpringBoot的创建和配置
SpringBoot 的创建⽅式有两种:
- IDEA 创建(推荐)
- 在线(⽹站)创建
参考博客:SpringBoot项目的创建及配置
1)SpringBoot的核心功能:
1)起步依赖 本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起支持某项功能。简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
2)SpringBoot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是Spring自动完成的。Spring可以自动配置一个bean和其他协作bean之间的关系。
Spring中的SPI机制:
SpringBoot提供了加载依赖包META-INFO文件夹中,很多配置文件(如Spring.factories
)的方式来实现配置类,及其他的启动时的初始化操作。
注:
JDK中也有SPI机制,ServiceLoader+解析文件(META-INFO/services/接口名),其中的文件内容为(接口全名=接口某个实现类)。
参考博客:SPI机制
注意
- SpringBoot默认使用
application.properties或者application.yml
作为SpringBoot项目的配置文件 - 启动类main必须要在某个包下,且SpringBoot会对启动类所在包进行扫描,若带有注解的类不在启动类所在的包目录下,则Bean容器不会实例化该类对象。
- SpringBoot中绑定了一些tomcat的API。SpringBoot是在Spring框架基础上进行的封装,又额外增加了tomcat等web相关的接口,所以可以实现类似tomcat的操作。
2 SpringBoot——缓存
缓存是指可以进⾏⾼速数据交换的存储器,使⽤它可以更快速的操作和访问数据。
应用程序未加入缓存时,用户访问数据时会直接访问数据库:
当加入缓存后,可以有效缓解数据库的压力:
缓存的优点:
- 使⽤缓存可以避免访问数据库,节省数据库服务器的资源;
- 性能更快,缓存属于内存级的服务器,⽽ DB 牵扯到更多的业务逻辑判断和磁盘操作,因此缓存的性能更⾼。
(1)Spring中缓存的使用
1)开启缓存
主启动器类上配置@EnableCaching
@SpringBootApplication
@EnableCaching // 开启缓存
public class MyfirstApplication {
public static void main(String[] args) {
SpringApplication.run(MyfirstApplication.class, args);
}
}
2) 缓存的操作方法:添加、修改、删除
@Cacheable:查询
- cacheNames/value:指定缓存组件的名字;
- key:缓存数据使用的key,可以指定。默认即使用方法参数的值
- condition:指定符合条件的情况下才缓存;如condition="#id>0"
@CachePut:更新
修改了数据库的某个数据,同时更新缓存
- value:缓存名
- key:确保更新的key和
#id
一致即可做到同时更新数据库数据和缓存中的数据
@CacheEvict:删除
- key:指定要清除的数据(对应上key可实现同时删除数据库和缓存中的数据)
在 Service 层增加三个缓存操作的⽅法:添加缓存、修改缓存、删除缓存,
编写User类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
public String name;
public int age;
public int id;
}
编写service:
@Service
public class UserService {
//使用缓存查询用户
@Cacheable(cacheNames = "getuser",key="#id")
public User getUserById(int id){
System.out.println("开始根据id查询用户了");
User user = new User();
user.setId(id);
user.setAge(18);
user.setName("张飞");
return user;
}
//修改缓存中的内容
@CachePut(cacheNames = "getuser",key="#id")
public User updateUser(int id,String name){
User user = new User();
user.setId(id);
user.setAge(18);
user.setName(name);
return user;
}
//删除缓存
@CacheEvict(cacheNames = "getuser",key="#id")
public boolean delUser(int id){
return true;
}
}
编写controller层:
@RestController //返回响应为json格式
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/getUser")
public User getUserById(int id){
return userService.getUserById(id);
}
@RequestMapping("/update")
public User updateUser(int id,String name){
return userService.updateUser(id,name);
}
@RequestMapping("/del")
public boolean delUser(int id){
return userService.delUser(id);
}
}
调用postman访问http://localhost:8080/getUser?id=1
:发现只有第一次调用时后台才打印
开始根据id查询用户了
后面不管查询几次其实都是访问的缓存了。
当访问http://localhost:8080/update?id=1&name=刘备
后,相当于对缓存中的内容进行了修改,当再访问http://localhost:8080/getUser?id=1
时获得的就是修改(数据库中的数据也一同修改)后的数据了。当访问http://localhost:8080/del?id=1
后就将缓存删除(数据库中的数据也一同删除)。
(2)Spring中缓存实现原理
Cache 本质上是⽤ ConCurrentMap 的数据结构来实现。
Java Caching定义了5个核心接口
- CachingProvider
- CacheManager
- Cache
- Entry
- Expiry
1) CachingProvider定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期访问多个CachingProvider。
2) CacheManager定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有。
3) Cache是一个类似Map的数据结构并临时存储以Key为索引的值。一个Cache仅被一个CacheManager所拥有。
4) Entry是一个存储在Cache中的key-value对.
5) Expiry 每一个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期的状态。一旦过期,条目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置。
3 SpringBoot——定时任务
(1)SpringBoot定时使用
1)@EnableScheduling注解开启定时功能
@SpringBootApplication
@EnableCaching // 开启缓存
@EnableScheduling //开启定时任务
public class MyfirstApplication {
public static void main(String[] args) {
SpringApplication.run(MyfirstApplication.class, args);
}
}
2)@Scheduled注解配置定时任务
@Component
public class Tasks {
// 0/3 从第0 秒开始,每3s执⾏⼀次,
//每位代表含义:秒 分钟 ⼩时 ⽇ ⽉ 周 年
@Scheduled(cron ="0/3 * * * * ?")
public void scheduleHello(){
System.out.println("hello");
}
}
定时任务是⾃动触发的,也就是说启动了Spring Boot 项⽬后,会⾃动执⾏ Tasks⾥⾯的定时任务,⽆需⼿动触发。
cron表达式:
注意:
其中 *
和 ?
号都表示匹配所有的时间。cron在线生成工具:https://cron.qqe2.com/
(2)SpringBoot定时任务实现原理
SpringBoot 在初始化 bean 之后,通过拦截器(postProcessAfterInitialization
)拦截到所有⽤到@Scheduled
注解的⽅法,再将这些⽅法放⼊到定时任务列表中,然后按照顺序执⾏这些定时任务。定时任务的执⾏步骤是,先解析 cron 表达式,获取到定时任务下次执⾏的时间,然后放⼊线程中等到对应的时间到了之后再执⾏,之后会按照执⾏的频次,定时执⾏这些任务。
4 SpringBoot——监控
监控和管理⼯具——Actuator。
Spring Boot 有⼀个指标监控功能,可以来监测⽣产环境的信息:
- 查询项⽬中⽬前所有的缓存信息;
- 查询项⽬中的所有定时任务列表;
- 查询项⽬中的所有 beans;
- 查询项⽬中的所有 mappings;
- 查看项⽬运⾏信息 env;
- 查看⽇志信息;
- 停⽌ Spring Boot项⽬等;
具体内容如下:
-
/auditevents
:显示应⽤暴露的审计事件(⽐如认证进⼊) -
/beans
:显示应⽤程序中所有 Spring Bean 的完整列表 -
/caches
:公开可⽤的缓存 /conditions:显示在配置和⾃动配置类上评估的条件以及它们匹配或不匹配的原因 -
/configprops
:显示所有 @ConfigurationPropertie 的整理列表 -
/env
:获取全部环境属性 -
/flyway
:提供⼀份 Flyway 数据库迁移信息 -
/health
:显示应⽤程序运⾏状况信息 -
/httptrace
:显示 HTTP 跟踪信息(默认情况下,最近 100 个 HTTP 请求-响 应交换) -
/info
:获取应⽤程序的定制信息,这些信息由 info 开头的属性提供 -
/integrationgraph
:显示 Spring Integration 图,需要依赖于 spring-integration-
core -
/loggers
:显示和修改应⽤程序的配置 -
/liquibase
:显示已应⽤的所有 Liquibase 数据库迁移 -
/metrics/{name}
:报告指定名称的应⽤程序度量值 -
/mappings
:显示所有 @RequestMapping 路径的列表 -
/scheduledtasks
:显示应⽤程序中的计划任务 -
/sessions
:允许从 Spring Session ⽀持的会话存储中检索和删除⽤户会话,需要使⽤ Spring Session 基于Servlet 的 Web 应⽤程序 -
/shutdown
:使应⽤程序正常关闭,默认禁⽤ -
/threaddump
:获取线程活动的快照
(1)SpringBoot监控的使用
1)添加 actuator 框架
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2)配置监控
在配置⽂件 application.properties
配置:
# 开启所有的监控,也可单独配置
management.endpoints.web.exposure.include=*
也可以单独配置单个权限:
# 开启beans 、 mappings 访问
management.endpoints.web.exposure.include=beans,mappings
3)查看监控
监控缓存:访问http://localhost:8080/actuator/caches
浏览器显示:
监控定时任务:访问http://localhost:8080/actuator/scheduledtasks
浏览器显示:
停止SpringBoot:
需要在application.properties中进行配置:
management.endpoint.shutdown.enabled=true
以 POST 的方式访问:http://localhost:8080/actuator/shutdown
注意:
在使用postman进行访问时,访问地址后面不可以有多余的空格
5 项目发布
参考博客:将SpringBoot打包并部署到云服务器中
6常用插件
(1)RestfulToolkit
- 可以看到项⽬中所有的 Restful 接⼝,也就是所有使⽤了@RequestMapping
的⽅法,只要使⽤了此注解的⽅法,都可以被⽤户直接调⽤到。 - 可以模拟(HTTP)请求,这样连 Postman都可以省了。
在plugin中在线安装RestfulToolkit后重启Idea.
(2)devtools——自动编译
使⽤ IDEA 开发 Spring Boot 默认是不会开启⾃动编译的,⾃动编译也叫热部署,这样导致的⼀个问题是我在项⽬运⾏的过程中修改了⼀些代码,但是因为 IDEA 不会⾃动编译因此就不能及时的调试修改的代码,所以为了更加快速的开发和调试程序,我们需要开启 Spring Boot 的⾃定编译功能。
1)在 Spring Boot 项⽬中,添加 devtools 插件;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
2)设置 IDEA 的⾃动编译;
3)设置 IDEA 运⾏⾃动运⾏。
快捷键:Shift+Ctrl+Alt+/ 进入Registry,勾选 compiler.automake.allow.when.app.running
(3)Save Actions——格式化
Save Actions插件主要用来自动对齐、自动导包、自动括号补全;
在plugins中加载Save Actions插件,后进行重启,
安装完后,需要在settions中配置 Save Actions: