自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 配置logback,自定义日志输出

在使用springboot的时候,输出日志都是通过配置logback.xml配置文件进行输出的,之后在文件输出。最近有一个新的需求:想对于日志进行定式化,通过自定义日志,把单个接口的日志信息存到数据库中,信息包括接口的请求地址,参数,返回信息,还有运行时候的日志信息,过程如下:1、新建一个类,继承UnsynchronizedAppenderBase,并重新append()方法当在代码里面指定日志打印的时候都会经过这个方法/** * @author YeChuanMing * @date 2022

2022-02-24 14:08:32 1321

原创 Spring Security学习笔记(一)

1、SpringSecurity框架简介1.1 摘要Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。主要包括2部分:认证(Authentication)和授权(Authorization)认证:系统认为用户能否登录授权:系统判断用户能否有权限去做什么事情1.2 历史1.3 同款产品对比1.3.1 SpringSecurity和Spring无缝整合全面的权限控制专门为web开发而设计重量级1.3.2 Shiro轻量级通

2022-02-17 15:16:30 379

原创 JUC学习笔记七:JMM

1.谈谈对volatile的理解Volatile是java提供的轻量级的同步机制,有以下特点:保证可见性不保证原子性禁止指令重排在解释这三个特性之前,我们先来了解一下JMM2.JMMJMM全称是Java内存模型,是一种概念性的东西,不是真实存在的他其实是java为了管理内存数据安全而提出的一种解决方案在程序运行中,其实存在两种内存,一个称为主存,一个称为工作内存。数据在不使用的时候都是存放在主存的,当有个线程任务需要这个数据的时候,就先把数据载入到工作内存使用,用完再把数据刷新回主存。

2020-09-28 22:27:59 195

原创 JUC学习笔记六:ForkJoin

ForkJoin1.forkjoin原理fork join是在jdk1.7开发出来,他的原理的就是提供并行的任务,提高效率。在大数据量的前提下,把一个任务拆分成多个任务去执行,再把多个任务的结果汇总起来成为最终的结果2.forkjoin工作特点工作窃取假设有两个任务运行,A任务运行到一半阻塞了,B任务运行完了,那么这时候B任务就会把A任务接过来运行,提高运行的效率这个里面使用的就是双端队列3.forkjoin的使用使用的时候需要继承RecursiceTaskpackage com.

2020-09-28 12:36:24 147

原创 JUC学习笔记五:四大函数式接口,流式计算

四大函数式接口lambda表达式、链式编程、函数式接口、Stream流式计算函数式接口:只有一个方法的接口查看文档:下面来一个一个查看1.Function 函数式接口只要是函数式接口都可以使用lambda表达式来简化public class Demo01 { public static void main(String[] args) { //传入一个值,返回一个值// Function function= new Function<S

2020-09-26 22:14:24 134

原创 JUC学习笔记四:线程池

线程池:3大方法,7大参数,4种拒绝策略1.池化技术程序运行的本质就是占用系统的资源!使用池化技术能够更好的优化资源的使用。包括:线程池,连接池,对象池,内存池。。。什么是池化技术:就是事先准备好的资源,如果有人要用就来这里拿,用完再还回来。线程池的好处:降低资源的消耗提高响应的速度方便管理线程复用、可以控制最大并发数、管理线程2.三大方法/** * 创建线程池的三大方法 */public class Demo01 { public static void main

2020-09-26 15:41:46 95

原创 JUC学习笔记三:读写锁,阻塞队列

1.读写锁读可以被多个线程去读 (共享锁)写的时候只能是被一个线程去写 (独占锁)我们先来写一个demo,在没有读写锁的情况下import java.util.HashMap;import java.util.Map;public class ReadWriteLockDemo { public static void main(String[] args) { MyCache myCache = new MyCache(); //写入

2020-09-26 12:49:30 239 1

原创 JUC学习笔记二:集合不安全,Callable,辅助类

集合不安全1.List不安全通常我们在单线程的情况下去操作集合是不会出现任何问题的。但是如果在多线程的情况下去操作集合呢。下面代码来看一下package com.ycm.unsafe;import java.util.ArrayList;import java.util.UUID;public class ListTest { public static void main(String[] args) { ArrayList<String> list

2020-09-24 09:38:37 115

原创 JUC学习笔记一:锁,生产者和消费者问题

1.进程和线程进程:就是一个程序。进程包含多个线程,至少包含一个。线程:开了一个程序的进程中有用于不同功能的线程。java默认开启了2个线程:main,GC对于Java而言有几种开启线程的方式:Thread,Runnable,CallableJava不能开启线程:Java是运行在虚拟机上的,不可以操作硬件public synchronized void start() { /** * This method is not invoked for the m

2020-09-23 12:22:18 91

原创 JVM

JVMJVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。1.JVM的位置2.JVM的体系结构GC调优都是在堆中调优方法

2020-09-16 17:00:15 104

原创 Java 设计模式 06桥接模式

本篇文章总结自 【狂神说Java桥接模式】bilibili 狂神说Java桥接模式引入假设电脑有多个品牌,如华为,小米,苹果,每个品牌的电脑又有多个类型,如台式机,笔记本,平板。。。那么在创建类的时候是不是要每个品牌每个类都去创建一个类呢?如果真的这样做下来,那么将会造成代码繁重重复的现象。于是桥接模式就出来了代码实现/** * 品牌接口 */public interface Brand { void info();}品牌类:public class Huawei imp

2020-09-13 16:54:33 94

原创 Java 设计模式 05 适配器模式

本文总结于视频狂神说:狂神说java设计模式适配器模式核心当一个类需要使用到另外一个类的方法时,而这两个类之间并没有任何关系,如果一味的使用 new 对象的方式则非常冗余,所以需要一个适配器来拉近两者的关系,例如 B 类持有适配器对象,将 A 对象传入适配器中,让适配器调用 A 的方法。假如:有一台电脑,网线,电脑和网线的接口不一样,这时候需要一个网线转接口来连接电脑和网线才能正常上网代码实现:demo-1 【类适配模式】类结构图定义一个网线类//网线类public class NetL

2020-09-13 16:09:31 82

原创 Java 设计模式 04 原型模式

原型模式的作用克隆对象假设创建对象的步骤比较多而且繁杂,原型模式可以简化新建对象的步骤实现原型模式的步骤实现Cloneable接口重写clone() 方法代码实现声明一个对象Person,对象中有name和birth两个属性package com.ycm.prototype.demo01;import java.util.Date;/** * 实现原型模式: * 1. 实现cloneable接口 * 2.重写该方法 */public class Person im

2020-09-13 15:03:16 59

原创 Java 设计模式 03 建造者模式

定义将一个复杂对象的构建与它对的表示进行分离,使得同样的构建过程可以创建不同的表示作用在用户不知道对象的建造过程和细节的情况下就可以创建复杂的对象。例如:工厂模式负责建造汽车,那么工厂就要知道所有建造汽车的细节。建造者模式就相当于是一个用户,只需要知道需求,想买什么汽车(对象和类型),就可以直接得到汽车。不需要知道汽车的建造细节。角色分析那我们用建房子在说:假设造房简化为如下步骤:1.打基地 2.钢筋工程 3.铺电线 4.粉刷 等;“如果”要盖一个房子,首先要找一个建筑公司或工程承包商

2020-09-13 10:12:29 96

原创 Java 设计模式 02 工厂模式

工厂模式的本质在创建的对象的时候不使用new,而是使用工厂方法去创建对象,避免了由于创建对象的时候参数过多带来的不便创建对象统一管理,实现解耦简单工厂模式(静态工厂模式)类结构接口方法:实现类:工厂方法:提供一个静态的方法,用于创建对象分析:可以通过一个工厂方法去创建对象,实现解耦但是假设要再加一个对象的时候,下面的代码就会跟着改,维护成本大方法工厂模式对于一个类就创建一个工厂类结构:总结:每次新建一个类就要增加一个类的工厂方法在增加一个

2020-09-12 23:49:51 90

原创 Java 设计模式 01 单例模式

饿汉式顾名思义,饿汉就是肚子饿,一上来就先吃,所以先new一个对象,再将这个对象返回出去package com.ycm.single;/** * 饿汉式单例模式 * * 可能会造成空间的浪费,开辟了空间,却没有使用 */public class Hungry { //1.构造器私有 private Hungry(){ } //2.一上来就先new出对象 private final static Hungry HUNGRY=new Hungr

2020-09-12 16:29:58 84

原创 Java Web 06 过滤器和监听器

Filter(过滤器)Filter:过滤器 ,用来过滤网站的数据;处理中文乱码登录验证Filter开发步骤:导包编写过滤器(javax.servlet)实现对应的接口,重写方法 public class CharacterEncodingFilter implements Filter { //初始化:web服务器启动,就以及初始化了,随时等待过滤对象出现! public void init(FilterConfig filterConfig) t

2020-09-11 16:33:06 128

原创 Java Web 05 MVC三层架构

1.以前的架构用户直接访问控制层,控制层就可以直接操作数据库;servlet--CRUD-->数据库弊端:程序十分臃肿,不利于维护 servlet的代码中:处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码架构:没有什么是加一层解决不了的!程序猿调用↑JDBC (实现该接口)↑Mysql Oracle SqlServer ....(不同厂商)2.MVC三层架构Model业务处理 :业务逻辑(Service)数据持久层:CRUD (Dao

2020-09-11 16:22:13 118

原创 Java Web 04 JSP

1. 什么是JSPJava Server Pages : Java服务器端页面,也和Servlet一样,用于动态Web技术!最大的特点:写JSP就像在写HTMLJSP页面可以嵌入java代码,为用户提供动态数据2.JSP原理思路:jsp怎么执行的?代码层面和普通的html页面没什么其他区别服务器内部工作:通过查看tomcat的工作目录,当点运行的时候,index_jsp.clss文件变成了index_java文件,说明jsp文件本质就是java文件其实,浏览器向服务器发送请求,不

2020-09-11 14:57:11 218 1

原创 Jave Web 03 Cookie、Session

1.会话一个网站,如何证明你来过?客户端 服务端服务端给客户端一个 信件,客户端下次访问服务端带上信件就可以了; cookie服务器登记你来过了,下次你来的时候我来匹配你; seesion2.保存会话的两种技术1.cookie客户端技术 (响应,请求)2.session服务器技术,利用这个技术,可以保存用户的会话信息? 我们可以把信息或者数据放在Session中!3.Cookie从请求中拿到cookie信息服务器响应给客户端cookieCookie[] cookies =

2020-09-11 12:52:14 110

原创 Java Web 02 Servlet

1.Servlet1.1 Servlet 简介Servlet是sun公司开发的动态web的一项技术Sun在API中提供一个接口叫做:Servlet,开发一个Servlet程序需要完成两个小步骤:1.编写一个类,实现servlet接口;2.把开发好的Java类部署到web服务器上我们把实现了Servlet接口的Java程序叫做,Servlet1.2 HelloServlertServlet接口Sun公司有两个默认的实现类:HttpServlet,GenericServlet编写一个普通

2020-09-11 12:24:59 98

原创 Java Web 01 入门基本概念

1 . 基本概念1.1 静态web和动态web的区别静态web:客户端通过一次请求,访问服务器,服务器再去访问资源文件,然后将结果相应给客户端静态web存在的缺点web页面无法动态刷新,所有用户看到的都是同一个界面无法和数据库进行交互(数据不能做到持久化)动态web客户端通过网络访问的是服务器插件,这些插件可以通过访问静态资源,将数据返回给服务器,还可以通过jsp和JavaScript去访问动态资源以及连接数据库进行数据的持久化操作,对数据进行实时的更新,再把资源返回给服务器,服务器

2020-09-11 10:15:28 105

原创 SpringBoot-02 自动装配原理

参考文章:狂神说分析配置文件原理我们以HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理;查看源代码://表示这个是一个配置类,可以给容器中添加组件@Configuration(proxyBeanMethods = false)//启动指定类的ConfigurationProperties功能; //进入这个HttpProperties查看,将配置文件中对应的值和HttpProperties绑定起来; //并把HttpProperties

2020-09-03 15:37:00 65

原创 SpringBoot-01 运行原理初探

文章来源:狂神说pom.xml探究spring boot的原理,首先从pom.xml文件看起<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.3.RELEASE</version>

2020-09-03 10:32:26 104

原创 npm安装失败

描述如下:npm ERR! code ERR_TLS_CERT_ALTNAME_INVALIDnpm ERR! errno ERR_TLS_CERT_ALTNAME_INVALIDnpm ERR! request to https://registry.cnpmjs.org/cnpm failed, reason: Hostname/IP does not match certificate's altnames: Host: registry.cnpmjs.org. is not in the ce

2020-08-23 08:35:15 2320

原创 SpringMVC 原理以及helloSpringMVC

(文章的笔记来源于b站视频,狂神说,搬运笔记作为学习)文章来源一.什么是SpringMVCSpring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。1.中心控制器Spring的web框架围绕DispatcherServlet设计。DispatcherServlet的作用是将请求分发到不同的处理器。Spring MVC框架像许多其他MVC框架一样, 以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能,DispatcherServle

2020-08-02 17:33:36 117

原创 Spring 再遇Spring

一.代理模式1.静态代理角色分析:抽象角色: - -般会使用接口或者抽象类来解决真实角色:被代理的角色代理角色:代理真实角色,代理真实角色后,我们一-般会做- -些附属操作客户:访问代理对象的人!代码实现1.实现共同的接口:出租2.房东要做出租这件事情如果没有中介,我们直接去找房东租房:3.现在有了代理中介中介可以具备房东的功能,同时还会有其他附属的功能,带看房,收租金4.那么客户就可以直接找中介租房,而不需要找房东,房东也只是把房子挂出去就不需要管别的代理模式的

2020-08-01 21:47:42 154

原创 Spring 初识spring

spring简介Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。组成IOC(Inversion of Control)控制反转通常写代码的思路:

2020-07-31 23:27:55 356

原创 mybatis 缓存机制

默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。一级缓存一级缓存也叫做本地缓存指的是一次会话:sqlsession(在方法中得到sqlsession到将它关闭的这段期间)与数据库同一次会话期间查询到的数据会放到本地中下次如果需要获取相同的数据就直接从缓存中取缓存失效的条件:查询不同的数据增删改操作,可能会改变原来的数据,就肯定会刷新缓存查询不同的mapper.xml手动清理缓存二级缓存二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存基于name

2020-07-30 22:11:41 83

原创 mybatis 动态SQL

动态SQL动态sql,其实就是在sql语句的基础加上一些逻辑判断,使得可以根据要求来改变sql语句主要有以下几个关键字ifchoose (when, otherwise)trim (where, set)foreachif(类似jstl表达式) <select id="queryBlog" parameterType="map" resultType="Blog"> select * from blog where 1=1 <if test

2020-07-30 20:13:44 81

原创 mybatis实现多表查询,联表查询

需求现在是在mybatis中实现定义两个实体类:方式一: <!--方法一 多表查询--> <select id="getStudent" resultMap="StudentTeacher"> select * from student</select> <resultMap id="StudentTeacher" type="Student"> <!--property 对应实体类属性,col

2020-07-30 00:10:05 729

原创 1 字节的 UTF-8 序列的字节 1 无效。

报错信息如下:Error building SqlSession.The error may exist in com/ycm/dao/UserMapper.xmlCause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error creating document insta

2020-07-29 21:33:32 1067

原创 mybatis注解使用和原理

可以使用注解来替代编写xml文件,如果是sql语句比较简单的话可以使用注解,如果sql语句比较复杂还是建议使用配置文件编写。来看实现过程:接下来看看为什么使用注解可以实现我在这里打个断点sqlsession通过UserMapper的字节码文件,利用反射可以获取到这个类对象,包括这个类的成员变量,方法,构造方法。在mapper中,有个mapperInterface接口,其中这个接口实现类的属性携带有实体类信息的数据那么在这个返回的mapper中,就有关于这个类的所有属性,进而通过这些个属

2020-07-29 16:57:25 693 1

原创 mtbatis 解决属性名和字段名不一致的问题

问题引出这是我数据库的定义:原本数据库的字段是要跟实体类的属性名去对应的,那我现在将属性故意改一下:再来做查询:得到以下结果,因为返回回来的数据的password和pwd不对应,就显示为null解决方法1.起别名2.使用结果集映射resultMapresultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编

2020-07-29 13:14:32 159

原创 mybatis 生命周期和作用域

不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。下面是生命周期几个主要对象:参考官方文档SqlSessionFactoryBuilder这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。SqlSessionFactorySqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在。 使用 SqlS

2020-07-29 12:36:42 278

原创 mybatis 配置

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息下面是配置相关:configuration(配置)properties(属性)settings(设置)typeAliases(类型别名)typeHandlers(类型处理器)objectFactory(对象工厂)plugins(插件)environments(环境配置)environment(环境变量)transactionManager(事务管理器)dataSource(数据源)databaseIdP

2020-07-28 21:33:51 180

原创 mybatis入门+案例

一 . 概念MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 (来自官网)二 . 入门1. 安装在maven中引入依赖即可 <dependency> <gr

2020-07-28 13:10:29 99

原创 Java实现QQ邮件发送原理和实现

电子邮件 **在网络中实现邮件发送和接收的功能,就必须要有专门的邮件服务器(使用**SMTP协议**),我们发送一封邮件,先要经过各层路由,交换机,基站,然后存到该邮件服务器,(不同的邮件有不同的邮件服务器,比如网易的邮箱服务器,QQ的邮箱服务器),然后发送的邮箱服务器(使用**POP3协议**)又通过基站发送到对应的服务器中,这个时候作为收件人会有邮件到达的提醒,在你打开邮件的过程就是从邮件服务器中读取数据的过程。 SMTP服务器地址:一般是smtp.xxx.com,比如smtp.163.com,sm

2020-07-27 12:33:45 1196

原创 JSP原理解析

一.什么是JSPJSP(全称JavaServer Pages),JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。简单的说就是将java语言嵌入静态页面中,实现动态网页。二.JSP原理通过访问tomcat目录或者访问IDEA目录查看,在编译的时候,新建的jsp文件会有两个文件,分别是index_jsp.class和index_jsp.java。浏览器向服务器发送请求,不管访问什么资源,其实都是在 访问servle

2020-07-13 21:27:30 829

原创 关于冒泡排序和快速排序

关于排序算法,自己总是学了久不用就忘了,现在把他们记录下来。冒泡排序```java private static void bubbleSoft(int[] data) { int length = data.length; int temp = 0; /** * 设置一个flag变量进行调优,如果数组是无序的就会进入判断,让flag=true * 如果数组是有序的,就不会进入判断,在最外层的for循环中判断flag

2020-06-21 11:20:59 130

空空如也

空空如也

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

TA关注的人

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