学自B站狂神
Spring官方提供了非常方便的工具让我们快速构建应用
Spring Initializr:https://start.spring.io/
然后下拉
然后吧下载的解压 同时用IDEA打开这个解压后的文件夹
简单几步,就完成了一个web接口的开发,SpringBoot就是这么简单。所以我们常用它来建立我们的微服务项目!
关于Spring-boot-maven-plugin插件爆红
=>加入与parent中版本相同的version就行
关于打包失败的错误
=>springboot版本和maven版本冲突
有可能是端口号设置的原因
结果
打成了jar包后,就可以在任何地方运行了!OK 就算没有IDEA
点进去之后,发现还有一个父依赖
这才是真正管理SpringBoot应用所有依赖版本的地方,SpringBoot版本控制中心。
以后我们导入依赖默认是不需要写版本的;但如果导入包没有在依赖中管理那么还是要手动配置版本的。
springboot-boot-starter-xxx:就是spring-boot的场景启动器
例如:pring-boot-starter-web:帮我们导入了web模块正常运行所依赖的组件;
SpringBoot将所有的功能场景都抽取出来,做成一个个的starter (启动器),
只需要在项目中引入这些starter即可,所有相关的依赖都会导入进来 ,
我们要用什么功能就导入什么样的场景启动器即可,未来自己自定义 starter.
作用:标注在某个类上说明这个类是SpringBoot的主配置类 , SpringBoot就应该运行这个类的main方法来启动SpringBoot应用;
进入这个注解:可以看到上面还有很多其他注解!
@SpringBootApplication =
②@Configuration + ③@EnableAutoConfiguration + ①@ComponentScan。
作用:自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器
作用:自动配置导入选择器。那么会导入那些组件呢
点进这个类可以看到一个名为自动配置入口的方法
点进这个方法
①.getCandidateConfigurations:获得候选配置
②.getSpringFactoriesLoaderFactoryClass():
返回:我们最开始看启动自动导入配置文件的注解类;EnableAutoConfiguration
③SpringFactoriesLoader详解:属于Spring框架私有的一种扩展方案,
其主要功能就是从指定的配置文件META-INF/spring.factories加载配置
点进下面这个类的loadFactoryNames()方法
Spring.factories
思考:为何这么多自动配置为什么有的没有生效,需要导入对应的starts才能生效?
=>核心注解:@ConditionOnXXX 如果这里面条件都满足,才会生效
找个不满足的例子,如下
看见没有。爆红了。说明不满足其条件
SpringApplication.run分析
分析该方法主要分两部分:①SpringApplication的实例化+②run方法的执行;
yaml文件更强大在于可以给我们实体类直接注入匹配值
第一步:SpringBoot项目中resource目录新建一个文件application.yml
第二步:编写一个实体类
第三步:思考:我们原先怎么给属性赋值的?->使用@Value
第四步:测试狗狗输出
第五步:再来个一个复杂的实体类同时去掉前面给Dog属性赋值
同时使用yaml配置的方式进行注入,大家写的时候注意区别和优势,我们编写一个yaml配置!
第六步:处理报红,就算报红也能使用。
第七步:测试及结果
@PropertySource :加载指定的配置文件;
@configurationProperties:默认从全局配置文件中获取值;
第一步:去resource新建一个person.properties 【自定义配置文件】
第二步:然后在实体类中指定加载这个自定义配置文件
第三步:测试输出
配置文件还可以编写占位符生成随机数.
修改之前的yaml,如图所示
输出结果
第一步:新建一个实体类User
第二步:编辑配置文件user.properties
第三步:我们在User类上使用@Value来进行注入!
第四步:测试
我们这里来写个注解让我们的name只能支持Email格式;
测试
外部加载配置文件方式十分多,选择最常用即可,在开发资源中进行配置
SpringBoot会从这四个位置全部加载主配置文件;互补配置
Spring.factories
我们以这个HttpEncodingAuto
结果发现这是跟Yaml语法的配置文件绑定起来了,这让我们进一步了解自动装配的原理
根据不同的条件判断,如果满足指定的条件,整个配置类里面的配置就会生效;
我们分析完毕了源码以及自动装配的过程,我们可以尝试自定义一个启动器来玩玩!
启动器模块是一个 空 jar 文件,仅提供辅助性依赖管理,这些依赖可能用于自动装配或者其他类库;
Sping Data 官网:https://spring.io/projects/spring-data
数据库相关的启动器 :可以参考官方文档:
https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#using-boot-starter
新建一个项目测试:springboot-data-jdbc ; 引入相应的模块!基础模块
根据XXXConfiguration来全局搜索DataSourceAutoConfiguration
可以在这里看到hikariDataSource
连接了数据库
编写一个Controller,注入 jdbcTemplate,编写测试方法进行访问测试;
测试正常,结果正常
到此,CRUD基本操作使用JDBC就搞定了
Github地址:https://github.com/alibaba/druid/
com.alibaba.druid.pool.DruidDataSource 基本配置参数如下:
为 DruidDataSource 绑定全局配置文件中的参数,再添加到容器中,而不再使用 Spring Boot 的自动生成。
第二步:配置完毕后,我们可以选择访问 :http://localhost:8080/druid/login.html
配置 Druid web 监控 filter 过滤器
按需求进行配置即可,主要用作监控!
有一个方法:addResourceHandlers 添加资源处理
①②都是关于静态资源的配置
对于①:什么是webjars
对于②:
staticPathPattern = “/**”=>映射到四个路径
点进去之后,可以看到
源码
同样在WebMvcAutoConfiguration 这配置类里可以找到
测试
可以看到 成功了
Thymeleaf 官网:https://www.thymeleaf.org/
Thymeleaf 在Github 的主页:https://github.com/thymeleaf/thymeleaf
Spring官方文档:找到我们对应的版本
https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#using-boot-starter
要学习语法,还是参考官网文档最为准确,我们找到对应的版本看一下!
Thymeleaf 官网:https://www.thymeleaf.org/ , 简单看一下官网!
我们去下载Thymeleaf的官方文档!
打开这个PDF
我们做个最简单的练习 :我们需要查出一些数据,在页面中展示
xmlns:th=”http://www.thymeleaf.org”
OK,入门搞定,我们来认真研习一下Thymeleaf的使用语法!
1、我们可以使用任意的 th:attr 来替换Html中原生属性的值!
2、我们能写哪些表达式呢?
地址 :https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#boot-features-spring-mvc-auto-configuration
=> SpringMVC做了那些配置?
Spring MVC Auto-configuration
// Spring Boot为Spring MVC提供了自动配置,它可以很好地与大多数应用程序一起工作。
Spring Boot provides auto-configuration for Spring MVC that works well with most applications.
// 自动配置在Spring默认设置的基础上添加了以下功能:
The auto-configuration adds the following features on top of Spring’s defaults:
// 包含视图解析器
Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.
// 支持静态资源文件夹的路径,以及webjars
Support for serving static resources, including support for WebJars
// 自动注册了Converter:
// 转换器,这就是我们网页提交数据到后台自动封装成为对象的东西,比如把"1"字符串自动转换为int类型
// Formatter:【格式化器,比如页面给我们了一个2019-8-10,它会给我们自动格式化为Date对象】
Automatic registration of Converter, GenericConverter, and Formatter beans.
// HttpMessageConverters
// SpringMVC用来转换Http请求和响应的的,比如我们要把一个User对象转换为JSON字符串,可以去看官网文档解释;
Support for HttpMessageConverters (covered later in this document).
// 定义错误代码生成规则的
Automatic registration of MessageCodesResolver (covered later in this document).
// 首页定制
Static index.html support.
// 图标定制
Custom Favicon support (covered later in this document).
// 初始化数据绑定器:帮我们把请求数据绑定到JavaBean中!
Automatic use of a ConfigurableWebBindingInitializer bean (covered later in this document).
/*
如果您希望保留Spring Boot MVC功能,并且希望添加其他MVC配置(拦截器、格式化程序、视图控制器和其他功能),
则可以添加自己的@configuration类,类型为webmvcconfiguer,但不添加@EnableWebMvc。
如果希望提供RequestMappingHandlerMapping、RequestMappingHandlerAdapter或ExceptionHandlerExceptionResolver的自定义实例,
则可以声明WebMVCregistrationAdapter实例来提供此类组件。
*/
If you want to keep Spring Boot MVC features and you want to add additional MVC configuration(interceptors, formatters, view controllers, and other features),
you can add your own@Configuration class of type WebMvcConfigurer but without @EnableWebMvc.
If you wish to providecustom instances of RequestMappingHandlerMapping, RequestMappingHandlerAdapter, orExceptionHandlerExceptionResolver,
you can declare a WebMvcRegistrationsAdapter instance to provide such components.
// 如果您想完全控制Spring MVC,可以添加自己的@Configuration,
并用@EnableWebMvc进行注释。
If you want to take complete control of Spring MVC,
you can add your own @Configuration annotated with @EnableWebMvc.
我们给 DispatcherServlet 中的 doDispatch方法 加个断点进行调试一下,因为所有的请求都会走到这个方法中
从WebMvcAutoConfiguration中寻找Formatter
点进去
自定义格式化
所以如果看到@Configuration,一定要多注意,扩展了什么功能。
通过阅读上面的官方文档
关于@EnablEWebMvc,我们来看看怎么回事
点进去
发现其实就是导入了这个类,然后继续点进去
发现这个类继承了WebMvcConfigurationSupport
然后我们去WebMvcAutoConfiguration
然后就会发现这个类就是前面继承的那个类,
这也就说明了为啥加入@EnablEWebMvc会让自动配置失效的理由。
所以如果自研starter,那么需要XXXconfiguration和XXXproperties弄成jar包,
导入到这里。
比如
一定会有@ConditionalOnXXX
我们的网站会去涉及中英文甚至多语言的切换,这时候我们就需要学习国际化。
会弹出以下窗口
④接下来,我们就来编写配置
我们可以看到idea下面有另外一个视图;
这个视图我们点击 + 号就可以直接添加属性了;我们新建一个login.tip,可以看到边上有三个文件框可以输入
我们添加一下首页的内容!
然后依次添加其他页面内容即可!
然后我们去配置文件看
OK,配置文件步骤搞定!
我们真实 的情况是放在了i18n目录下,所以我们要去配置这个messages的路径;
然后点进去后
所以
点进去之后有个方法
所以:我们要自己写一个区域解析器
然后作为组件进行容器注册
去BootStrap可视化布局网站
然后获取其代码
去页面获取国际化的值,查看Thymeleaf的文档,找到message取值操作为:#{…}。
修改首页代码,如下图
效果图:
SpringBoot集成Swagger => springfox,两个jar包
Springfox-swagger2
swagger-springmvc
要求:jdk 1.8 + 否则swagger2无法运行
步骤:
1、新建一个SpringBoot-web项目
2、添加Maven依赖
3、编写HelloController,测试确保运行成功!
4、要使用Swagger,我们需要编写一个配置类-SwaggerConfig来配置 Swagger
5、访问测试 :http://localhost:8080/swagger-ui.html ,可以看到swagger的界面;
1、Swagger实例Bean是Docket,所以通过配置Docket实例来配置Swaggger。
点进去之后,发现了对应
(1)点进去DocumentationType
(2)点进去ApiInfo
发现
2、可以通过apiInfo()属性配置文档信息
3、Docket 实例关联上 apiInfo()
4、重启项目,访问测试 http://localhost:8080/swagger-ui.html 看下效果;
1、构建Docket时通过select()方法配置怎么扫描接口。
2、重启项目测试
由于我们配置根据包的路径扫描接口,所以我们只能看到一个类
3、还可以通过配置其他方式扫描接口
4、还可以配置接口扫描过滤:
那么就找不到这个Controller下的HelloController,因为被过滤了
1、通过enable()方法配置是否启用swagger
如果是false,swagger将不能在浏览器中访问了
2、如何动态配置
当项目处于test、dev环境时显示swagger,处于prod时不显示?
3、可以在项目中增加一个dev的配置文件查看效果
然后启动
1、如果没有配置分组,默认是default。通过groupName()即可配置分组:
2、如何配置多个分组?
配置多个分组只需要配置多个docket即可:
1、新建一个实体类
2、只要这实体在请求接口的返回值上(即使是泛型),都能映射到实体项中:
3、重启查看测试
Swagger的所有注解定义在io.swagger.annotations包下
我们也可以给请求的接口配置一些注释
我们可以导入不同的包实现不同的皮肤定义:
1、默认的 访问 http://localhost:8080/swagger-ui.html
2、bootstrap-ui 访问 http://localhost:8080/doc.html
3、Layui-ui 访问 http://localhost:8080/docs.html
4、mg-ui 访问 http://localhost:8080/document.html
在我们的工作中,常常会用到异步处理任务,比如我们在网站上发送邮件,后台会去发送邮件,此时前台会造成响应不动,直到邮件发送完毕,响应才会成功,所以我们一般会采用多线程的方式去处理这些任务。
步骤:
1.创建一个service包
2.创建一个类AsyncService
3.创建一个Controller包
4.编写AsyncController类
5.测试
访问http://localhost:8080/hello进行测试,3秒后出现success,这是同步等待的情况
6.给hello方法添加@Async注解;
SpringBoot就会自己开一个线程池,进行调用!但是要让这个注解生效,我们还需要在主程序上添加一个注解@EnableAsync ,开启异步注解功能;
7.重启测试,网页瞬间响应,后台代码依旧执行
步骤:
1.创建一个ScheduledService
2.开启定时任务功能
这里写完定时任务之后,我们需要在主程序上增加@EnableScheduling 开启定时任务功能
3.我们来详细了解下cron表达式;
http://www.bejson.com/othertools/cron/
4 常用的表达式
邮件的发送,微信的前身也是邮件服务呢?这些东西都是怎么实现的呢?其实SpringBoot都给我们提供了对应的支持
步骤:
1.引入依赖
点进去依赖可以看到jakarta.mail
2.查看自动配置类:MailSenderAutoConfiguration
点进去之后
3.配置文件
获取授权码:在QQ邮箱中的设置->账户->开启pop3和smtp服务
4.Spring单元测试
①一个简单的邮件
然后启动,稍等一会就会看见给自己发的邮箱
②一个复杂的邮件
1.数据库设计
CREATE DATABASE springboot
CREATE TABLE article
(
id
INT(10) NOT NULL AUTO_INCREMENT COMMENT ‘int文章的唯一ID’,
author
VARCHAR(50) NOT NULL COMMENT ‘作者’,
title
VARCHAR(100) NOT NULL COMMENT ‘标题’,
content
LONGTEXT NOT NULL COMMENT ‘文章的内容’,
PRIMARY KEY (id
)
) ENGINE=INNODB DEFAULT CHARSET=utf8
2.基础项目搭建
①新建一个项目
②建一个SpringBoot项目配置
③测试
④导入相关依赖
④连接数据库同时建立实体类
⑤编写DAO接口和对应的Mapper配置文件
⑥告诉SpringBoot这些Mapper配置文件在哪里
⑦编写对应的Controller测试一下是否有问题
顺序:添加->修改->查询->删除
这里我们使用的是Editor.md
所有要下载下来,如图
①如何使用Editor
1.导入Editor.md资源,去掉一些多余的东西[留下这些框住的]
2.新建文章页面 editor.html、需要引入 jQuery;
这里我们放在了templates目录中【属于四个路径中的一个】
推荐阅读文章:https://www.jianshu.com/p/2accc2840a1b
pache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架。
它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
Dubbo官网文档:https://dubbo.apache.org/zh/docs/
点进dubbo官方文档,推荐我们使用Zookeeper 注册中心
什么是Zookeeper=>
①下载windows apache-zookeeper-3.7.0-bin.tar.gz
【3.5后版本这种-bin是编译好的才是我们需要的,别下错了】
②运行/bin/zkServer.cmd ,初次运行会报错,没有zoo.cfg配置文件;
地址 :https://github.com/apache/dubbo-admin/tree/master
②解压进入目录
修改 dubbo-admin\src\main\resources \application.properties 指定zookeeper地址
③在项目目录下打包dubbo-admin
命令:mvn clean package -Dmaven.test.skip=true
第一次打包的过程有点慢,需要耐心等待!直到成功
若出现错误
那么修改
这是成功之后
④执行 dubbo-admin\target 下的dubbo-admin-0.0.1-SNAPSHOT.jar
【注意:zookeeper的服务一定要打开!】
执行完毕,我们去访问一下 http://localhost:7001/ , 这时候我们需要输入登录账户和密码,我们都是默认的root-root;
这是登录成功之后的界面
安装完成!
①框架搭建
1.新建一个空项目
2.创建一个模块,实现服务提供者[名字]:provider-server , 选择web依赖即可
3…项目创建完毕,我们写一个服务,比如卖票的服务;
编写接口
编写实现类
4.创建一个模块,实现服务消费者:consumer-server , 选择web依赖即可
5.项目创建完毕,我们写一个服务,比如用户的服务;
编写service
zookeeper的包我们去maven仓库下载,zkclient;
Pom.xml
2.在springboot配置文件中配置dubbo相关属性!
3.在service的实现类中配置服务注解,发布服务!注意导包问题
逻辑理解 :应用启动起来,dubbo就会扫描指定的包下带有@component注解的服务,将它发布在指定的注册中心中!
③服务消费者[consumer-server]
1、导入依赖,和上面的依赖一样;
2、配置参数
3、本来正常步骤是需要将服务提供者的接口打包,然后用pom文件导入,
我们这里使用简单的方式,直接将服务的接口拿过来,路径必须保证正确,
即和服务提供者相同;
4、完善消费者的服务类
要是少了@DubboRefence就会出现空指针异常
5、测试类
④启动测试
ok , 这就是SpingBoot + dubbo + zookeeper实现分布式开发的应用,其实就是一个服务拆分的思想;
市面上存在比较有名的:Shiro,Spring Security !
①实验环境搭建
1.新建一个初始的springboot项目web模块,thymeleaf模块
2.导入静态资源
具体资源可以去Gitee去找,下面地址就是
https://gitee.com/ENNRIAAA/spring-security-material?_from=gitee_search
目前,我们的测试环境,是谁都可以访问的,使用 Spring Security 增加上认证和授权功能
①引入 Spring Security 模块
②编写 Spring Security 配置类
③定制请求的授权规则
④试一下
发现除了首页都进不去了!因为我们目前没有登录的角色,因为请求需要登录的角色拥有对应的权限才可以!
⑤在configure()方法中加入以下配置,开启自动配置的登录功能!
⑥试一下
发现,没有权限的时候,会跳转到登录的页面!
⑦查看刚才登录页的注释信息;
我们可以定义认证规则,重写configure(AuthenticationManagerBuilder auth)方法
⑧测试
我们可以使用这些账号登录进行测试!发现会报错!
也就是说需要将密码加密才可以使用 这个新版本
⑨加密密码
⑩测试
发现,登录成功,并且每个角色只能访问自己认证下的规则!搞定
①开启自动配置的注销的功能
②我们在前端,增加一个注销的按钮,index.html 导航栏中
③我们可以去测试一下
登录成功后点击注销,发现注销完毕会跳转到登录页面!
④但是,我们想让他注销成功后,依旧可以跳转到首页,该怎么处理呢?
⑤我们可以去测试一下
注销完毕后,发现跳转到首页OK
⑦修改我们的前端页面
导入命名空间
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"
修改导航栏,增加认证判断 【在index.html页面】
⑧重启测试
我们可以登录试试看,登录成功后确实,显示了我们想要的页面;
⑩我们继续将下面的角色功能块认证完成! 【index.html页面】
⑩①测试一下!
发现确实成功了
①开启记住我功能
③我们点击注销的时候
可以发现,spring security 帮我们自动删除了这个 cookie
④结论
登录成功后,将cookie发送给浏览器保存,以后登录带上这个cookie,只要通过检查就可以免登录了。
如果点击注销,则会删除这个cookie,具体的原理我们在JavaWeb阶段都讲过了,这里就不在多说了!
现在这个登录页面都是spring security 默认的,怎么样可以使用我们自己写的Login界面呢?
①在刚才的登录页配置后面指定 loginpage
②然后前端也需要指向我们自己定义的 login请求 【index.html】
③我们登录需要处理的地方
需要将这些信息发送到哪里,
我们也需要配置,login.html 配置提交请求及方式,方式必须为post: 【login.html】
吧这些参数传给了/login 而我们自己定制的首页是/toLogin所以还需要处理
④这个请求提交上来需要处理的地方
我们还需要验证处理,怎么做呢?我们可以查看formLogin()方法的源码!我们配置接收登录的用户名和密码的参数!
点进去之后然后往下拉,可以看见
所以
⑤在登录页增加记住我的多选框 【login.html】
⑥后端验证处理!
⑦测试
OK