自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 问答 (3)
  • 收藏
  • 关注

原创 oauth/authorize 返回403

学习Oauth2授权码授权时遇到访问 oauth/authorize 返回403。查源码发现是在AuthorizationEndpoint类中的authorize的方法里抛出了异常:User must be authenticated with Spring Security before authorization can be completed.抛出异常的原因是principal == null,是没有配置登录方式导致的。解决方法:修改继承了WebSecurityConfigurerAdap

2021-02-27 18:50:16 2685 2

原创 Spring源码探险之@EnableAspectJAutoProxy 是如何启用AOP的

AOP 源码弹性@EnableAspectJAutoProxy 是如何启用AOP的@EnableAspectJAutoProxy 源码如下,它导入了AspectJAutoProxyRegistrar类@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(AspectJAutoProxyRegistrar.class)public @interface EnableAspectJAut

2021-02-08 16:45:00 259 1

原创 Spring源码探险之单例Bean是如何注册到容器的

单例Bean是如何注册到容器的创建一个HelloController类,在无参构造器中打一个断点package com.example.controller;​import org.springframework.stereotype.Component;​@Componentpublic class HelloController {​ public HelloController() { }}开始debug。执行到该断点的Call Stack如下<...

2021-02-03 19:43:15 164 1

原创 Volatie 关键字

变量可见性问题问题:当一个线程修改某个共享变量后,其他线程拿到的可能不是最新值为什么存在该问题?CPU读取变量的流程:先从CPU缓存中读,再从Main Memory中读。CPU写变量的流程:先写到CPU缓存,再从写到Main Memory。多核处理器处理多线程时,可能会发生这种情况 Main Memory 中 counter 的值是 0 CPU1中正在运行Thread1 把 counter 的值修改成7 CPU1中缓存的值刷新到Main Memory之前,.

2021-02-01 17:38:09 157

原创 SpringJDBC

SpringJDBCSpringJDBC是Spring框架对JDBC的简单封装,用于简化JDBC的开发。它的核心类是JDBCTemplate。使用SpringJDBC项目结构如下首先下载下面几个jar包:可以在https://mvnrepository.com/找到配置数据库连接池ds.propertiesurl=jdbc:mysql://192.168.238.128/test?serverTimezone=UTCusername=rootpassword=123456maxActi

2021-01-13 22:59:30 91

原创 Spring MVC入门

简介Srping MVC主要由DispatchServlet,处理器映射,适配器,控制器,视图解析器,视图组成原理案例依赖文件<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLoca

2021-01-13 22:58:45 64

原创 初认Spring

简介Spring:一个轻量级的IOC和AOP框架IOC:Inverse Of Control。把对象的的控制权交给Spring IOC容器管理(DI: Dependency Injency, 依赖注入,☞Spring创建对象时根据注解或者XML配置使用合适的对象来创建这个对象)AOP:Spring好处:解耦合,简化开发AOP编程便于测试便于集成其他框架Spring架构demopublic class HelloSpring { public void sayHell

2021-01-13 22:57:28 66

原创 Spring IOC实现原理

IOC实现原理:反射通过反射实现注入创建UserService, UserController类public class UserController { private UserService userService; public UserService getUserService() { return userService; }}public class UserService {}通过反射将UserService对象注入到Us

2021-01-13 22:55:57 89

原创 一文读懂ZooKeeper

一文读懂ZooKeeper什么是ZooKeeperZooKeeper提供了分布式系统协调服务。ZooKeeper的提供的核心机制命名服务。就是提供名字到具体信息的映射。可以理解为是key-value结构,名字就是key,具体信息就是value。命名服务的实现类似于文件系统(Zookeeper中称为namespace)。每个name在namespace中代表一个节点(ZooKeeper把节点成为znode),每个节点可以存储自身映射的信息及其子节点的记录。原子性。ZooKeeper的写入操

2021-01-13 22:52:04 123

原创 Jedis的使用

Jedis的使用基本使用依赖文件<dependencies> <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <v

2021-01-13 22:47:55 52

原创 Redis集群

Redis Cluster作用分片并备份数据当节点故障时,集群可以继续工作Redis Cluster TCP 端口每一个节点有两个端口用来服务客户端,如6379节点间通信,等于上个端口 + 10000如 16379Redis集群数据分片实现机制:Hash slot(哈希槽)Redis集群有16384个槽位,Redis集群中的每个节点都会被分配一些槽位,例如NODE A 0-5500NODE B 5501-11000NODE C 11001-16383如果需要添加新的节点

2021-01-13 22:47:15 187

原创 Redis的主从复制

主从复制主从复制:Replication,从服务器会对主服务器的数据进行备份实现机制主从成功连接,主服务器会发送命令给从服务器以更新从服务器中的数据主从连接断开,从服务器再次连接之后,会尝试进行partial resync:获取断开连接期间没有收到的数据无法进行partial resync,从服务器会进行full sync,主服务器创建一个快照并发送给从服务器Redis Replication机制要点它是异步的一个主可以有多个从从服务器可以接收从服务器的连接,从服务器A连接到从服务器

2021-01-13 22:45:34 88

原创 Redis持久化

RDB持久化(默认开启)RDB持久化:当满足一定条件时,创建数据库快照配置方式配置触发RDB条件################################ SNAPSHOTTING ################################## Save the DB on disk:## save <seconds> <changes>## Will save the DB if both the given number of sec

2021-01-13 22:44:53 58

原创 Redis简介 数据类型及常用命令

简介NoSQL:Not-Only SQL,只非关系型数据库NoSQL分类:类型数据模型产品应用优势劣势key-value数据库键值对Redis缓存,处理大量数据的高并发访问查询快存储的数据缺少结构化列存储数据库以列族存储Hbase分布式文件系统查找快,扩展性强功能较局限文档型数据库键值对MongoDBWeb应用数据结构妖气不严格查询慢,切没有同一查询语法图形数据库图Neo4J社交网络便于利用图结构相关算法需要对整个图

2021-01-13 22:43:44 99

原创 视图

什么是视图假设我们有A,B,C三个表。有时我们查数据时可能在基于把这三个表连接起来,根据某些条件筛选出结果中进行查询。如果把这三个表连接起来,根据某些条件筛选出结果用的地方多的话,为了方便,我们可以把这个操作抽象成一个视图V。视图V就是基于A, B, C三个表根据某些条件筛选出结果。视图带来的好处就是向视图的使用者屏蔽数据库中表的实现。这样可以提高数据库的安全性,同时便于视图的使用者操作。如何使用视图建表语句create table employee ( id int primary k

2021-01-11 22:56:12 60

原创 事务的四大特性ACID和数据库的隔离级别

事务的四大特性ACID数据库四大属性原子性(Atomicity),一致性(Consistency),隔离性(Isolation),一致性(Durability)原子性。整个事务中的全部操作要么全部完成,要么全部都不完成。如果在事务执行的某个阶段发生错误,则将数据库回滚到执行事务之前。一致性。事务必须保证系统处于一致的状态隔离性。事务之间的隔离级别持久性。在事务完成之后,该事务对数据库所做的更改便永久保存到数据库中数据库的隔离级别当多个事务并发执行时,可能会纯在下面几个问题脏读:事务A

2021-01-11 22:54:53 106 1

原创 事务管理

什么是事务事务就是一组SQL操作,它用来保证成批的SQL语句要么全部执行,要么全不执行,从而保护数据库的完整性。常用名词事务: 指一组SQL语句回退: 回退已经执行的SQL语句提交: 把该事务中已经成功执行的SQL语句的结果写入到数据库中并结束事务保留点: 在回退时,可以用来指定回退到那一句SQL需要注意的是回退需要用户自己来操作,例如我在一个事务中执行了多条插入语句,其中有一条有错误,MYSQL再每一行执行完毕后都会打印出运行结果,用户需要根据运行结果来自行判断是要回退到指定的保留点,还是直

2021-01-11 22:51:43 63

原创 游标

什么是游标在mysql中,游标只能用在存储过程中,他的作用就是遍历查找到的数据如何使用游标使用游标的一般步骤创建游标-- 定义游标DECLARE my_cursor CURSORFOR SELECT department.id, department.name, employee.name FROM department LEFT JOIN employee ON department.manager = employee.id;打开游标-- 打开游标

2021-01-11 22:51:03 74

原创 存储过程

什么是存储过程存储过程与批处理类似,就是将一条或者多条SQL封装起来。为什么使用存储过程封装SQL操作,便于使用向存储过程的使用者屏蔽底层的实现,安全提高性能创建存储过程建表语句如下create table employee ( id int primary key, name varchar(20) not null, department int not null, age int default 0);create table department( id int

2021-01-11 22:50:26 96

原创 创建修改删除表

创建表create table student ( id int primary key auto_increment, name varchar(20) not null, age int default 0) ENGINE=InnoDB;查看所有表show tables;查看表的建表语句show create table student;查看表的结构desc student;修改表结构增加列alter table student add column c_te

2021-01-11 22:49:19 99

原创 连接MySQL

连接数据库管理系统baozi@ubuntu:~$ mysql -u root -pEnter password: 查看数据库管理系统中的所有数据库mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || performance_schema || sys

2021-01-11 22:48:19 55

原创 基本概念

常用名词表:数据库中用来保存一类数据行:表中用来保存一组数据列:行中的每个字段主键:用来区分一个表中每一行的列外键:行中用来引用同一数据库中的另外一行数据的列,可以是同表,也可以是不同表SQL:Structured Query Language: 结构化查询语言。用来操作数据库常见数据库MySql:开源免费Orcale: 收费安装数据库https://dev.mysql.com/doc/refman/8.0/en/installing.html连接数据库:mysql -h host

2021-01-11 22:46:54 51

原创 数据库连接池 Druid

数据库连接池与线程池类似,因为打开和关闭数据库连接比较耗费资源,所以可以提前打开一定数量的连接,放到连接池中,当需要访问数据库时,从连接池中取出一个连接,操作完毕后,把连接放回到连接池。这样可以节省资源,提高效率JDK中提供的标准接口是Datasource比较常见的连接池是C3P0:数据库连接池技术Druid:数据库连接池实现技术,由阿里巴巴提供的,具有强大的监控和扩展功能使用数据库连接池(以Druid为例)首先下载Druid的jar包:https://mvnrepository.com/

2021-01-11 22:44:49 85

原创 JDBC的使用

JDBCJDBC: java中用来访问数据库的一框架,JDK中定义了规范的接口,由各大厂商完成实现。常用包java.sql: 所有与访问数据库相关的接口和类javax.sql: 扩展包,提供如连接池之类的额外功能数据库驱动:由各大数据库厂商提供,JDK 中不包含需要另外下载核心类DriverManager: 管理和注册数据库驱动,连接数据库Connection:数据库的连接对象。使用它来执行SQL语句Statement, PreparedStatement:SQ

2021-01-11 22:44:03 112

原创 Java Datagram类的使用

什么是DatagramDatagram是UDP协议中的概念,它是通过网络发送的数据报。Datagram由两部分组成:要传输的数据,目的地。具体属性如下// 传输的数据byte[] buf; int offset; int length; int bufLength;// 目的地InetAddress address;int port;因为UDP协议不是面向连接的,所以它不会像TCP一样创建连接。因此使用UDP通信时需要把数据和目的地设置到Datagram 中。而不是像TCP的S

2021-01-10 14:07:44 438 1

原创 Java Socket编程

什么是SocketSocket代表通过互联网进行双向通信的两个程序的其中一端,Socket需要绑定一个端口,这样TCP层才能知道应该把数据发送给哪个进程。JAVA中的Socket是对TCP协议的封装。底层是使用TCP协议实现的以C/S架构为例在Server端,在创建Server时需要绑定一个端口号,例如8080。之后Server端监听这个端口收到的数据在Client端,Client需要使用Server的主机名和Server绑定的端口号来来创建一个Socket来代表Server端,并来发起连接请求。C

2021-01-10 14:06:58 234

原创 Java URL类的使用

什么是URLUniform Resource Locator: 代表某个资源在互联网中的位置URL的格式协议标识://资源名称, 如:http://www.baidu.com如何创建一个URL使用java.net.URL类public static void main(String[] args) { try { URL u1 = new URL("http://www.baidu.com"); URL u2 = new URL(u1, "pages/page1.ht

2021-01-10 14:06:20 379

原创 JAVA网络编程基础

协议通信的规则,不同层用到的协议不同网络模型一般分为五层:应用层,传输层,网络层,链路层,物理层应用层: 应用层主要是处理网络通信手法的数据。常见的协议有:HTTP,FTP, SMTP传输层: 传输层主要作用是把数据从一个端口发送到另一个端口。常见协议有TCP, UDPTCP: 面向链接的协议,提供可靠的数据传输三次握手C -> S: 请求链接S -> C:允许连接C -> S: 确认连接四次挥手C -> S: 请求关闭连接S -> C:

2021-01-10 14:05:28 76 1

原创 序列化与反序列化ObjectOutputStream, ObjectInputStream

什么是序列化,反序列化序列化就是把一个对象的写到输出流中。核心类:ObjectOutputStream反序列化就是从输入流中读取一个对象。核心类:ObjectInputStream为什么需要序列化,反序列化当两个JAVA程序运行在不同主机上,程序A想要调用程序B中的方法时。程序A和程序B需要一种能够通过网络传输对象的的方法,这时候序列化就派上用场了。如何使用序列化,反序列化首先我们需要一个实现了Serializable类,只有实现了Serializable的接口才可以被序列化,反序列化publ

2021-01-10 14:04:40 58

原创 编码解码流InputStreamReader/OutputStreamReader

什么是编码解码流编码解码流就是以特定的编码格式实现二进制数据和字符数据之间的转换。分为两类:InputStreamReader/OutputStreamReader例如FileReader就是InputStreamReader的子类。FileReader会使用InputStreamReader的默认编码格式"UTF-8"来把二进制的数据解析成字符数据。例如FileWriter就是OutputStreamReader的子类。FileWriter会使用OutputStreamReader的默认编码格式"U

2021-01-10 14:04:03 493

原创 缓冲流BufferedInputStream,BufferedOutputStream,BufferedReader, BufferedWriter

什么是缓冲流缓冲流就是为读写流的创建一个缓冲区,通过缓冲区进行读写。分为四类:BufferedInputStream,BufferedOutputStream,BufferedReader, BufferedWriter为什么需要缓冲流使用非缓冲流时,每次读写操作系统都会进行I/O操作,I/O操作是很耗时的。如果能为读写流的创建一个缓冲区,通过缓冲区进行读写,就能减少操作系统I/O的次数,从而提高读写六的速度。如何使用缓冲流BufferedInputStream,BufferedOutputS

2021-01-10 14:03:24 190

原创 Properties的使用

Properties可以用来保存属性集(类似Map, 以键值的形式保存数据,不同的是Properties都是String类型的)。这个类的优势是可以从流中加载属性集,或者把属性集报错到流中。基本使用public Object setProperty(String key, String value); // 新增或修改一个属性public String getProperty(String key); // 获得key对应的值public Set<String> stringPr

2021-01-10 14:02:49 4376 3

原创 try with resource

JDK 1.7中引入了try-with-resource语句用来确保每个资源在try-catch-finally结束后被关闭。使用格式如下:try (创建资源对象,如果多个,使用';'隔开) {// 读写数据} catch (IOException e) { e.printStackTrace();}使用方法如下:public static void main(String[] args) { try { InputStream in = new FileInput

2021-01-10 14:02:02 96

原创 I/O stream

I/O Stream:A stream is a sequence of data. A program uses an input/output stream to read/write data from a source.例如我们在读写文件的时候就需要通过文件的input/output stream来读/写文件。I/O的分类根据数据流向分为Input Stream: 把数据从目标source读到内存中的流Output Stream:把数据写道到目标source的流根据Steam中数.

2021-01-10 14:00:38 125

原创 浅析Java中的线程安全和线程同步

Java中的线程安全问题Java中的线程同步问题synchronized的使用Lock类的使用

2020-10-09 21:07:41 152 1

原创 Java中线程的使用(Thread类)

如何创建线程创建线程的两种方式:继承Tread类,实现Runnable接口继承Thread类需要基层Thread类,并重写run方法,run方法里的内容就是线程需要执行的。然后调用t.start()方法来开启这个线程。public class Test_1 extends Thread { @Override public void run() { System.out.println("abcde"); } public static void

2020-09-22 20:58:53 612

原创 初探并发

并发和并行线程和进程

2020-09-22 20:58:03 374

原创 HashMap的实现原理及源码浅析

HashMap的实现原理HashMap使用的数据结构是HashTable + 链表/红黑树。当创建一个HashMap时,会先创建出一个HashTable:Node<K,V>[] table;需要注意的是HashTable并不是一种特殊的类型,它本质上还是一个数组,只不过它是根据元素的hash值来决定元素在数组中的位置,所以叫做HashTable。当插入一对KeyValue时,会根据Key的Hash值来决定其在HashTable中的栏位:tab[i = (n - 1) & ha

2020-09-13 16:43:17 107

原创 初探Map

Map接口Map记录的是key和Value间的映射关系。例如男朋友和女朋友这种就能建立起映射关系,如小明(key)的女朋友(映射关系)是小红(Value)需要注意的一点是Map中的key是不能重复的,而Value是可以重复的。但是一个key只能和一个Value建立映射关系。也就是说,在JDK的世界里,小明的女朋友是小红,老王的女朋友也可以是小红,但是小明的女朋友不能既是小红,又是小兰。常用方法V put(K key, V value); // 向Map中添加一组映射关系,并返回这个key之前映射的v

2020-09-13 16:42:11 96

原创 LinkedList实现原理及源码浅析

LinkedList实现原理LinkedList是使用一个双向链表实现的。每个节点的数据结构如下private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { // 创建一个Node this.item = element;

2020-09-13 16:41:08 85

空空如也

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

TA关注的人

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