SpringBoot
SpringBoot简介(入门容易精通难)
SpringBoot来简化Spring应用开发,约定优于配置,去繁从简,just run就能创建一个独立的,产品级别的应用
产生背景
J2EE笨重的开发,繁多的配置,低下的开发效率,复杂的附属流程,第三方技术集成难度大
解决
Spring全家桶时代
SpringBoot→ J2EE一站式解决方案
SpringCloud→分布式整体解决方案
优点
快速创建独立运行的Spring项目以及与主流框架集成
使用嵌入式的Servlet容器,应用无需打成War包
starters自动依赖与版本控制
大量的自动配置,简化开发,也可修改默认值
无需配置xml,无代码生成,开箱即用
准生产环境的运行时应用监控
与云计算的天然集成
微服务
微服务:架构风格(服务微化)
一个应用应该是一组小型服务:可以通过HTTP的方式互通
每一个功能元素最终都是一个可独立替换和独立升级的软件单元;
环境搭建
jdk1.7及以上
maven3.3以上
idea
SpringBoot 1.5.9 RELEASE
SpringBoot简化配置
不需要手动导入依赖且不用写版本号
帮我们导入了web模块正常运行所需要的依赖
@SpringBootApplication:标注在某个类说明这个类是SpringBoot的主配置类,一般创建SpringBoot项目时会自动创建启动类并加上此注解
启动类最好放在JAVA目录下以免报错
idea使用Spring Initializer创建Spring Boot项目
使用aliyun镜像快速创建
http://start.aliyun.com
一般选择SpringWeb模块
如果需要省略get/set方法可以添加lombok模块
resource目录结构
static:保存所有的静态资源:js,css,images
templates:保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面)
application.properties:Spring Boot应用的配置文件,可以修改一些默认配置
配置文件
SpringBoot使用一个全局的配置文件,配置文件名是固定的
application.properties
application.yml
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好
YAML(YAML Ain’t Markup Language)
YAML A Markup Language:是一个标记语言
YAML Ain’t Markup Language:不是一个标记语言
标记语言:
以前的配置文件:大多使用的是xxxx.xml文件
YAML:以数据为中心,比json,xml等更适合做配置文件
YAML例子:
server:
port: 9004
xml:
<server>
<port>9004</port>
</server>
YAML基本语法
k:(空格)v : 表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要是左对齐的一对数据,都是同一层级的
server:
port: 8081
path: /hello
属性和值也是大小写敏感
字面量:普通的值(数字,字符串,布尔)
k: v :字面直接写
字符串默认不用加双引号或者单引号
“”:双引号;不会转义特殊字符;特殊字符作为本身想表示的意思
name: “zhangsan \n lisi”:输出:zhangsan 换行 lisi
‘’:单引号;会转义特殊字符;特殊字符最终只是一个普通的字符串数据
name: ‘zhangsan \n lisi’:输出:zhangsan \n lisi
对象、Map(属性和值) (键值对):
k: v :在下一行写对象的属性和值的关系;注意缩进
对象还是k: v的方式
friends:
lastName: zhangsan
age: 20
行内写法:
friends: {lastName: zhangsan,age: 18}
数组(List,Set):
用- 值表示数组中的一个元素
pets:
- cat
- psig
- dog
行内写法
pets: {cat,dog,pig}
@PropertySource:加载指定的配置文件
@PropertySource(value = {“classpath:xxx.properties”})
@ImportResource:导入Spring的配置文件,让配置文件的内容生效
@ImportResource(locations = {“classpath:xxx.xml”})
@Configuration:告诉SpringBoot这是一个配置类,替代之前的配置文件
SpringBoot推荐使用全注解的方式给容器中添加组件
使用@Bean给容器中添加组件
自动配置原理
- SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration
精髓:
- SpringBoot启动的时候会加载大量自动配置类
- 看我们需要的功能有没有SpringBoot默认写好的自动配置类
- 再来看这个自动配置类中到底配置了哪些组件,如果有,则无需再配
- 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们可以在配置文件中指定这些属性的
xxxxAutoConfiguration:自动配置类
给容器中添加组件
xxxxProperties:封装配置文件中相关属性
@Conditional派生注解(Spring注解版原生的@Conditional作用)
作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置类里面的所有内容才生效
@Conditional扩展注解:
@ConditionalOnJava:系统的Java版本是否符合要求
@ConditionalOnBean:容器中存在指定Bean
@ConditionalOnMissingBean:容器中不存在指定Bean
@ConditionalOnExpression:满足SPEL表达式
@ConditionalOnClass:系统中有指定类
@ConditionalOnMissingClass:系统中没有指定类
@ConditionalOnSingleCandidate:容器中只有一个指定的Bean,或者这个Bean是首选Bean
@ConditionalOnPreperty:系统中指定的属性是否有指定的值
@ConditionalOnResource:类路径下是否存在指定资源文件
@ConditionalOnWebApplication:当前是Web环境
@ConditionalOnNotWebApplication:当前不是Web环境
@ConditionalOnJndi:JNDI存在指定项
自动配置类只有在一定条件下才能生效
可以在配置文件中加入
debug= true
作用:开启SpringBoot的debug模式,可以在控制台中看到启用的自动配置类信息
SpringBoot与日志
SpringBoot底层是Spring,Spring默认选择的日志框架为JCL(Jakarta Commons Logging)
SpringBoot选用SLF4j和logback
Web开发
- 创建SpringBoot应用,选中我们需要的模块
- SpringBoot默认将这些模块配置好了,我们只需要在配置文件中指定少量配置就可以运行起来
- 编写业务代码
SpringBoot对静态资源的映射规则:
在pom文件中引入jquery依赖
<!--引入jquery-webjar-->
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.3.1</version>
</dependency>
所有/webjars/**,都去classpath:/META-INF/resources/webjars/找资源
webjars:以jar包的方式引入静态资源
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5DfTY4iA-1598497337652)(D:\Study-File\File\images\QQ图片20200824001011.png)]
”/**“访问当前项目的任何资源(静态资源的文件夹)
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
"/":当前项目的根路径
localhost:8080/abc 去静态资源文件夹里面找abc
欢迎页:静态资源文件夹下的所有index.html页面;被"/**"映射
localhost:8080/ 找index页面
所有的**/favicon.ico都是在静态资源文件夹下找
templates下放动态资源
动态页面需要先请求服务器,访问后台应用程序,然后再转向到页面,比如访问JSP。spring boot建议不要使用JSP,默认使用Thymeleaf模板引擎来做动态页面。
-
现在pom中要添加Thymeleaf组件
<!--pom中添加thymleaf模板引擎功能场景--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
-
引入thymeleaf组件后, 动态跳转找的是 templates目录下的文件, 如果存在相同的文件, 优先访问的是templates下的文件.
SpringMVC扩展
@Configuration public class MyMvcConfig implements WebMvcConfigurer { /** * 视图跳转 映射 * @param registry */ @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("test"); } /** * 配置拦截器 * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterrceptor()) .addPathPatterns("/**") .excludePathPatterns("/index.html","/sayName") .excludePathPatterns("/returnBigData") ; } }
1.preHandle 调用时间:Controller方法处理之前 执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行 若返回false,则中断执行,注意:不会进入afterCompletion 2.postHandle 调用前提:preHandle返回true 调用时间:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作 执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序倒着执行。 备注:postHandle虽然post打头,但post、get方法都能处理 3.afterCompletion 调用前提:preHandle返回true 调用时间:DispatcherServlet进行视图的渲染之后 多用于清理资源
* 描述: 自定义拦截器, 只针对被拦截的请求,被放行的请求不会触发 public class MyInterrceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return false; } }
SpringBoot定时任务
1.启动类添加注解 @EnableScheduling 开启对定时任务的支持
@SpringBootApplication
@EnableScheduling
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
2.定义组件
@Component
@Slf4j
public class SchedulerTask {
private int count = 0;
@Scheduled(cron = "*/6 * * * * ?")
private void process() {
log.info("this is scheduler task running" + (count ++ ));
}
}
@Component
@Slf4j
public class SchedulerTask2 {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(fixedRate = 6000)
public void reportCurrentTime() {
System.out.println("现在时间:" + dateFormat.format(new Date()));
}
}
3.执行时间的配置
在上面的定时任务中,我们在方法上使用@Scheduled注解来设置任务的执行时间,并且使用三种属性配置方式:
- fixedRate:定义一个按一定频率执行的定时任务
- fixedDelay:定义一个按一定频率执行的定时任务,与上面不同的是,改属性可以配合
initialDelay
, 定义该任务延迟执行时间。 - cron:通过表达式来配置任务执行时间
SpringBoot整合Swagger
前后端分离后,维护接口文档基本上是必不可少的工作。一个理想的状态是设计好后,接口文档发给前端和后端,大伙按照既定的规则各自开发,开发好了对接上了就可以上线了。当然这是一种非常理想的状态,实际开发中却很少遇到这样的情况,接口总是在不断的变化之中,有变化就要去维护,做过的小伙伴都知道这件事有多么头大!还好,有一些工具可以减轻我们的工作量,Swagger2就是其中之一。1.引入依赖
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
2.开启Swagger2
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.pathMapping("/")
.select()
.apis(RequestHandlerSelectors.basePackage("com.nvn.controller"))
.paths(PathSelectors.any())
.build().apiInfo(new ApiInfoBuilder()
.title("SpringBoot整合Swagger")
.description("SpringBoot整合Swagger,详细信息......")
.version("9.0")
.contact(new Contact("啊啊啊啊","blog.csdn.net","aaa@gmail.com"))
.license("The Apache License")
.licenseUrl("http://www.baidu.com")
.build());
}
http://localhost:8080/swagger-ui.html
参数解释:
-
@Api注解可以用来标记当前Controller的功能。
-
@ApiOperation注解用来标记一个方法的作用。
-
@ApiImplicitParam注解用来描述一个参数,可以配置参数的中文含义,也可以给参数设置默认值,这样在接口测试的时候可以避免手动输入。
-
如果有多个参数,则需要使用多个@ApiImplicitParam注解来描述,多个@ApiImplicitParam注解需要放在一个@ApiImplicitParams注解中。
-
需要注意的是,@ApiImplicitParam注解中虽然可以指定参数是必填的,但是却不能代替@RequestParam(required = true),前者的必填只是在Swagger2框架内必填,抛弃了Swagger2,这个限制就没用了,所以假如开发者需要指定一个参数必填,@RequestParam(required = true)注解还是不能省略。
-
如果参数是一个对象(例如上文的更新接口),对于参数的描述也可以放在实体类中。例如下面一段代码:
@ApiModel public class User { @ApiModelProperty(value = "用户id") private Integer id; @ApiModelProperty(value = "用户名") private String username; @ApiModelProperty(value = "用户地址") private String address; //getter/setter }