每周计划
目前只写大体项目,其他具体细节,在项目对应的readme
好多项目其实是从github中寻找的,目的就是学习。当自己不会实现的时候,学习一下他人是如果实现的。
- spring boot 捕获全局异常
- spring boot 缓存 cache
- spring boot druid 数据库连接池 入门
- restful api
- token 机制防止重复提交
- 设计模式:责任链模式
- 缓存 spring cache 复习
- Swagger 文档
- Springboot 权限控制Shiro
- vue
- 聊天
- 新建一个捕获全局的类,每个方法实现捕获异常的逻辑。
- 新建自己的自定义异常类
- 返回实体建立,标准接口
- 定义枚举,主要方便管理返回数据
- 定义返回接口的工具类(将返回实体,转化json)
- 当接口返回值可能会有不同类型的时候,使用object类。建议使用result实力类,内有code,msg,data。封装成功和失败的返回工具类
- @controlleradvice,@RestControllerAdvice, @exceptionhandler
- 自定义异常 继承runtimeexception
- 使用枚举建立统一管理的异常返回信息
- 异常。当程序出现异常的时候,通过这些异常能够迅速定位出现问题的原因
- 算数异常类:ArithmeticExecption
- 空指针异常类型:NullPointerException
- 类型强制转换类型:ClassCastException
- 数组负下标异常:NegativeArrayException
- 数组下标越界异常:ArrayIndexOutOfBoundsException
- 违背安全原则异常:SecturityException
- 文件已结束异常:EOFException
- 文件未找到异常:FileNotFoundException
- 字符串转换为数字异常:NumberFormatException
- 操作数据库异常:SQLException
- 输入输出异常:IOException
- 方法未找到异常:NoSuchMethodException
- 下标越界异常:IndexOutOfBoundsExecption
- 系统异常:SystemException
- 创建一个大小为负数的数组错误异常:NegativeArraySizeException
- 数据格式异常:NumberFormatException
- 安全异常:SecurityException
- 不支持的操作异常:UnsupportedOperationException
- 枚举
- 继承 super() 指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类
本来打算使用redis和encache分别作为1天,但是看了一篇公众号的文章,很受启发。所以作为一篇文章。
- 使用jedis作为redis客户端,编写config
- 编写redisUtil工具类,实现基本的查询,验证,增加等功能
- 在serive中使用redisUtil
- 原则:
- 查询:先查redis,再数据库
- 增,删,改,先数据库,再redis
- redisCache 使用原本的思路. 缓存基本靠redis的工具类
- redisCache 配置,使用jedis,但是jedis只是作为连接使用,操作是redistemplate
- cachemanager 使用cachemanager管理
- 使用encache作为缓存客户端
采用redis作为缓存客户端,之前打算使用jedis作为连接客户端,这里使用lettuce作为客户端。
- 可以自定义缓存客户端
- 配置key和value
- 使用时无差别
- 阻塞客户端jedis
- @Primary注解
- lettuce
- 下载redis,make,src/redis-server
- yml 文件中自定义参数解析对象 @ConfigurationProperties(prefix="spring.redis.pool")
- 工厂模式
- cachemanager
Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。其他数据库连接池还有C3P0。
- 引入sql连接
- 配置数据库4项,驱动,连接地址,用户名,密码
- 使用mybatis 进行 curd
- druid-spring-boot-starter 配合Springboot的配置文件,可以直接使用
- druid 配置好配置文件后,需要在config中设置
- 使用druid-spring-boot-start 开发,参照官网。
- 多数据源 未实现,没看懂如何调用。
- 监控
- demo,官网的例子很好,可以参考。
- 引入pom druid-spring-boot-starter,数据库驱动
- 配置数据库4项
- 其他配置项
- 编写servert,并在启动类扫描,可以进入druid的web监控页面
- 多数据源
- Spring Boot 2.X 版本不再支持配置继承,多数据源的话每个数据源的所有配置都需要单独配置,否则配置不会生效
- apache druid
- druid 多数据源
- 监控web端
- 配置参数的意义
RESTful架构应该遵循统一接口原则,统一接口包含了一组受限的预定义的操作,不论什么样的资源,都是通过使用相同的接口进行资源的访问。接口应该使用标准的HTTP方法如GET,PUT和POST,并遵循这些方法的语义。
当你理解后,要按照这思路去建立以后的项目,而不是随意定义接口。这样有助于提升。
- 安全且幂等
- 获取表示
- 变更时获取表示(缓存)
- 不安全且不幂等
- 使用服务端管理的(自动产生)的实例号创建资源
- 创建子资源
- 部分更新资源
- 如果没有被修改,则不过更新资源(乐观锁)
- 不安全但幂等
- 用客户端管理的实例号创建一个资源
- 通过替换的方式更新资源
- 如果未被修改,则更新资源(乐观锁)
- 不安全但幂等
- 删除资源
- 使用名词。如 managed-devices/{device-id}
- http method对应不同的请求动作 GET:查询操作,POST:新增操作,PUT 更新操作,PATCH 部分更新,DELETE 删除操作
- 使用连字符-而不是_来提高URI的可读性
- 在URI中使用小写字母
- URI版本控制(推荐)http://api.example.com/v1
- 正确使用状态码
- @GetMapping
- @PostMapping
- @PutMapping
- method = DELETE
- @PathVariable:用于获取URL中的参数:一般{ }中的变量名与方法中的形参名一致(可以不加@PathVariable注解)
- @RequestBody POST方式进行提交
- 新建项目 web,restrepo
- 配置 server:servlet:context-path: /api
- controller 配置版本号
- curd
- HTTP状态码 统一接口返回实体
- 统一异常
- 幂等性 一次和多次请求某一个资源对于资源本身应该具有同样的结果
- jpa
- rest-api 类图
为了防止重复提交,使用redis进行效验。
查询文章,看到了,定时,再次加上定时功能。
注解
- @EnableScheduling
- @Scheduled(cron="xxx") 定时参数存放数据库
- 继承SchedulingConfigurer
- 重写configureTasks()
- ScheduledTaskRegistrar增加addTriggerTask CronTrigger
- corn表达式,可以直接网上查
- pom web,test,jpa,jedis,lombok,mysql,aop,apache工具包commons-lang3
- 启动类
- 配置类:1.redis配置,使用jedis客户端 2. 继承WebMvcConfigurationSupport,将拦截器加上
- 工具类:uuid生成token,redis工具类
- 自定义注解,如果方法加了注解就代表要验证
- 拦截器,其实可以使用aop进行验证的。拦截器,判断方法,里面有无token,没有拦截,有进行验证
- 返回实体,定义返回实体类,id,code,data
- 返回实体的枚举,统一管理返回值
- 自定义异常,处理service的异常
- 捕获全局异常类
- redisson的使用
- Interceptor 拦截器,预处理回调方法,后处理回调方法,整个请求处理完毕回调方法
- StrBuilder
- spring boot 启动周期
- HandlerMethod
- 常量类里面可以使用多个interface区分类别调用的时候常量实体.接口.常量名
- common-lang3 apach工具类,uuid就是类里面的方法
我用的idea是免费的社区版,不支持spring创建项目。创建springboot时,要么maven,要么用官网的脚手架工具。 模版是经常要用的,这里收集一下常用模版.
- 类,类名,描述,作者,时间,版本
- 方法,方法名,入参,回参,描述,作者,时间
- 准备工作,2个数据库,每个数据各有1张表
- appliaction文件分别配置数据库1,数据库2的基本信息
- 分别编写druidconfig
- 扫描不同的mapper,创建不同的datasource
- 其他分层照常编写
- ConfigurationProperties
在实际项目中,几乎没有使用过。
- 引入swagger和ui
- 配置config,返回docket
- 控制器类 @Api (tags = "", description="")
- 接口方法 @ApiOperation 注解来展开对接口的描述
- 实体 @ApiModel 和 @ApiModelProperty
- ApiInfo 文档的其他信息
- @ApiIgnore,在方法上增加
- apis():这种方式我们可以通过指定包名的方式,让 Swagger 只去某些包下面扫描。
- paths():这种方式可以通过筛选 API 的 url 来进行过滤。
关于权限控制这块,有Shiro和spring security,其实,每次用的时候,都需要百度一下用法,这次,通过事例,记录使用思路。
- 引入依赖,shiro-spring,shiro-redis
- 其他依赖 aop,redis-reactive
- 自定义Realm,继承AuthorizingRealm,实现下面2个方法
- doGetAuthenticationInfo 身份认证 (主要是在登录时的逻辑处理)。获取用户信息,与数据库验证
- doGetAuthorizationInfo:登陆认证成功后的处理 ex: 赋予角色和权限。获取用户信息,从数据库拿到角色和菜单
- 配置shiro
- 响应式的redis spring-boot-starter-data-redis-reactive
- RedisSessionDAO shiro将session保存到redis
- SecurityUtils
笔者官网先来一遍
- schema,data 配置无效
- mybatisplus配置mapperscan,扫描到包(com.sun.test.mapper)
serviceService CRUD 接口
- 引入pom,mp依赖mp,代码生成器单独引入
- 编写yml,配置数据库,mp需要加上mapper.xml的扫描地址
- 编写config,增加mapperscan
- 定义实体类
- dao 继承 basedao
- Flux 表示的是包含 0 到 N 个元素的异步序列。在该序列中可以包含三种不同类型的消息通知:正常的包含元素的消息、序列结束的消息和序列出错的消息。当消息通知产生时,订阅者中对应的方法 onNext(), onComplete()和 onError()会被调用。
- Mono 表示的是包含 0 或者 1 个元素的异步序列。该序列中同样可以包含与 Flux 相同的三种类型的消息通知。
在实际项目中,很少用到,但是为了学习这种编程的方式。就行java8的stream一样,如果熟练使用,那学习spark,flink那些算子就很简单了。
- 引入pom依赖
- 编写application,与正常一样
- 一下2个步骤都是简要步骤,api和编程规范还需要多熟悉。如果不熟悉,那3,4这两步只是虚的。
- 编写Router,在router调用hanlder。RouterFunction
- 编写handler,返回helloworld。Mono(ServerResponse.状态.contentType,方法)
- Mono和Flux都是Publisher发布者
- 对于 Subscriber 和 Subcription 这两个接口 Reactor 必然也有相应的实现
- 反应式编程框架主要采用了观察者模式
- Reactive Streams 是规范,Reactor 实现了 Reactive Streams。Web Flux 以 Reactor 为基础,实现 Web 领域的反应式编程框架
- @Builder(toBuilder = true) UserInfo userInfo = UserInfo.builder().name("zzl").build();
- vue create project
- npm install server
- public 不更改文件
- src 更改文件
- components 零部件
- views 页面组建,整合零部件(templates,style,script)
- app.vue 首页 (div id=app)
- router.js 路由(引入组建,配置path)
- .{padding:0,margin:0} 全局边距0
- margin 上下 左右
- 引入 component improt xxx from xxxx
- export default components { 引入xxx }
- templates 使用xxx
- 引入Vue,输出新Vue
- npm i axios -S
- 子与父组建通信 proper
- watch