SpringSecurity
SpringSecurity
绿色:认证用户的身份,检查当前请求是否有此过滤器需要的信息,如果有就尝试认证
蓝色:ExceptionTranslationFilter,捕获后面的类抛出来的异常,做相应的处理
最终到达FilterSecurityIntercepter:决定当前的请求能否访问后面的服务,依据用户的配置,如某个请求是否需要认证才能访问,如果是就看是否有认证信息,
Spring Social 实现三方登陆
这是第六步,获取信息,所以继承AbstractOAuth2ApiBinding(其内有令牌和RestTemplet帮我们获取信息)
ThreadLocal
ThreadLocal使用场景
每个线程需要一个独享的变量(通常是工具类,典型需要使用了类有SimpleDataFormat和Random)
每个线程需要保存全局变量(如在拦截器中获取哦那个户的信息),可以让不同的方法直接使用,避免传递参数的麻烦
场景一,每个线程需要独享的对象
每个Thread内有自己的实例副本,不共享
见代码
场景二 避免传递参数
见代码
使用ThreadLocal有哪些好处
达到线程安全
不用加锁,执行效率高
更高效的节省内存,减小开销
免去传参的繁琐,降低代码耦和
ThreadLocal 原理
每个Thread会持有一个ThreadLocalMap(一对一关系)
一个ThreadLocalMap存储多个ThreadLocal对
主要方法介绍
T initialValue()
返回当前线程对应的初始值,这是一个延迟加载,只有调用get()后才会触发
当线程第一次使用get()方法访问变量时将调用此方法,除非在此之前先用过了set()方法,则不会调用initialValue()
通常线程只调用一次此方法就够了,单数如果调用了remove()再用ge ...
SpringBoot自动装配
SpringBoot 自动装配
SpringBoot 定义了一套接口规范,这套规范规定:SpringBoot 在启动时会扫描外部引用 jar 包中的META-INF/spring.factories文件,将文件中配置的类型信息加载到 Spring 容器(此处涉及到 JVM 类加载机制与 Spring 的容器知识),并执行类中定义的各种操作。对于外部 jar 来说,只需要按照 SpringBoot 定义的标准,就能将自己的功能装置进 SpringBoot。
自动配置原理1). SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration2). @EnableAutoConfiguration作用:
过@import方式引入了EnableAutoConfigurationImportSelector
EnableAutoConfigurationImportSelector是一个ImportSelector,我们查看其selectImports方法,其内部调用getCandidateConfigurations方法,读取META-INF& ...
JUC知识点梳理
J.U.C知识点梳理java.util.concurrent:提供了并发编程的解决方案
CAS是java.util.concurrent.atomic包的基础
AQS是java.util.concurrent.locks包以及一些常用类比如Semophore,ReentrantLock等类的基础
J.U.C包等分类
线程执行器executor
锁locks
原子变量类atomic
并发工具类tools
并发集合collections
并发工具类
闭锁:CountDownLatch
让主线程等待一组事件发生后继续执行
事件指CountDownLatch里的countDown()方法
demo:
栅栏:CyclicBarrier
等待其他线程,且会阻塞自己的当前线程,所有线程必须同时到达栅栏位置后,才能继续执行
所有线程到达栅栏处,可以触发执行另一个预先设置的线程
demo:
信号量:Semaphore
控制某个资源可以被同时访问的线程个数
demo:
交换器:Exchanger
两个线程到达同步点后,互相交换数据
demo:new了只有两个线程的线 ...
反射
反射Java反射机制是在运行状态中,
对于任何一个类,都能够知道这个类的所有属性和方法;
对于任何一个对象,都能够任意调用他的方法和属性;
这种动态获取信息和动态调用对象方法的功能就叫做反射机制。
ClassLoader
ClassLoader类从编译到执行的过程
编译器将源文件转化为字节码文件
ClassLoader将字节码转化为JVM中的Class<T>对象
JVM利用Class<T>对象实例化为T对象
ClassLoaderClassLoader在java中有着非常重要的作用,它主要工作在class装载的加载阶段,其主要作用是从外部系统获得class二进制数据流,它是java的核心组件,所有的class都是由ClassLoader进行加载的,ClassLoader负责通过将class文件里的二进制数据流装进系统,然后交给java虚拟机进行连接、初始化等操作。
ClassLoader的种类
BootStrapClassLoader:C++ 编写,加载核心库java.*(例如java.lang)
通常这些核心类被签名,不能被替换掉
ExtClassLoader:Java编写,加载扩展库javax.*
是用户可见的ClassLoader
AppClassLoader:Java编写,加载程序所在目录(class.path)
自定义ClassLoader:Java编写,定制 ...
内存模型
内存模型
Runtime Data Aera
Method Area:是Java虚拟机规范中的概念,在HotSpot的实现中:
JDK7及以前,HotSpot用永久带来实现方法区,存在jvm内存中,与堆连续的地址空间,GC和老年代一起。
JDK8及以后,HotSpot把很多东西放到了堆或者本地内存,而方法区则成为了元空间的实现,同时元空间不再与堆连续,而且是存在于本地内存(Native memory)。
JVM内存模型
线程私有:程序计数器,虚拟机栈,本地方法栈
线程共享:MetaSpace、Java堆
程序计数器(Program Counter Register)
是一块较小的内存空间,可以看做是当前线程所执行的字节码行号的指示器;
字节码解释器工作时,通过改变计数器的值选取下一条执行的字节码指令;(一些基本功能都需要依赖计数器来完成 如 分支 循环 跳转 异常处理 线程恢复 等)
和线程一对一关系,即线程私有。java虚拟机多线程是通过线程间轮流切换来分配给处理器执行时间;在确定时间节点,一个处理器(一核)只会执行一个线程的指令;为保证线程切换回来后能恢复到原执行位置 ...
常考题型
JVM三大性能调优参数 -Xms -Xmx -XSS的含义
-Xss:规定了每个线程虚拟机栈(堆栈)的大小
此配置影响并发线程数大小
-Xms:堆的初始值
-Xmx:堆能达到的最大值
Java内存模型中堆和栈的区别——内存分配策略存储方案:
静态存储:编译时确定每个数据目标在运行时的存储空间需求
栈式存储:数据区需求在编译时未知,运行时模块入口前确定
堆式存储:编译或运行时模块入口都无法确定,动态分配。
堆和栈的联系引用对象、数组时,栈里定义变量保存堆中目标的首地址
区别
管理方式:栈自动释放,堆需要GC
空间大小:栈比堆小
碎片相关:栈产生的碎片远小于堆
分配方式:栈支持静态和动态分配,堆只支持动态分配
效率:栈的效率高
元空间、堆、线程独占部分间的联系——内存角度示例如下:
元空间:
保存装载进来的HelloWorld对象的信息及其Method和Field。
额外还有System这个类对象及该类中的成员变量和方法等
堆:
存储HelloWorld类创建出来的对象实例object,以及String实例“test”
线程独占:
当程序执行时,main线 ...
GC
GC 垃圾回收机制判断对象是否为垃圾的算法引用计数算法
通过判断对象的引用数量来决定对象是否可回收
每个对象实例都有一个引用计数器,被引用则+1,完成引用则-1
优点:执行效率高,程序执行受影响较小
缺点:无法监测出循环引用的情况,导致内存泄露
由于其缺点的存在,主流JVM基本不使用此方式。
可达性分析算法 通过判断对象的引用链是否可达来就决定对象是否可以被回收
对内存中的整个对象图进行遍历,从GC Root开始,回收器将所有访问到的对象标记为存活,完成遍历后不可达的对象会被作为垃圾对象而清除。
可以作为GC Root的对象
虚拟机栈中引用的对象(栈帧中的本地变量表)
方法区中的常量引用的对象
方法区中的类静态属性引用的对象
本地方法栈中JNI(Native方法)的引用对象
活跃线程的引用对象
垃圾回收算法标记-清除算法(Mark and Sweep)将回收分为两个阶段
标记:使用可达性算法,从根集合进行扫描,对存活的对象进行标记。
清除:对堆内存从头到尾进行线性遍历,回收不可达对象内存。同时将可达标记清除,以便进行下一次回收。
缺点:
碎片化:由于标记清除不需要进 ...
垃圾收集器
垃圾收集垃圾收集器之间的联系
有连线说明可以搭配使用
年轻代常见的垃圾收集器Serial收集器(-XX:+UseSerialGC,复制算法)
复制算法
单线程收集,进行垃圾收集时,必须暂停所有工作线程
简单高效,Client模式下默认的年轻代收集器
ParNew收集器(-XX:+UseParNewGC,复制算法)
复制算法
多线程收集,其余的行为、特点和Serial收集器一样
单核执行效率不如Serial,在多核下执行才有优势
Parallel Scavenge收集器(-xx:+UseParallelGC)
复制算法
比起关注用户线程停顿时间,更关注系统吞吐量
吞吐量 = 运行用户代码的时间 / (运行用户代码的时间 + 垃圾收集的时间)
在多核下执行才有优势,Server模式下默认的年轻代收集器
老年代常见的垃圾收集器Serial Old收集器(-XX:+UseSerialOldGC)
标记-整理算法
单线程收集,进行垃圾收集时,必须暂停所有工作线程
简单高效,Client模式下默认的老年代收集器
Parallel Old收集器( ...