SpringBoot
2021-03-31 16:21:31 373 举报
AI智能生成
SpringBoot是一个开源的Java框架,它可以帮助开发者快速构建和部署微服务应用。SpringBoot具有简化配置、快速开发和轻量级等特点,使得开发者可以专注于业务逻辑的实现,而无需关心底层的技术细节。通过自动配置和约定优于配置的原则,SpringBoot能够大大减少开发者的工作量,提高开发效率。同时,SpringBoot还具备良好的可扩展性和兼容性,可以与各种第三方库和技术无缝集成。总之,SpringBoot是一个非常实用的Java开发框架,适用于构建各种规模的企业级应用。
作者其他创作
大纲/内容
接口:RESTful风格
注册中心:Eureka
Ribbon
Feign
服务调用(负载均衡)
Hystrix
熔断/降级
Zuul
Gateway
网关
git
SpringCloud config
配置
SpringCloud
三层架构
MVC
MVVM
架构
模块
userService
service
一个一个业务
提供接口
controller
SpringMVC
资金解冻
仓库解冻
仓库数量减少
购买成功
验证
资金冻结
仓库冻结
流程
放在一台服务器上大量工作all in one:10s
消息队列:异步处理只需1s
用户下单
案例
微服务
微服务架构
@RestController=@Controller+@ResponseBody
注解
java -jar .\\springbootdemo-0.0.1-SNAPSHOT.jar
springbootdemo-0.0.1-SNAPSHOT.jar
一个个jar
控制台运行jar包同样可以访问 http://localhost:8080/test/
Maven工具package打包项目,生成jar文件
是什么
核心依赖在父工程中
spring-boot-dependencies
在写入或引入一些SpringBoot依赖时,不需要指定版本,因为有版本仓库
pom.xml
自动导入web环境所有依赖
spring-boot-starter-web
spring-boot-starter-test
springboot的启动场景
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>
需要使用什么功能,只需在官网找到对应的启动器starter
springboot会将所有功能场景,都变成一个个启动器
启动器
得到@Component,证明是Spring的一个组件
点入查看@SpringBootConfiguration点入查看@Configuration
程序入口
最初以为运行了一个main方法,没想到却开启了一个服务
自动装配(见下)
推断应用的类型:普通项目还是Web项目
查找并加载所有可用初始化器 , 设置到initializers属性中
找出所有的应用程序监听器,设置到listeners属性中
推断并设置main方法的定义类,找到运行主类
SpringApplication的实例化
监听器
装配环境参数
上下文区域
run方法的执行
SpringApplication.run
关于SpringBoot谈谈你的理解
双击放大查看
pre style=\
标注此类为Springboot应用:启动类下所有资源被导入
@SpringBootApplication
扫描当前主启动类同级的包
@ComponentScan
自动配置 包注册
@Import({Registrar.class})
@AutoConfigurationPackage 自动配置包
如果条件均满足才会生效
因为存在核心注解@ConditionalOnXXX
需要导入对应Start启动器才生效
为什么自动配置没有生效,怎么解决?
SpringBoot所有自动配置都是在启动的时候扫描并加载:spring.factories(所有自动配置类都在里面,但不一定生效)
结论
从类路径下/META-INF/spring.factories获取指定值
自动配置类在spring-boot-autoconfigure-2.2.2.RELEASE.jar包下
SpringBoot启动会加载大量自动配置类
如果没有需要在application.yaml中配置
我们需要的功能有没有在SpringBoot默认的自动配置类中
给容器中自动配置类添加组件时,会从properties类中获取属性
把所有需要导入的组件,以类名方式返回,这些组件被添加到容器
自动配置类,给容器中添加组件
有@Configuration表示一个配置类
@ConfigurationProperties(prefix = \"spring.http\")
HttpProperties.class中
其中encoding等属性为HttpProperties.class中拥有的属性
可以为HttpProperties.class中的属性赋值(自定义配置)
在application.yaml中
@EnableConfigurationProperties({HttpProperties.class})
yaml可以注入到我们的配置类中
容器中(spring.factories)存在很多xxxAutoConfiguration的文件(@Bean)
步骤/原理
自动配置导入选择
导入元数据
public String[] selectImports(AnnotationMetadata annotationMetadata) {
protected Class<?> getSpringFactoriesLoaderFactoryClass() { return EnableAutoConfiguration.class; }
获取候选配置
public static List<String> loadFactoryNames(Class<?> font color=\"#f15a23\
protected font color=\"#662c90\
@Import({AutoConfigurationImportSelector.class}) 自动导入包的核心
@EnableAutoConfiguration 自动导入包
主程序
自动装配(原理重点)
pets: - cat - dog - pig
数组
行内写法
student: name: xinzhang age: 28
对象
name: xinzhang
普通的key-value
对空格要求较高
@Autowiredprivate Dog dog;
测试用
@Value(\"3\") private Integer age;
属性使用
POJO添加@Component注解
原方式
将配置文件中配置的每一个属性值映射到对应组件中
Springboot将本类中所有属性和配置文件中相关配置进行绑定
将配置文件中person下面所有属性一一对应
参数prefix = \"person\"
@ConfigurationProperties(prefix = \"person\")
可以使用占位符,随机变量,选择表达式
person.hello存在,使用person.hello
person.hello不存在,使用hello
${person.hello:hello}
yaml文件
@Component@ConfigurationProperties(prefix = \"person\
POJO
yaml方式
yml中写的last-name,和lastName一样, - 后面跟着的字母默认是大写
松散绑定
如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value
如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@ConfigurationProperties,不要犹豫
@Validated
Java 规范提案
Java Specification Requests
JSR303数据校验,在字段增加一层过滤器验证,保证数据合法性
对比
yaml语法
SpringBoot配置文件可以配置哪些东西?(见上同款绿框)
优先级1:项目路径下的config文件夹配置文件
优先级2:项目路径下配置文件
优先级3:资源路径下的config文件夹配置文件
优先级4:资源路径下配置文件
优先级由高到底,高优先级的配置会覆盖低优先级的配置
SpringBoot会从这四个位置全部加载主配置文件;互补配置
配置文件加载位置
测试环境配置
application-test.properties
开发环境配置
application-dev.properties
使用yaml的多文档块
spring.profiles.active=dev
通过配置来激活需要的环境
默认使用application.properties主配置文件
Springboot不会直接启动环境配置文件
多环境切换
默认使用配置文件环境
若没有激活其他环境
选择要激活那个环境块
spring: profiles: active: test
配置环境的名称
spring: profiles: dev
server: port: 8081spring: profiles: active: test---server: port: 8082spring: profiles: dev---server: port: 8083spring: profiles: test
yaml的多文档块
自动配置类启用的:正匹配
Positive matches
没有启动,没有匹配成功的自动配置类:负匹配
Negative matches
没有条件的类
Unconditional classes
来让控制台打印自动配置报告,这样我们可以很方便的知道哪些自动配置类生效
启用 debug=true属性
配置如何编写 yaml
WebMvcAutoConfigurationAdapter方法
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{\"classpath:/META-INF/resources/\
查看ResourceProperties.class源码
http://localhost:8080/webjars/jquery/3.4.1/jquery.js
浏览器可访问
位置在maven导入的jar包中
<dependency> <groupId>org.webjars</groupId> <artifactId>jquery</artifactId> <version>3.4.1</version></dependency>
classpath:/META-INF/resources/
优先访问
http://localhost:8080/1.js
resources下可以再新建resources文件夹,新建1.js
classpath:/resources/
在resources中没有1.js会访问static
resources下新建static文件夹,新建1.js
classpath:/static/
上述两个文件夹没有,才会访问
resources下新建public文件夹,新建1.js
classpath:/public/
注意配置文件中空格
配置之后替代了ResourceProperties.class中CLASSPATH_RESOURCE_LOCATIONS的属性
spring: resources: static-locations: classpath:/xinzhangconfig/
application.yaml配置文件中
配置文件自定义静态文件路径
可以查看到静态资源映射规则
addResourceHandlers
查看spring-boot-autoconfigure-2.2.2.RELEASE.jar包下META-INF/spring.factories中的WebMvcAutoConfiguration
源码思想
导入静态资源
在静态资源路径下添加即可
return this.resourceLoader.getResource(location + \"index.html\");
getIndexHtml
getWelcomePage
welcomePageHandlerMapping
WebMvcAutoConfiguration.class
首页
后台封装动态数据,数据交给模板引擎,模板引擎进行表达式解析、填充指定位置
作用
ThymeleafAutoConfiguration
html页面放在类路径下的templates中,thymeleaf自动渲染
private String prefix = \"classpath:/templates/\"; private String suffix = \".html\";
ThymeleafProperties.class
<!--thymeleaf--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
引入Thymeleaf
<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">
命名空间
后端model.addAttribute(\"msg\
前端<div th:text=\"${msg}\"></div>
th:元素名
所有的html元素都可以被Thymeleaf替换接管
Thymeleaf使用
首先添加命名空间
th:insert
JSP:include
片段包含
后端map.put(\"users\
前端<h2 th:each=\"user :${users}\" th:text=\"${user}\"></h2>
th:each
c:forEach
遍历
th:if
c:if
条件判断
th:object
c:set
声明变量
th:attr
th:attrprepend
th:attrappend
支持prepend/append
任意属性修改
th:value
th:href
th:src
修改指定属性默认值
Selection Variable Expressions: *{...}:选择表达式:和${}在功能上是一样;
Message Expressions: #{...}:获取国际化内容
起始路径对应resources/static
<link th:href=\"@{/css/bootstrap.min.css}\" rel=\"stylesheet\">
Link URL Expressions: @{...}:定义URL;
Fragment Expressions: ~{...}:片段引用表达式
表达式
Thymeleaf语法
模板引擎Thymeleaf(JSP)
public interface ViewResolver { View font color=\"#924517\
for (ViewResolver viewResolver : this.viewResolvers) {
return candidateViews;
选择候选视图
获取最好的视图
ContentNegotiatingViewResolver重写了resolveViewName方法
public class ContentNegotiatingViewResolver extends WebApplicationObjectSupport\t\tfont color=\"#662c90\
Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans
The auto-configuration adds the following features on top of Spring’s defaults
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
@Import(DelegatingWebMvcConfiguration.class)public @interface EnableWebMvc {}
配置了@EnableWebMvc会导入并继承WebMvcConfigurationSupport
如果存在WebMvcConfigurationSupport.class则以下自动配置均失效
@ConditionalOn的巧妙应用
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
WebMvcAutoConfiguration
分析@EnableWebMvc
you can add your own @Configuration class of type WebMvcConfigurer(shift+shift查看为接口,实现接口) but without @EnableWebMvc.
处理请求响应
类DispatcherServlet.java
用户配置和默认的组合
可查看到自定义视图解析器已生效
debug启动调试访问http://localhost:8080/
方法中设置断点
//扩展 SpringMVC@Configurationpublic class MyMvcConfig implements WebMvcConfigurer { @Bean public ViewResolver myViewResolver(){ return new MyViewResolver(); } public static class MyViewResolver font color=\"#f1753f\
自定义视图解析器,并注册到bean中会自动装配
***Properties的属性可以在配置文件中更改配置
WebMvcProperties
@Bean public FormattingConversionService mvcConversionService() { WebConversionService conversionService = new WebConversionService(this.mvcProperties.getDateFormat()); this.addFormatters(conversionService); return conversionService;}
查找WebMvcAutoConfiguration文件中的Formatter
在src/main/java下创建config包,创建config类
//扩展 SpringMVC@Configurationpublic class MyMvcConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController(\"/xinzhang\").setViewName(\"test\"); }
扩展SpringMVC:视图跳转
包含XXXConfiguration+properties
打jar包放入spring-boot-autoconfigure-2.2.5.RELEASE.jar!\\org\\springframework\\boot\\autoconfigure中
配置properties
写XXXConfiguration,使用ConditionalOn等注解
大型公司如何写Starter
注:遇见XXXAutoConfiguration,立即推,帮着我们扩展了什么功能
官方文档
装配扩展SpringMVC
th:href @{}
th:src=\"@{/img/bootstrap-solid.svg}\"
所有页面的静态资源都需要使用Thymeleaf接管
server: servlet: context-path: /xinzhang
可以设置多个
@Configurationpublic class MyMvcConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController(\"/\").setViewName(\"index.html\"); registry.addViewController(\"/index.html\").setViewName(\"index.html\");}}
首页访问使用自定义配置方式
配置首页
private String basename = \"messages\";
MessageSourceProperties
MessageSourceAutoConfiguration
login.btn=登录
login.properties
login.btn=login
login_en_US.properties
login_zh_CN.properties
可视化进行三个文件同时操作
新创建路径i18n
spring: #配置文件放的真实位置 messages: basename: i18n.login
application.yaml
[[#{login.btn}]]
th:text=\"#{login.remember}
国际化使用
<a class=\"btn btn-sm\" th:href=\"@{/index.html(language='zh_CN')}\">中文</a>
<a class=\"btn btn-sm\" th:href=\"@{/index.html(language='en_US')}\">English</a>
中英文切换对应链接
th可以加在任何位置
HTML静态资源页面
interface LocaleResolver
AcceptHeaderLocaleResolver implements LocaleResolver
resolveLocale
setLocale
重写了两个方法
AcceptHeaderLocaleResolver
localeResolver方法
WebMvcAutoConfigurationAdapter类
WebMvcAutoConfiguration.java
String language = request.getParameter(\"language\"); Locale locale = Locale.getDefault(); if (!StringUtils.isEmpty(language)){ String[] strings = language.split(\"_\
public Locale resolveLocale(HttpServletRequest request)
类名要与返回类名对应,首字母小写
@Bean public LocaleResolver localeResolver(){ return new MyLocaleResolverConfig(); }
添加bean注入
@Configurationpublic class MyMvcConfig implements WebMvcConfigurer {
在自定义的配置类中
自定义LocaleResolve类实现LocaleResolver接口
实现中英文切换
页面国际化
实现HandlerInterceptor接口
使用session令用户登录一次后免登陆
返回false进行拦截
返回true放行
转发跳转到起始登录页面
getRequestDispatcher
public class LoginHandlerInterceptor implements HandlerInterceptor { @Override public boolean font color=\"#00a650\
自定义拦截器类
登录成功添加session
避免登录成功后url显示密码
重定向
@Configurationpublic class MyMvcConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController(\"/\").setViewName(\"index.html\"); registry.addViewController(\"/index.html\").setViewName(\"index.html\"); registry.addViewController(\"/main.html\").setViewName(\"dashboard.html\"); }
需要自定义配置支持
redirect:/main.html
@Controllerpublic class LoginController { @RequestMapping(\"/user/login\") public String login(@RequestParam(\"username\
登录页面配置
添加拦截器
addInterceptor
要使当前拦截器生效的路径
addPathPatterns
不被拦截的路径
excludePathPatterns
@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginHandlerInterceptor()) .addPathPatterns(\"/**\") .excludePathPatterns(\"/index.html\
在自定义配置信息中配置拦截内容
拦截器
提取公共页面
前端:展示员工列表
请查看SSM的MyBatis内容
增删改查
实操员工管理系统
集成web开发(业务核心)
可以拿来即用
JdbcTemplateConfiguration使用@Bean进行注入
JDBCTemplate/RedisTemplate
jdbc:mysql://localhost:3306/mybatis_test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true&allowMultiQueries=true
URL
文章链接
整合JDBC
配置文章
GitHub地址
整合Druid数据源
<!--MyBatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency>
Maven
@Data@NoArgsConstructor@AllArgsConstructor
可使用Lombok
注意:java实体类字段要与数据库字段对应
<!-- 为类型设置类型别名 type:Java 类型,若只设置type,默认的别名就是类名,且不区分大小写 --> <!-- <typeAlias type=\"com.atguigu.bean.User\" alias=\"u\"/> --> <typeAliases> <package name=\"org.xinzhang.mybatistest.bean\"/> </typeAliases>
同mybatis-config.xml
直接映射resources文件下文件目录,无需class文件中xml与class在一起的方式
mapper-locations
mybatis: type-aliases-package: org.xinzhang.springbootdemo.entity mapper-locations: classpath:mapper/*.xml
<settings> <setting name=\"mapUnderscoreToCamelCase\" value=\"true\"/> <setting name=\"lazyLoadingEnabled\" value=\"true\"/> <setting name=\"aggressiveLazyLoading\" value=\"false\"/> <setting name=\"cacheEnabled\" value=\"true\"/> </settings>
mybatis: configuration: map-underscore-to-camel-case: true lazy-loading-enabled: true aggressive-lazy-loading: false cache-enabled: true
表示本类是一个 MyBatis 的 Mapper
@Mapper注解修饰java接口
整合MyBatis框架
Spring data
集成数据库
过滤器/拦截器
在web开发中,安全第一位
没有安全框架功能也能实现
非功能性需求
隐私泄露
漏洞
架构一旦确定很难更改
设计之初考虑安全问题
基本介绍
vip1-6
认证/授权
功能权限
访问权限
菜单权限
大量原生代码,易造成冗余
拦截器/过滤器
功能
配置类来实现
横切
AOP
实现
文章
官方网址
SpringSecurity
Shiro
分布式开发 Dubbo(RPC风格)+zookeepe
swagger 接口文档
任务调度
待补充
SpringBoot
0 条评论
回复 删除
下一页