SpringBoot中使用注解读取redis缓存
SpringBoot中使用注解读取redis缓存
一、介绍
我们使用redis的时候,一般都是以下这个步骤
查询指定的redis缓存
如果有直接返回,(异步执行查询,更新redis缓存)
如果没有则执行查询,(同时设置redis缓存)
此外,如果是增删改操作,将触发一次设置redis缓存的操作。
上面的一些步骤高度重复,我决定造个轮子,基于注解、切面和反射来完成此项功能。
二、相关代码
1)依赖
处于SpringBoot中,redis、aop等相关依赖不要忘记
123456789101112<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> < ...
SpringBoot中的@Conditional注解
SpringBoot中的@Conditional注解
一、介绍
在Spring的应用下,我们希望一些bean可以通过一些条件来判断是否需要实例化,并加载到spring容器中。
所以,@Conditional注解就是为了解决上面这个需求而制定的注解。@Conditional注解是总接口,可以定制逻辑。
二、详情
1)@Conditional
先看源码,此注解需要传入Condition接口的实现类,可以多个
12345678@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Conditional { Class<? extends Condition>[] value(); }
所以,使用此注解时,我们若是有些高度定制化的一些判断,可以先实现Condition接口,再讲实现类提供给@Conditional注解,使用示例如下。
首先要有一个Condition ...
Java使用NIO实现Socket通信
Java使用NIO实现Socket通信
一、介绍
在上次的博客中,已经了解到NIO当中最为重要的两个对象。分别是缓冲Buffer和通道Channel,也进行了基本的使用,不过使用的是FileChannel,主要用来与文件打交道。
那么,这一次使用NIO实现Socket网络通信,主要是使用到ServerSocketChannel和SocketChannel。
同样,在本次作为NIO的网络通信,建议先了解传统BIO的网络通信,传送门在此。
二、实现
1)服务端
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475package com.banmoon.test;import lombok.extern.slf4j.Slf4j;import java.io.IOException;import java.net.InetSocketAddress;import ja ...
Java的NIO入门
Java的NIO入门
一、介绍
Java NIO是从Java 1.4版本开始引入的一个新的IO ,在传统的IO模型中,使用的是同步阻塞IO,也就是blocking IO。
而NIO指的是New IO,代指新IO模型。有些博客指的是not blocking IO,非阻塞IO,叫哪种都行,都是NIO。
在NIO中,最重要的两个东西就是缓冲Buffer和通道Channel了。继续往下看!
二、Buffer
缓冲区Buffer,可以理解成是一个含数组的容器对象,该对象提供了一组方法,可以更轻松地使用其中的数据。该对象记录了一些状态值,能够跟踪和记录缓冲区的状态变化情况。
后续的通道Channel的读取、写入操作都经过缓冲。
Buffer是一个抽象类,它的实现类有很多,但我们最常用的还是ByteBuffer,因为要和字节打交道嘛
它里面有四个最重要的状态值,分别是
mark:标记
position:当前读取或存储数据的索引位置,位置
limit:当前缓冲最大可以写入或读取到的位置,极限
capacity:当前缓冲的容量,容量
其中,mark<= position&l ...
数据库的三大范式
数据库的三大范式
一、介绍
没有规矩,不成方圆。这句话在数据库的规范中同样适用,所以就有了这几项规定,数据库的三大范式。
我相信很多人都听过三大范式,面试题中也经常会问到,什么是数据库三大范式,这太常见了。
以前我只是机械式的回复面试官,但以后不会,不仅要学会说概念说规范,还能从实际出发,要不要严格遵守三大范式。
二、概念
1)第一范式
概念:每一个列都是不可再分的列
例如下面这张表,由于region字段可以再细分为省份province和城市city,所以此表将不满足第一范式
name
sex
region
半月无霜
男
广东省广州市
将region字段拆分后,满足了第一范式
name
sex
province
city
半月无霜
男
广东省
广州市
2)第二范式
概念:在满足第一范式后,消除非主属性对主属性的部分函数依赖
先看看这张订单表,订单编号、商品ID、用户ID作为联合主键
每一个字段本身都不可再分,满足第一范式。
但其中有个字段用户名称,它依赖于用户ID,所以此表并不满足第二范式
订单编号
商品ID
用户ID
数量
金额
用户名称 ...
SpringBoot整合socket通信
SpringBoot整合socket通信
一、介绍
很多人都不太理解socket通信指的是什么,简单来讲,它是一个完成两个应用程序之间的数据传输的东西。
socket是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象,一个socket就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,socket上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口。
本次使用Java语言去实现socket通信,用的SpringBoot框架,当然直接使用main方法启用也是没有问题的。
二、实现
1)服务端
先设置一下需要用到的配置,主要就是这个端口号,我觉得放配置文件中会比较好
12socket-port: testSocket: 2333
socket服务端启动类
此处使用到了bean的初始化,如果不熟悉的话,使用静态代码块也是一样的
1234567891011121314151617181920212223242526272829303132333435363738394041424344packag ...
SpringBoot整合MyBatis多数据源
SpringBoot整合MyBatis多数据源
一、介绍
在平常的项目中,我们有连接数据库的需求。一般都是一个项目一个数据库,但也有例外需要连接多个数据库的。
那么该如何配置,可以达到多数据源的需求呢。
本次为SpringBoot与MyBatis的整合,其实掌握了需要配置什么,也很容易进行复刻。
二、配置
1)数据库准备
首先,我们先准备三个数据库吧,这边都使用MySQL了,实际可以是不同的数据库
test数据库
1234567891011create database `test` character set utf8mb4 collate utf8mb4_general_ci;CREATE TABLE `sys_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(32) NOT NULL COMMENT '用户名', `password` varchar(128) NOT NULL COMMENT '密码', PRIMARY KEY (`id`)) EN ...
SpringBoot使用矩阵传参
SpringBoot使用矩阵传参
一、介绍
在平时,我们在进行请求接口时,我们一个请求url的样子往往是下面这样子的
1http://localhost:8080/user/get?name=半月&age=18
对于上面的请求url,我们只需要使用@RequestParam注解就可以将其获取,十分简单。
那么,对于下面的这个矩阵传参的url,我们该如何进行获取呢?
123http://localhost:8080/user/get;name=半月;age=18http://localhost:8080/user/delete;id=11,12,13;status=1
这时候,我们就该使用到@MatrixVariable这个注解了,具体使用如下。
二、使用
1)基本使用
在springBoot中,默认是去掉了url分号后的内容。如此一来,我们在使用矩阵传参时,需要对其进行开启。
1234567891011121314151617package com.banmoon.test.config;import org.springframework.context.annotation ...
Java的函数式接口以及Lambda表达式
Java的函数式接口以及Lambda表达式
一、介绍
在java中,大家肯定使用过lambda表达式吧,这是适用于函数式接口的一种便捷写法。
那么什么是函数式接口,简单点来说,一个接口中有且只有一个需要实现的方法,那么这个接口就是函数式接口。
如果一个接口,你想定义为函数式接口,建议加上注解@Functionionallnterface,标注这个接口成为函数式接口,用来进行提示。
例如,多线程的Runnable接口就是一个函数式接口,如下
1234567package java.lang;@FunctionalInterfacepublic interface Runnable { public abstract void run();}
所以,我们在使用多线程时,可以使用lambda表达式进行简化
1234567891011121314151617181920212223242526package com.banmoon.test;import org.junit.jupiter.api.Test;public class SomethingTest ...
SpringBoot使用AOP详解
SpringBoot使用AOP详解
一、介绍
AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
好吧,以上来自百度百科
我知道,大家肯定是一头雾水。我们直接进入使用,用实践来进行理解。
二、使用
1)初识术语
本来很想直接上代码,但是不行,需要先过一遍AOP的概念术语,相关的专业名词。
先来看看下面这个需求,现在有一堆接口,需要统计他们耗时的一个需求,我们应该怎么做?
笨方法,在每个接口方法前后,放置起止时间进行计算。为什么说这是笨方法,自然是笨啦
一个两个还行,方法多了该怎么办
起止时间的计算是一种系统功能,原本方法中的功能是业务功能。两种不同的功能混杂在一起,非常难受
对架构,对维护不友好
那么上述的问题,可以使用AOP来解决,我 ...