SpringBoot框架
一、SpringBoot简介
1.1 SpringBoot是什么
随着动态语言的流行(Ruby、Groovy、Scala、Node.js),Java的开发显得格外的笨重:繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术集成难度大。在上述环境下, Springboot应运而生。它使用“约定优于配置"(项目中存在大量的配置,此外还内置一个习惯性的配置,让你无须手动进行配置)的理念让你的项目快速运行起来。使用SpringBoot很容 易创建一个独立运行(运行jar,内嵌servlet容器)、准生产级别的基于Spring框架的项目,使用SpringBoot你可以不用或者只需要很少的Spring配置。
1.2 SpringBoot的特点
-
独立运行的Spring项目
Spring Boot可以以jar包的形式独立运行,运行一个Spring Boot项目只需要通过java -jar xx.jar。 -
内置Servlet容器
Spring Boot可选择内嵌Tomcat、Jetty或者Undertow,这样无须以war包形式部署。 -
提供starter简化maven配置(起步依赖)
Spring提供了一系列的starter pom来简化maven依赖加载,例如:当你使用了spring-boot-starter-web时,会自动加入相关依赖,无需你手动一个一个的添加坐标依赖。(其实就是将具备某种功能的坐标打包在一起) -
自动配置Spring
Spring Boot会根据在类路径中的jar包、类,为jar包里的类自动配置Bean,这样会极大地减少我们要使用的配置。当然,Spring Boot只是考虑了大多数的开发场景,并不是所有场景,若在实际开发中,我们需要自动配置bean,而Spring Boot没 有提供支持,则可以自定义自动配置。 -
无代码生成和xml配置
Spring Boot的神奇的不是借助于代码生成来实现的,而是通过条件注解来实现的,这是Spring 4.x提供的新特性, Spring 4.x提倡使用java配置和注解配置相结合,而Spring Boot不需要任何xml配置即可实现Sping Boot的所有配置。
1.3 SpringBoot的优缺点
- 优点:
- 快速构建项目:省略了繁琐且重复的xml配置,分分钟构建一个web工程
- 对主流开发框架的无配置集成:提供了很多Starter 依赖包,开箱即用,无需多余配置;
- 项目可独立运行:无需外部依赖Servlet容器;
- 极大地提供了开发、部署效率;
- 监控简单:提供了actuator包,可以使用它来对你的应用进行监控。
- 不足之处:
- 依赖太多:一个简单的SpringBoot应用都有好几十M只有;
- 缺少监控集成方案、安全管理方案:只提供基础监控,要实现生产级别的监控,监控方案需要自己动手解决;
二、SpringBoot的使用
2.1 创建SpringBoot项目
- File --> New --> project --> Spring Initializr
- 设置项目名称等;
- 选择SpringBoot版本,以及选择相应模块;
- 项目名称及保存位置;
2.2 SpringBoot的配置文件
2.2.1 pom文件
parent起步依赖
<!--所有的SpringBoot项目都必须继承spring-boot-starter-parent -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.10.RELEASE</version>
<relativePath/>
</parent>
web及test(测试)起步依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2.2.2 application.properties
# server configuration
server.port=8081
spring.application.name=exam-service
## eureka configuration
eureka.client.serviceUrl.defaultZone=http://localhost:8082/test/
eureka.instance.prefer-ip-address=true
eureka.instance.ip-address=127.0.0.1
eureka.instance.non-secure-port=8726
# aop configuration
spring.aop.auto=true
spring.aop.proxy-target-class=false
# db configuration
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_work?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
##Mybatis configuration
mybatis.type-aliases-package=com.bosssoft.core.rbac.pojo.entity
mybatis.mapper-locations=classpath:mapper/*.xml
# mapper configuration
mapper.mappers=com.bosssoft.hr.bes.exam.center.dao.ExamRecordDAO
mapper.identity=MYSQL
redis configuration
spring.redis.jedis.pool.max-idle=30
spring.redis.jedis.pool.max-active=10
spring.redis.jedis.pool.min-idle=30
spring.redis.jedis.pool.max-wait=10000
spring.cache.type=redis
spring.cache.cache-names=redisCache
spring.redis.host=58.22.61.222
spring.redis.port=27014
spring.redis.timeout=30000
spring.redis.database=3
2.2.2 application.yml
在 application.yml 文件 书写注意:
- 不同“等级” 用冒号隔开;
- 次等级的前面是空格,不能使用制表符(tab);
- 冒号之后如果有值,那么冒号和值之间至少有一个空格,不能紧贴着;
server:
prot: 8888 #配置访问的端口
servlet:
context-path: /xxx #配置访问时的项目名
spring:
devtools:
restart:
enabled: true #这个好像是热加载,每次代码有改动就自动重启,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
datasource:
url: jdbc:mysql://localhost:3306/xxx?useUnicode=true&characterEncoding=UTF-8&useSSL=true #配置数据库的路径
username: root #数据库登录名
password: root #登陆密码
type: com.alibaba.druid.pool.DruidDataSource #这个可以看一下 https://blog.csdn.net/qq_27191423/article/details/79146855
driver-class-name: com.mysql.jdbc.Driver
filters: stat
maxActive: 20 #连接池的最大值,同一时间可以从池分配的最多连接数量,0时无限制
initialSize: 1 #连接初始值,连接池启动时创建的连接数量的初始值
maxWait: 60000
minIdle: 1 #最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true #是否对已备语句进行池管理(布尔值),是否对PreparedStatement进行缓存
maxOpenPreparedStatements: 20
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
mybatis-plus:
mapper-locations: classpath*:mapper/**/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.yudao.platform.entity.*
global-config:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: 0
#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
field-strategy: 2
#驼峰下划线转换
db-column-underline: false
#刷新mapper 调试神器
refresh-mapper: true
#数据库大写下划线转换
#capital-mode: true
# Sequence序列接口实现类配置
#key-generator: com.baomidou.mybatisplus.incrementer.OracleKeyGenerator
#逻辑删除配置
logic-delete-value: 1
logic-not-delete-value: 0
#自定义填充策略接口实现
#meta-object-handler: com.baomidou.springboot.xxx
#自定义SQL注入器
# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
call-setters-on-nulls: true
3.4 SpringBoot的热部署
SpringBoot的热部署:无需手动重启SpringBoot应用。虽然平时开发web项目过程中,改动项目启重启总是报错;但springBoot对调试支持很好,修改之后可以实时生效。
-
Setting --> Complier --> Build project automatically
-
第一步完成后,发现热部署依旧无法实现,这是因为IDEA默认清空下不会自动编译,还需进行下面操作:
- 按下ctrl + alt +shift + /
- 勾选如图所示内容
- 按下ctrl + alt +shift + /
3.3 SpringBoot的常用注解
@SpringBootApplication
: 用于启动类,开启包扫描、配置和自动配置的功能
@SpringBootApplication
public class Chapter1Application {
public static void main(String[] args) {
SpringApplication.run(Chapter1Application.class, args);
}
}
-
@RestController
:@Controller
+@ResponseBody
视图解析返回json数据 -
@RequestMapping
: 配置请求地址的URL映射
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "Hello SpringBoot!";
}
}
@Value("属性名")
: 直接获取到配置文件里面的变量信息
@Value("${server.port}")
private String serverPort;
@Value("${sys.version}")
private String version;
RequestMapping("/port")
public String port() {
return "port is :"+serverPort + " and version is :" + version;
}
@GetMapping
: @RequestMapping(method = RequestMethod.GET)的缩写,处理http的get请求 。 参数:@PathVariable
— url中动态参数;@RequestParam ---
request中获取值
@GetMapping("/hello/{id}")
public String hello(@PathVariable(value="id") String id,
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2) {
return String.format("id is :%s, param1 is : %s , param2 is :%s", id,param1,param2);
}
@PostMapping
: @RequestMapping(method = RequestMethod.POST)的缩写,处理http的post请求@RequestBody
: 主要用来处理Content-Type是application/json,application/xml的Json字符串。多用在Post类型请求中。 可以将请求中的JSON字符串绑定到相应的bean上,也可以绑定到绑定到字符串上。
$.ajax({
url:"/login", type:"POST",
data:'{"userName":"admin","pwd","admin123"}',
content-type:"application/json charset=utf-8",
success:function(data){
alert("request success ! ");
}
});
@PostMapping("/login")
public void login(@RequestBody String userNamePwd) {
System.out.println(userNamePwd+ " :" + userNamePwd);
}