SpringBoot学习-入门篇
spring的优点:
1.创建独立的spring应用
2.内嵌web服务器
3.自动start依赖,简化构建配置
4.自动配置Spring以及第三方功能
5.提供生产级别的监控,健康检查及外部化配置
6.无代码生成,无序编写Xml
spring缺点:
1.版本更新快
2.封装太深,原理复杂
微服务:
微服务是一种架构风格,将一个应用拆分为一组小型服务,每个服务独立部署和升级,服务器之间使用轻量级http交互,服务围绕业务功能拆分。去中心化,服务自治,服务可以使用不同的语言和不同的存储技术(不局限于语言),因此催生了分布式
分布式的困难:
-
远程调用
-
服务发现
-
负载均衡
-
服务容器
-
配置管理
-
服务监控
-
链路追踪
-
日志管理
分布式的解决:
Springboot + SpringColud
1.springBoot将应用分成了各种某块
2.springClound将各个某块互联互调起来
3.springCloundDataFlow将他们做成数据流
1.springBoot将应用分成了各种某块
2.springClound将各个某块互联互调起来
3.springCloundDataFlow将他们做成数据流
入门:
1.系统要求:
- jdk java8 兼容 jdk java14
- maben 3.3+
- idea 2019.1.2
查看自己的java 版本号: java - version
查看自己 maven的版本号: mvn -v
2:创建springboot的两种方式:
方式一:
方式二:
1.在xml文件配置:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/>
</parent>
<!--启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
2.在一个类上添加:@SpringBootApplication
3.编写一个controller,进行访问
注意:
- 是运行有@SpringBootApplication注解的类
- 默认的访问端口号是8080
修改端口号:
通过创建application.properties文件。
自动装配原理:
1.springBoot先加载所有的自动装配类127个,例如:xxxAtuoConfigratuion
2.每个自动:配置类按照条件进行生效,默认都会绑定配置文件指定的值
,所有的值都是从xxxProperties里面拿( xxxProperties和配置文件进行了绑定)
3.生效的配置类就会给容器中装配很多组件
4.只要容器中有这些组件,相当于这些功能就有了
5.定制化配置
5.1用户直接自己@Bean替换底层的组件
5.2用户看这个组件是获取的配置文件是什么值
xxAutoConfiguration(导入所有的自动配置类)–>组件(按需加载了所有的组件)—>xxxProperties里面拿值(组件从我们properties中拿值)----》application.properties(Properties的绑定的值就是我们Application中的值)
*SpringBoot核心功能
3:配置文件:
1.1properties
键值对(key = value)的形式
1.2yaml
简介:
YAML 是 “YAML Ain’t Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。
基本语法:
- 大小写敏感
- key : value 的格式,中间有空格
- 所经不允许用tab,只允许用空格
- #'表示注释
注意:当没有用空格隔开时会,这一行会变绿
常用的一些写法:
# properties表达式 k-v
# yaml 普通的表达式 key-value
server:
port: 8081
# 对象
student:
name: xx
age: 12
# 数组行内写法
student1: {name: kk,age: 23}
#数组:
pets:
- cat
- dog
- big
# 数组行内写法:
pets1: [cat,dog,pig]
#给Person赋值
person:
#也可也使用el表达式
name: ${random.uuid}
age: 13
happy: true
#注意日期格式必须年月日
birthday: 2019/9/20
hello: happy
#map是一个键值对,是一个对象
maps: {k1: v1,k2: v2}
#list集合
lists:
- code
- music
#类
dog:
name: ${person.hello:hello}_旺财
age: 12
4:Web开发
1.简单功能分析:
1.1静态资源目录:
只要静态资源放在类路径下: called /static (or /public or /resources or / META-INF/resources
访问 : 当前项目根路径/ + 静态资源名
原理:静态映射/**
请求进来,先去找contorller 看能不能处理。不能处理的所有请求又都交给静态资源处理器来处理,也不能处理就报404错误
所以,当静态资源名和controller访问名相同时,显示的内容是controller中处理的结果
1.2修改默认的静态资源路径:
spring:
mvc:
#静态资源的访问路径的前缀
static-path-pattern: /res/**
resources:
#修改默认的静态资源路径
static-locations: [classpath:/haha/]
#禁用所有的静态资源
resources:
add-mappings: false
当前项目 + static-path-pattern的值+ 静态资源名
1.3文件加载的顺序:从上到下
1.file:./config/ | 项目下的config包中的文件 |
2:file:…/ | 项目下的文件 |
3.classpath:/config/ | resouce包下的config包下的文件 |
4.classpath:/ | resouce包下的文件 |
注意:resource下的所有文件默认都是根目录下的(相当于是classpath下的)
1.4欢迎页面支持
- 默认是静态资源中的 index.html
- cntroller能处理/index请求
—要想修改的话,可以通过配置静态资源路径
—但是不可以配置静态资源的访问前缀。否则index.html不能被默认访问
1.5自定义Favicon
直接将图片名为Favicon.jpg放入静态资源下面
注意:这一段配置会导致 Favicon失效
1.6静态资源配置原理
- spring启动默认加载 xxxAutoConfigration类(自动配置类)
- springMVC的自动配置类 WebMvcAutoConfigration,要生效,下面的条件要满足
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
ValidationAutoConfiguration.class })
WebMvcAutoConfigration 类的位置:
下的(这里面包括了所有的自动配置类) 下的
下的 Web --> Sevlet
- 给容器配了什么
@Configuration(proxyBeanMethods = false)
@Import(EnableWebMvcConfiguration.class)
@EnableConfigurationProperties({ WebMvcProperties.class,
org.springframework.boot.autoconfigure.web.ResourceProperties.class, WebProperties.class })
@Order(0)
- 配置文件的相关属性和xxx进行了绑定。WebMvcProperties.class= spring.mvc,.ResourceProperties.class=spring.resources
拓展:
1.当一个配置类只有一个有参构造器的时候:
//有参构造器所有参数的值都会从容器中确定
//ResourceProperties resourceProperties;获取和spring.resources绑定的所有的值的对象
//WebMvcProperties mvcProperties 获取和spring.mvc绑定的所有的值的对象
//ListableBeanFactory beanFactory Spring的beanFactory
//HttpMessageConverters 找到所有的HttpMessageConverters
//ResourceHandlerRegistrationCustomizer 找到 资源处理器的自定义器。=========
//DispatcherServletPath
//ServletRegistrationBean 给应用注册Servlet、Filter....
public WebMvcAutoConfigurationAdapter(ResourceProperties resourceProperties, WebMvcProperties mvcProperties,
ListableBeanFactory beanFactory, ObjectProvider<HttpMessageConverters> messageConvertersProvider,
ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider,
ObjectProvider<DispatcherServletPath> dispatcherServletPath,
ObjectProvider<ServletRegistrationBean<?>> servletRegistrations) {
this.resourceProperties = resourceProperties;
this.mvcProperties = mvcProperties;
this.beanFactory = beanFactory;
this.messageConvertersProvider = messageConvertersProvider;
this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizerProvider.getIfAvailable();
this.dispatcherServletPath = dispatcherServletPath;
this.servletRegistrations = servletRegistrations;
}
2.资源处理器的默认配置规则
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
super.addResourceHandlers(registry);
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
return;
}
ServletContext servletContext = getServletContext();
addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
registration.addResourceLocations(this.resourceProperties.getStaticLocations());
if (servletContext != null) {
registration.addResourceLocations(new ServletContextResource(servletContext, SERVLET_LOCATION));
}
});
}
取消静态资源
spring:
# mvc:
# static-path-pattern: /res/**
resources:
add-mappings: false 禁用所有静态资源规则
静态资源默认的四个值
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
"classpath:/resources/", "classpath:/static/", "classpath:/public/" };
3.欢迎页面的处理规则
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext,
FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(
new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(),
this.mvcProperties.getStaticPathPattern());
welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));
welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations());
return welcomePageHandlerMapping;
}
SpringBoot 整合 Swagger3
第一步:
导入swagger3的maven坐标
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
第二步:
在主程序类上开启 @EnableOpenApi 注解
@SpringBootApplication
@EnableOpenApi
@MapperScan("com.baidu.mapper")
public class SpringBootStarter {
public static void main(String[] args) {
SpringApplication.run(SpringBootStarter.class, args);
}
}
第三步:
配置Config
@Configuration
public class SwaggerConfig implements WebMvcConfigurer {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Swagger3接口文档")
.description("更多请咨询服务开发者XXX")
.contact(new Contact("作者", "作者地址", "作者邮箱"))
.version("1.0")
.build();
}
}
第四步:
在对应的接口配置注解,这里只有一部分
@PostMapping("login")
// 这个接口的作用
@ApiOperation("登录接口")
// 解释参数类型
@ApiImplicitParams({
@ApiImplicitParam(name = "username", value = "账号",dataType = "string",example = "xiaoming"),
@ApiImplicitParam(name = "password", value = "密码",dataType = "string",example = "123456")
})
// 响应结果提示
@ApiResponses({
@ApiResponse(code = 200,message = "登陆成功"),
@ApiResponse(code = 201,message = "用户名或密码错误"),
@ApiResponse(code = 404,message = "请求路径错误")
})
public CR login(@RequestBody LoginUserReq user) {
String username = user.getUsername();
String password = user.getPassword();
if (ObjectUtils.isEmpty(username) || ObjectUtils.isEmpty(password)) {
return CR.error("用户名或者密码错误");
}
T_user dbUser = t_userService.queryUserByUsername(username);
if(ObjectUtils.isEmpty(dbUser)){
return CR.error("用户名或者密码错误");
}
if (!dbUser.getPassword().equals(user.getPassword())) {
return CR.error("用户名或者密码错误");
}
return CR.ok("登陆成功");
}
第五步:
访问地址: http://localhost:8888/swagger-ui/
注意: 根据自的端口号来访问
访问结果: