文章目录
SpringBoot介绍
参考百度百科:https://baike.baidu.com/item/Spring%20Boot/20249767?fr=aladdin
Spring Boot是由Pivotal团队提供的全新框架, 其设计目的是用来简化新Spring应用的初始搭建以及开发过程。
人们把Spring Boot 称为搭建程序的脚手架
。其最主要作用就是帮我们快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让我们关注与业务而非配置。
该框架非常火,目前新开项目几乎都是基于SpringBoot搭建,非常符合微服务架构要求,企业招聘大多都要求有SpringBoot开发经验,属于面试必问的点。
优缺点
优点:
- 创建独立运行的Spring应用程序
- 嵌入的Tomcat,无需部署war文件
- 简化Maven配置
- 自动配置Spring
- 提供生产就绪型功能,如:日志,健康检查和外部配置等
- 不要求配置 XML
- 非常容易和第三方框架集成起来
缺点:
- 版本更新较快,可能出现较大变化
- 因为约定大于配置,所以经常会出现一些很难解决的问题
SpringBoot快速入门
方式1:使用idea创建SpringBoot工程
SpringBoot建议使用官方提供的工具来快速构建项目,网站:https://start.spring.io/ ,IDEA自带该功能,但需要联网使用
注意:官方提供的构建工具默认只能选择固定的版本,有些版本之间的差异非常大,所以如果需要选择某个版本建议项目构建后,自行在pom.xml文件中修改版本。
方式2:创建普通Maven工程
添加依赖
<!-- 打包方式jar包 -->
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
程序代码
@Controller
public class HelloController {
@RequestMapping("/hello")
@ResponseBody
public String hello() {
return "Hello Spring Boot";
}
}
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
然后通过main方法启动程序,观察控制台输出内容,最后浏览器中输入http://localhost:8080/hello验证效果
案例分析
父工程坐标
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
SpringBoot提供了一个名为spring-boot-starter-parent的工程,里面已经对各种常用依赖(并非全部)的版本进行了管理,我们的项目需要以这个项目为父工程,这样我们就不用操心依赖的版本问题了,需要什么依赖,直接引入坐标即可
web启动器
这是SpringBoot提供的web启动器 , 是一个快速集成web模块的工具包 , 包含springmvc,jackson相关的依赖
以及嵌入了Tomcat9服务器,默认端口8080
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
需要注意的是,我们并没有在这里指定版本信息。因为SpringBoot的父工程已经对版本进行了管理了。
傻瓜式配置的工具包
SpringBoot非常优秀的地方在于提供了非常多以spring-boot-starter-* 开头的开箱即用的工具包,常见工具包有以下一些:
spring-boot-starter:核心的工具包,提供了自动配置的支持,日志和YAML配置支持;
spring-boot-starter-activemq:针对快速集成ActiveMQ的工具包;
spring-boot-starter-aop:提供了快速集成SpringAOP和AspectJ的工具包;
spring-boot-starter-data-redis:提供了快速集成Redis和Jedis的工具包;
spring-boot-starter-freemarker:提供了快速集成Freemarker的工具包;
spring-boot-starter-mail:提供了快速集成邮件发送的工具包;
spring-boot-starter-test:提供了对Springboot应用的测试工具包;
spring-boot-starter-web:提供了对web开发的工具包,包括基于SpringMVC的RESTful应用开发,内置的tomcat服务器等;
spring-boot-starter-actuator:提供了对生产环境中应用监控的工具包;
spring-boot-starter-logging:提供了对日志的工具包,默认使用Logback;
独立运行
对于SpringBoot项目来说无论是普通应用还是web应用,其打包方式都是jar即可,默认Maven的打包方式是不能正常的打包SpringBoot项目,需要添加额外的打包插件才能正常打包。
<!-- pom.xml中添加插件 -->
<build>
<plugins>
<!-- SpringBoot打包插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
使用
- 使用Maven的package命令进行打包
- 该项目的字节码编译目录中会有打包好的 jar
- 用命令运行该jar包
java -jar xxx.jar
SpringBoot基本使用
Springboot应用的基本结构
Springboot应用的热部署
除了使用JRebel来实现热部署,还可以使用Springboot提供的spring-boot-devtools包来完成Springboot应用热部署;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
原理:
SpringBoot重启是reload重启,通过监控classpath的变化,如果classpath中的文件发生变化,即触发重启。springboot通过两个classpath来完成reload,一个basic classloader中加载不变的类,一个restart classloader中加载classpath中的类,重启的时候,restart classloader中的类丢弃并重新加载;
SpringBoot参数配置
参数来源
-
命令行启动项目时传入的参数, 如: java -jar xxx.jar --server.port=80
-
application.properties或者YAML文件
一般用的比较多的就是直接在application.properties或者YAML配置 , 其次是命令行启动方式
application.properties语法
server.port=80 server.session-timeout=30 server.tomcat.uri-encoding=UTF-8 spring.datasource.url = jdbc:mysql://localhost:3306/crm spring.datasource.username = root spring.datasource.password = mymysql spring.datasource.driverClassName = com.mysql.jdbc.Driver
application.yml语法
server: port: 80 session-timeout: 30 tomcat.uri-encoding: UTF-8 spring: datasource: url : jdbc:mysql://localhost:3306/crm username : root password : mymysql driverClassName : com.mysql.jdbc.Driver
-
参数加载顺序
- 命令行参数;
- ServletConfig和ServletContext;
- 操作系统环境变量;
- application-{profile}.properties或者YAML文件;
- application.properties或者YAML文件;
单个获取参数
配置:
application.properties:
app.myvalue=value
获取:
@Value("${app.myvalue}")
private String value;
批量参数获取
使用@ConfigurationProperties绑定参数对象:
配置:
application.properties:
propbind.host=host
propbind.username=username
propbind.password=password
propbind.timeout=10000
获取:
@ConfigurationProperties(prefix = "propbind")
@Component
public class PropBind {
private String host;
private String username;
private String password;
private Long timeout;
}
设置banner
springboot 比较搞笑的一个功能:banner
1,可以直接在classpath下添加一个banner.txt文件即可;
http://patorjk.com/software/taag
http://www.network-science.de/ascii/
http://www.degraeve.com/img2txt.php
https://blog.csdn.net/vbirdbest/article/details/78995793
2:如果不想要直接关闭即可
#application.properties
spring.main.banner-mode=off #关闭banner
SpringBoot的web开发
静态资源
默认情况下,Springboot会从classpath下的/static、/public、/resources、/META-INF/resources下加载静态资源;
可以通过修改spring.resources.staticLocations来修改静态资源加载地址;
因为应用是打成jar包,所以之前的src/main/webapp不会加载;
可以把静态资源打成jar包,springboot会自动加载/webjars/**下的所有jar包中的静态资源;
FreeMarker集成
1,引入spring-boot-starter-freemarker,自动引入freemarker和spring-context-support;
<!-- SpringBoot集成FreeMarker的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
2:在application.properties中配置
#freemarker后缀
spring.freemarker.suffix=.ftl
#暴露session对象的属性
spring.freemarker.expose-session-attributes=true
#freemarker数字格式化 : 330,000
spring.freemarker.settings.number_format=0.##
其他配置
1,spring.freemarker.enabled=true:是否开启freemarker支持;
2,spring.freemarker.allow-request-override:是否允许request中的属性覆盖model中同名属性;默认false;
3,spring.freemarker.allow-session-override:是否允许session中的属性覆盖model中同名属性;默认false;
4,spring.freemarker.cache:是否支持模板缓存;默认false;
5,spring.freemarker.charset:模板编码
6,spring.freemarker.content-type=text/html:模板contenttype;
7,spring.freemarker.expose-request-attributes:是否开启request属性expose,默认false;
8,spring.freemarker.expose-session-attributes:是否开启session属性expose,默认false;
9,spring.freemarker.expose-spring-macro-helpers:是否开启spring的freemarker宏支持;默认为false;
10,spring.freemarker.prefer-file-system-access:默认为true,支持实时检查模板修改;
11,spring.freemarker.prefix:加载模板时候的前缀;
12,spring.freemarker.settings.*:直接配置freemarker参数
13,spring.freemarker.suffix:模板文件后缀;
14,spring.freemarker.template-loader-path=classpath:/templates/:模板加载地址
访问异常
静态页面方式
- SpringBoot默认情况下,把所有错误都重新定位到/error这个处理路径上,由BasicErrorController类完成处理;
- SpringBoot提供了默认的替换错误页面的路径:
1,静态错误页面默认结构:
src/
resources/
static/
error/
404.html
401.html
5xx.html
2,也可以使用模板页面:
src/
resources/
templates/
error/
5xx.ftl
该路径方式是通过ErrorMvcAutoConfiguration中的DefaultErrorViewResolver完成的;
统一异常类处理方式:
@ControllerAdvice
通过使用@ControllerAdvice定义统一的异常处理类,而不是在每个Controller中逐个定义。@ExceptionHandler用来定义函数针对的异常类型。
@ControllerAdvice
public class GlobalErrorAdvice {
@ExceptionHandler(value = Exception.class)
public String error(Model model, Exception e) {
model.addAttribute("ex", e);
return "err";
}
}
集成druid
添加依赖
<!--2个jdbc操作依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- 导入druid依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.21</version>
</dependency>
application.properties 配置
#配置数据库4要素
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql:///crm?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=admin
集成mybatis
1,引入依赖:
<!--mybatis集成到SpringBoot中的依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
2,mybatis-spring-boot-starter提供了以下配置:
#懒加载配置
mybatis.configuration.lazy-loading-enabled=true
mybatis.configuration.lazy-load-trigger-methods=clone
#映射配置文件
mybatis.mapper-locations=classpath:cn/wolfcode/crm/mapper/*Mapper.xml
#扫描实体包
mybatis.type-aliases-package=cn.wolfcode.crm.domain
#打印SQL日志
logging.level.cn.wolfcode.crm.mapper=trace
3,扫描mapper接口:
会自动扫描指定包下的mapper接口;
@SpringBootApplication
// 会自动扫描指定包下的mapper接口;
@MapperScan(basePackages="cn.wolfcode.crm.mapper")
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
事务控制
注解方式:
1,引入aop
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2, 在service实现类上贴相关注解
@Service
@Transactional //表示给服务层添加事务
public class EmployeeServiceImpl implements IEmployeeService {
@Autowired
private EmployeeMapper employeeMapper;
@Transactional(readOnly=true)
@Override
public List<Employee> list() {
return employeeMapper.selectAll();
}
@Override
public void save(Employee employee) {
employeeMapper.insert(employee);
//int i = 1/ 0;
}
}
拦截器
1:定义一个拦截器
/**
* 用户登录拦截
*/
public class LoginInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {
//如果是拦截的动态请求, handler 参数就是HandlerMethod类实例
//如果是拦截是静态资源, handler 参数就是不是HandlerMethod类实例
//instanceof 判断左边对象是不是右边类的实例, 如果是true, 反之为false
if(!(handler instanceof HandlerMethod)){
return true; //静态资源放行
}
//获取请求路径
String uri = request.getRequestURI();
//如果url路径里面包含:/user/要求登录
if(uri.contains("/user/")){
response.sendRedirect("/login.html");
return false;
}
//放行
return true;
}
}
2:配置拦截器
启动类实现一个接口WebMvcConfigurer
重写接口中addInterceptors
@SpringBootApplication
public class App implements WebMvcConfigurer{
//自定义登录拦截器
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
//将自定义的拦截器加入到springmvc拦截器栈
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/css/**")
.excludePathPatterns("/js/**")
.excludePathPatterns("/images/**")
.excludePathPatterns("/error/**");
}
}
3:测试
http://localhost:8080/user/list
http://localhost:8080/hello