自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

记录,记录,记录

坚持,再坚持

  • 博客(222)
  • 收藏
  • 关注

原创 SpringBoot 整合 AOP

文章目录1、导包2、编写切面类3、注解解释4、自定义注解Spring的AOP是对方法的增强,通过动态代理的方式去实现。1、导包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> <versio

2021-05-26 23:04:11 263

原创 SpringBoot整合MQTT

SpringBoot整合MQTT1、导包 <!-- MQTT--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-integration</artifactId> <version> 2.1

2021-05-09 22:01:42 283

原创 windows下的Mosquitto的安装和运行

1、下载与安装下载地址:官网地址,傻瓜式下载与安装,选择你自己合适的地方安装软件。在安装完成后,在你的安装位置会有一个Mosquitto文件夹,里面有一堆文件,我们需要关心的只有三个,如下:mosquitto.conf:具体配置信息aclfile.example:topic配置pwfile.example:用户密码配置2、运行在安装好之后,便可以直接运行。MQTT运行有三个组成:代理(Broker),订阅(subscriber),推送(publisher),所以我们需要开启三个cmd窗

2021-05-09 16:53:01 1370

原创 一个SpringBoot项目的开始

Java后端的本质就是获取上传的数据、处理后保存到数据库、有需求时再获取数据并返回给前端。一个好的项目结构是一个好的开始,我做了以下操作,分别是数据获取绑定参数校验统一异常处理统一返回结果状态码枚举一些基础类数据获取绑定:SpringMVC中有三个注解可以获取数据并绑定到参数上:@RequestParam:获取url或者请求体中数据,但请求体的Content-Type需要为application/x-www-form-urlencoded格式,它是POST请求的默认格式。@

2021-04-15 15:44:39 135

原创 Spring Security身份认证、权限验证、异常处理、自动登录流程整理

SpringSecurity是一系列filter,我们看功能实现,看你具体Filter就可以了。我们需要关注的过滤器大致有4个:UsernamePasswordAuthenticationFilter:登录认证过滤器FilterSecurityInterceptor:权限认证过滤器ExceptionTranslationFilter:登录/权限认证失败处理器RememberMeAuthenticationFilter:自动登录过滤器1、UsernamePasswordAuthenticati

2021-04-07 15:09:32 1716

原创 一个SpringBoot项目的项目结构

一个后端项目我们应该考虑如下问题:①:参数的接受及校验;②:统一返回体;③:统一异常处理;④:代码生成器1、参数的接受及校验我们可以通过自定义接受对象和返回对象来接受这个问题,再通过@RequestBody,@RequestParam和@PathVariable注解来进行参数获取。参数校验:我们可以通过validation来解决这个问题,我们主要做三步:引入组件: <dependency> <groupId>org.s

2021-03-22 14:38:14 329

原创 Spring Security用户登录认证流程

Spring Security的认证流程Spring Security的登录认证流程始于AbstractAuthenticationProcessingFilter,默认使用类为UsernamePasswordAuthenticationFilter,当然也可以自己去自定义。public abstract class AbstractAuthenticationProcessingFilter { ... public void doFilter(ServletRequest req, Ser

2021-03-10 23:13:06 751

原创 Spring:事件发布机制

起因是在看Spring Security时,看到如下代码 protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { ... if (this.eventPublisher != null)

2021-02-21 23:37:52 160

原创 Spring Security RememberMe 自动登录流程

Spring Security 是根据cookie来完成自动登录功能的,所以我将解析分为两部分:何时让请求带上cookie;如何去解析cookie。1、何时添加cookie还记得处理登录的过滤器嘛,没错,一切都是从哪里开始,AbstractAuthenticationProcessingFilter。我们先去扎到它的doFilter()方法,如下: private void doFilter(HttpServletRequest request, HttpServletResponse respons

2021-02-15 21:21:34 216

原创 Spring Security 授权过程

过滤器FilterSecurityInterceptor是一个请求处理过程中安全机制过滤器链中最后一个filter,它执行真正的HTTP资源安全控制,我们直接找到doFilter()方法。FilterInvocation你可以看成带有HttpServletRequest,HttpServletResponse,FilterChain属性的类,也就是过滤器上下文对象。public class FilterSecurityInterceptor extends AbstractSecurityInterce

2021-02-13 21:49:52 942

原创 Spring Security登录流程

1、Authentication存放用户信息类的顶层接口为Authentication,我们从这个类往下找,发现常用的实现类有UsernamePasswordAuthenticationToken。我们对与之关联的5个类进行观察:AuthenticationAbstractAuthenticationTokenUsernamePasswordAuthenticationTokenGrantedAuthoritySimpleGrantedAuthority我们可以发现,

2021-02-12 20:15:27 541

原创 Spring Security框架的快速开始

1、项目简单开始1、导包采用spring boot + spring security的方式 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>2、编写c

2021-02-06 14:55:07 134

原创 单例模式

如果让你写一个单例模式的案例,你会怎么写,在我的印象中单例模式嘛,本意就是在这个容器中,只能存在一个类的实例,然后我会这么写:public class SingleTest { private static final SingleTest single = new SingleTest(); private SingleTest(){} public SingleTest instance(){ return single; }}

2021-01-31 21:43:08 53

原创 ModelMapper工具类的简单实用

通常,我们需要将数据库查询出来的数据封装到XXXDTO中再传给前端,如果是我们自己来进行封装的话,我们就需要用到繁杂的getter/setter来进行操作,不过有现成的轮子为啥不用呢?ModelMapper,就是这么一个工具,下面我们就来看下它的简单实用。在进行演示之前,先添上工具的官网:点击这里进入ModelMapper官网好,现在开始演示:由于它是一个额外的轮子,第一步,我们需要导入该jar包<dependency> <groupId>org.modelmapper&

2021-01-31 21:28:03 576

原创 Java-11:IO流

关于Java IO,我会快速想到如下几点:字节流、字符流相应的接口及实现类字节流与字符流之间的转换装饰器模式字节流和字符流的区别就是如何去看待一段二进制序列,我们都知道计算机中的最小单位是比特(bit),一个字节 = 8bit,一个字符 = 2字节 = 16bit(编码为utf-8)。一段二进制序列过来,如何我们不告诉它怎么解读它,你让它怎么办,随机选择?IO流就是对数据传输的抽象,IO流的分为输入流和输出流。输入流输出流字节流InputStreamOutputSt

2021-01-26 21:32:18 106

原创 Java-10:ConcurrentHashMap

看一个类先来看它的类声明,JDK在ConcurrentHashMap类上的申明写到:ConcurrentHashMap是一个线程安全的,支持高性能、高并发,其功能与HashTable类似在进行访问操作时并不需要锁着整个表,即使是有其他线程在进行更新或者修改操作1、继承结构在看继承继承结构的时候,要点就是接口通常为抽象方法,Abstract类通常实现常用类,然后实现一些普通类。Map接口:定义通用的map方法AbstracMap接口:实现一些常用的map方法Serializable接口:标

2021-01-25 21:38:08 76

原创 Java-09:Hashtable、HashMap、TreeMap有什么不同?

惯例,看类对比,先来看下继承结构关系1.继承图谱Map接口表示这个集合是一个键值映射的数据结构,Map不能包含重复的Key,每个键只能映射到一个值。Map提供了三种遍历集合的方法,分别是entrySet(),KeySet(),values()来得到Map中的数据,除此之外,还提供了很多操作Map的方法,如put(),remove(),get(Object)等。Dictionary抽象类:Map接口替代了它AbstractMap抽象类:实现Map接口的常用方法SortMap接口:提供排序的基本方法

2021-01-23 23:29:36 119

原创 Java-08:Vector、ArrayList、LinkedList有何区别?

三个集合都是我们常用的数据集合,在看它们之间的区别前,我们先来看看它们的继承结构。1、继承结构图Collection接口是层次结构中的根接口,构成Collection的单元称为元素。Collection接口提供了添加元素,删除元素,管理数据的方法 。List接口表示这是一个元素有序,可以重复,可以为null的集合,那它又是凭借什么实现有序的。List数据结构在内存中会开辟一块连续的空间,然后将内存地址与索引对应。Queue接口在Collection基础上添加操作队列方法,Deque接口是一个双向队

2021-01-20 23:01:39 93

原创 Java-07:int和Integer有什么区别?

7、int 和 Integer有什么区别?1、数据类型iint是基本数据类型,保存在栈中;Integer是引用类型,在堆中申请内存存放数据,在栈里申明引用指向堆中的内存地址。基本数据类型在栈中怎么存储?int a = 10;int b = 10;JVM有一个局部变量表用来保存引用,如上,建立引用a和引用b,再申请两块内存来存放数据,由引用a和引用b指向它们的内存地址。在Java中, "=="符号是用于比较引用的值,这话没毛病。那引用类型在堆中怎么存储?Java普通对象在HotSpot虚拟机

2021-01-19 22:22:34 238

原创 Java-06:动态代理

6、动态代理谈及动态代理,难免避不开Java的反射技术。Java的反射机制:在程序运行时通过加载已知的class,从而可以操作类或者属性和方法。Java是先编译再运行的语言,Java源文件都是要先经过编译生成class文件,当程序需要动态加载某些类时,它就可以通过反射机制来创建对象并调用方法。Java 反射api的使用方法在这里不做赘述,不懂的同学可以移驾这里→反射api的使用说完反射机制,我们来说说动态代理在常用框架Spring中支持模式:JDK Proxy 或者 cglib,不过先来看下动态代

2021-01-18 23:21:40 99 1

原创 Java-05:理解 Java 的字符串,String、StringBuffer、StringBuilder 有什么区别?

问题: 理解 Java 的字符串,String、StringBuffer、StringBuilder 有什么区别?String类由final关键字修饰,表示不可继承;存放数据的数据结构是char[],也是final修饰,同时String类中也没有提供可以直接操作char[]的方法,所以每次使用拼接、裁剪字符串等方法,都会生成一个新的String对象。又由于字符串的操作频繁,对应用性能会有明显影响。StringBuffer就是用来解决由于操作频繁生成太多的STtring对象的问题,它通过append或者

2021-01-17 23:38:03 70

原创 Mybatis自定义SQL的关系映射、分页、排序

目的: 记录数据库表与实体对象之间不同的映射关系如何用mybatis的自定义sql和结果返回集处理。1、三种对象映射关系1.1 一对一一个人对应一个身份证,一位同学对应一个班级,每个房间都有自己的房间号,当一个事物它对应另一个事物是唯一的,那么它们之间的关系就是一对一的。这里我演示的案例是,一个学生有着一位老师老师基础信息:学生详细信息:如果说,我们需要将两个表一起查出来,我们可以这么做:问题: 如果对象的列重复了,必须要使用到别名1、先定义实体结构,也就是我们返结果的实体类publ

2021-01-17 20:49:04 632

原创 Java-04: 强引用、软引用、弱引用、幻象引用有什么区别?

问题: 强引用、软引用、弱引用、幻象引用有什么区别?先说下区别: 不同的引用类型表示的是对象不同的可达性状态以及对垃圾收集的影响。在Java语言中,除了基本数据类型外,其他的都是指向各类对象的对象引用;Java中根据其生命周期的长短,将引用分为4类。1. 强引用我们平常编写代码Object obj = new Object()中的obj就是强引用。通过关键字new创建的对象所关联的引用就是强引用。 当JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),使程序异常终

2021-01-16 22:27:31 63

原创 Java-03:谈谈 final、finally、 finalize 有什么不同?

问题: 谈谈 final、finally、 finalize 有什么不同?final: Java关键字,可以用来修饰类,成员变量,方法,参数。修饰类:表示该类不可被继承成员变量:引用类型:引用指向的内存地址不可改变,但引用内部的数值是可以改变;基本类型:数值不可变方法:表示该方法不可被重写参数:基本类型:表示该参数在方法中不能被改变;引用类型:不能被赋值,引用不能去指向其他地址。finally: 出现在异常处理,通常用法为try…finally或者try…catch…finally,fina

2021-01-16 14:42:02 113

原创 Java-02:Exception 和 Error有什么不同

问题:对比 Exception 和 Error、运行时异常与一般异常有什么区别?1、Exception和ErrorJava语言在设计之初就提供相对完善的异常处理机制。在Java中,只有Throwable类型的实例才有可能被捕获或者抛出。其中Exception和Error都继承了Throwable类。Exception表示程序在正常运行下,可能会出现的异常情况,可以并且应该被捕获,使程序恢复正常运行。Error表示程序在正常运行下,不太可能会出现的情况,绝大部分的Error会导致程序处于非正常情况,无

2021-01-14 21:07:12 67

原创 HTTP服务器、Servlet容器、Tomcat

这个Servlet不陌生吧,但是我从来不知道它到底是个啥,直到某天,看了这个→从 Servlet 入手带你看架构和框架设计的套路。public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doG

2021-01-13 21:27:49 196 2

原创 Mybatis-plus的分页插件

案例建立在已使用mybatis-plus的项目上,下面来看吧!1、添加插件通过一个配置,来加入分页插件@Configurationpublic class MybatisConfig { @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor();

2021-01-12 23:35:09 205

原创 如何优雅地包装controller的返回结果

现在项目情况都是前后端分离,后端人员为了能让前端人员能够看懂返回结果,同时还需要返回结果的格式一致,所以就有了固定的结果返回体。Controller控制器返回给前端常见的的格式有三种:自定义返回体Result自定义MapResponseEntity今天,我们用到的是第一种情况吗,自定义返回体Result。1、自定义返回体Result通常情况下,需要前端需要的信息如下,JSON格式:一般会存在3个Key:code,msg,data{ code: 1, msg: "",

2021-01-12 00:53:18 3638 3

原创 Myabtis-plus中IService接口的使用

Mybatis-plus的IService接口:IService接口解释,我们可以看到IService接口就是有一大堆方法接口。IService的使用:IService的使用需要另外两个接口的配合:baseMapper和ServiceImpl第一步:实现basemapper接口public interface AdminMapper extends BaseMapper<Admin> {}第二步:编写service类public interface AdminService ex

2021-01-08 21:59:25 14528 2

原创 java - 动态代理

1、代理模式代理模式是23中设计模式中的一种,它是为了在目标对象的基础上增加额外的功能,也就是扩展对象的功能。在编译期阶段否能决定最终的执行方法可以把代理模式分为动态代理和静态代理。2、静态代理我们目标是一个人在跑步,现在我们在不该原来的代码基础上,增加套马甲的功能。定义一个接口:public interface PersonDao { void run();}实现一个基础类:public class Person implements PersonDao{ @Overr

2021-01-08 21:32:47 48

原创 Mybatis-plus该这么用?

MP 全称 Mybatis-Plus ,套用官方的解释便是成为 MyBatis 最好的搭档。它是在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。官网入口1、基础启动案例导包 <!--Mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-jav

2021-01-08 01:01:03 359

原创 MySQL-41:自增主键用完怎么办

41.1 表定义自增id表定义的自增值达到上限后的逻辑是:再申请下一个 id 时,得到的值保持不变。可以用下面的sql语句验证:create table t( id int unsigned auto_increment primary key) auto_increment=4294967295;insert into t values(null);insert into t values(null);//Duplicate entry '4294967295' for key

2021-01-06 21:42:35 155 1

原创 MySQL-40:表的复制

常见的复制方法有三种: mysqldump 方法,CSV 文件 , 物理拷贝方法 。40.1 mysqldump使用mysqldump命令将数据导出成一组insert语句,也就是sql文件。命令如下:mysqldump -h$host -P$port -u$user --add-locks=0 --no-create-info --single-transaction --set-gtid-purged=OFF db1 t --where="a>900" --result-file=/cli

2021-01-04 23:42:03 77

原创 MySQL-39:insert语句常见问题

39.1 insert…select 语句建表如下: CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `c` (`c`) ) ENGINE=InnoDB; insert into t

2021-01-03 22:02:31 158 1

原创 Java-注解

1、注解的基础Java注解的基础为4个元注解:Retention,Target,Inherited,Documented。Retention: 表明注解可以存在到的周期,有三个选项:source(源码),class(字节码),runtime(运行时),默认为class,表示从class文件到JVM中运行时,该注解会被丢弃。public @interface Retention { RetentionPolicy value();}public enum RetentionPolicy {

2021-01-03 20:51:41 54

原创 MySQL-38:自增主键

使用自增主键的目的: 可以让数据插入数据页时尽量保持按递增顺序插入,使得数据页数据更加紧凑,避免页分裂。我们会讨论一下问题:自增主键如何保存?我们先来建个表:create table t3( id int(11) not null auto_increment PRIMARY key, a int(11) not null, b int(11) not null, UNIQUE key a(a))ENGINE = INNODB38.1 自增主键如何保存表的结构定义语句保存在.fm的

2021-01-02 01:16:21 168

原创 MySQL基本数据类型

int(11)的解释整型:类型大小tinyint1字节smallint2字节mediumint3字节int/integer4字节bigint8字节整数类型有可选的unsigned属性,表示存储的是无符号数。比如说tinyint表示的数值范围为-128~127,那unsigned tinyint表示的数值范围为0~255。整数类型可以指定显示宽度,我们常见到的int(11)对其能表示的数值范围不会变,当我们设置 zerofill ,它会将0的位

2020-12-31 00:04:38 94

原创 MySQL-37:内存临时表

37.1 临时表的组织结构InnoDB引擎: B+树方式的组织结构,前面是索引,节点是索引+数据,节点是有序的。Memory引擎: 索引是hash索引,数组以数组的方式存放,先来先插入到结尾,数组中有空洞,则下次的数据插入会补到该位置,数组中数据是无序,索引也是无序的。从上可见Memory引擎和InnoDB引擎的组织结构是不一样的:Memory引擎采用数据和索引分开存放InnoDB引擎采用索引组织表的形式Memory引擎和InnoDB引擎的不同点:数据和索引的组织方式当数据出现空洞

2020-12-30 22:47:56 187

原创 MySQL-36:内部临时表

36.1 MySQL中的两种临时表外部临时表通过CREATE TEMPORARY TABLE 创建的临时表,这种临时表称为外部临时表。这种临时表只对当前用户可见,当前会话结束的时候,该临时表会自动关闭。这种临时表的命名与非临时表可以同名。内部临时表内部临时表会被MySQL自动创建并用来存储某些操作的中间结果,通过EXPLAIN或者SHOW STATUS可以查看MYSQL是否使用了内部临时表用来帮助完成某个操作。内部临时表有两种类型:**①:内存临时表:**所有数据都会存在内存中。**②:磁

2020-12-29 21:43:53 126

原创 MySQL-35:临时表

35.1 临时表与内存表的区别:内存表:指的是使用 Memory 引擎的表, 建表语法是 create table … engine=memory。 表结构放到磁盘上,数据放内存中。临时表: 可以使用各种引擎类型 ,如果使用的引擎为MyISAM或者InnoDB, 写数据的时候是写到磁盘上的 ,同时。也是可以使用memory引擎的。临时表特点:创建语法为create temporary table…临时表只对当前session可见,session结束后,会删除临时表临时表可与库内表重名,且语句执

2020-12-28 00:25:00 92

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除