- 博客(0)
- 资源 (8)
- 收藏
- 关注
springboot学习思维笔记.xmind
springboot学习笔记
spring基础
Spring概述
Spring的简史
xml配置
注解配置
java配置
Spring概述
Spring的模块
核心容器CoreContainer
Spring-Core
Spring-Beans
Spring-Context
Spring-Context-Support
Spring-Expression
AOP
Spring-AOP
Spring-Aspects
Messaging
Spring-Messaging
WEB
Spring-Web
Spring-Webmvc
Spring-WebSocket
Spring-Webmvc-Portlet
数据访问/集成(DataAccess/Intefration)
Spring-JDBC
Spring-TX
Spring-ORM
Spring-OXM
Spring-JMS
Spring的生态
Spring Boot
Spring XD
Spring Cloud
Spring Data
Spring Integration
Spring Batch
Spring Security
Spring HATEOAS
Spring Social
Spring AMQP
Spring Mobile
Spring for Android
Spring Web Flow
Spring Web Services
Spring LDAP
Spring Session
Spring项目快速搭建
Maven简介
Maven安装
Maven的pom.xml
dependencies
dependency
变量定义
编译插件
Spring项目的搭建
Spring Tool Suite
https://spring.io/tools/sts/all
IntelliJ IDEA
NetBeans
https://netbeans.org/downloads/
Spring基础配置
依赖注入
声明Bean的注解
@Component组件,没有明确的角色
@Service在业务逻辑层(service层)
@Repository在数据访问层(dao层)
@Controller在展现层(MVC→SpringMVC)
注入Bean的注解
@Autowired:Spring提供的注解
@Inject:JSR-330提供的注解
@Resource:JSR-250提供的注解
Java配置
@Configuration声明当前类是一个配置类
@Bean注解在方法上,声明当前方法的返回值为一个Bean
AOP
@Aspect 声明是一个切面
拦截规则@After @Before @Around
PointCut
JoinPoint
Spring常用配置
Bean的Scope
Singleton
Prototype
Request
Session
GlobalSession
SpringEL和资源调用
注入普通字符
注入操作系统属性
注入表达式云算结果
注入其他Bean的属性
注入文件内容
注入网址内容
注入属性文件
Bean的初始化和销毁
Java配置方式
注解方式
Profile
@Profile
通过设定jvm的spring.profiles.active参数
web项目设置在Servlet的context parameter中
事件Application Event
自定义事件,集成ApplicationEvent
定义事件监听器,实现ApplicationListener
使用容器发布事件
Spring高级话题
Spring Aware
BeanNameAware
BeanFactoryAware
2020-06-19
数据结构与算法.xmind
数据结构与算法
排序算法
内排序
八大基础排序
选择排序
简单选择排序
思想
每次选择最大的数插入到末尾中
做法
外层for循环控制次数
内层for循环找出最大的值的角标
找出最大角标后,进行交换
优化思路
同时获取最大值和最小值,然后分别插入数组的首部和尾部
堆排序
思想
使用大顶堆的思想来排序,每次建堆后交换
做法
总体:建堆-替换
建堆
只要左子树或右子树大于当前根节点,则替换
替换后会导致下面的子树发生了变化,因此同样需要进行比较,直至各个节点实现父>子这么一个条件(递归)
交换排序
冒泡排序
思想
每次俩俩交换,将最大值交换到末尾
做法
外层for控制循环次数
内层for控制比较次数
每次循环之后,比较次数都会减少一次
优化思路
如果一趟排序后没有发生位置变化,那么此时就是有序了
快速排序
思想
每次将比支点小的放在支点左边,比支点大的放在支点右边
做法
外循环while只要i和j不碰撞查找
内层两个while循环分别查找出比支点小的和比支点大的角标
如果i<=j满足条件,就交换
一趟排序后,支点的左边都比支点小,支点右边都比支点大
只要满足L<j,i0的条件查找出要插入的何时位置
退出内层while循环后就找到了合适的位置插入
优化思路
二分查找插入,找合适位置的时候使用二分查找算法
希尔排序
思想
用增量来将数组进行分隔,直到增量为1。底层干的还是插入排序干的活
做法
最外层for外循环控制增量的数量,每次/2
第二层for循环控制每次增量那组开始进行插入排序,直至完毕
第三层while循环找到要插入到哪个位置
归并排序
思想
将两个已排好序的数组合并成一个有序的数组
做法
递归拆分出两个有序的数组,从mid的位置开始拆分,递归出口:只有一个值的时候就不用拆分了
合并两个有序的数据
分别往两个数组填充已有序的数据
比较两个数组的值谁小,谁小就放到我们的数组中
如果比较完之后还有剩余的数据,那么用while直接添加到我们的总数组中
优化思路
当递归到规模足够小时,利用插入排序
归并前判断一下是否还有必要归并
只在排序前开辟一次空间
基数(桶)排序
思想
分配,回收(分配到不同的位置上,然后回收)..不断分配..回收来进行排序,直到有序
做法
分配一个[array.length][10列]的二维数组来装我们的元素
最外层for循环控制要分配和回收的次数(根据最大值)
将元素的个、十、百位依次放到桶子上(第一次就是放个位,第二次放十位)
依据每列回收桶子,两个for循环
外排序
查找算法
二分查找
分块查找
哈希查找
贪心算法
求最小生成树的Prim算法和Kruskal算法
爬山问题
回溯算法
n皇后问题
动态规划Dynamic Planning
应用
求最长公共子序列LCS
矩阵连乘问题
爬楼梯问题
找零问题
0-1背包问题
分治算法Divide and Conquer
应用:归并排序
其它
Rabin fingerprints 文件指纹算法
BitMap 位图算法
BloomFilter 布隆过
2020-06-19
docker学习思维笔记.xmind
docker
介绍
架构
安装
组成
命令
帮助命令
docker version
docker info
docker --help
镜像命令
docker images
-a 列出所有镜像
-q 只显示镜像ID
--digests:显示摘要信息
--no-trunc:不截断输出,显示完整的镜像ID
docker search 镜像名
docker rmi 删除镜像
docker 运行命令
docker copy 主机路径 容器id/名称:容器中路径
镜像
是什么
UnionFS(联合文件系统)
镜像加载原理
分层镜像
为什么采用这种设计
docker commit 镜像提交
docker commit -m="" -a="作者" 容器id 目标镜像名称:[标签名]
网络
单机
多机
Dockerfile介绍
是什么
执行流程
关键字
数据卷
容器
2020-06-19
设计模式.xmind
设计模式
创建型6种
单例模式
单例模式五种写法
工厂模式
建造者模式
原型模式
结构型7种
适配器模式
代理模式
装饰模式
桥接模式
组合模式
享元模式
行为型11种
模板方法模式
观察者模式
策略模式
迭代器模式
责任链模式
命令模式
状态模式
访问者模式
中介者模式
备忘录模式
解释器模式
2020-06-19
Java EE常用框架.xmind
Java EE常用框架
WebService
介绍
基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用
术语
XML. Extensible Markup Language -扩展性标记语言
WSDL – WebService Description Language – Web服务描述语言。
SOAP-Simple Object Access Protocol(简单对象访问协议)
SOA(Service-Oriented Architecture) :面向服务的架构
它是一种思想,IBM大力倡导是即插即用的,IBM大力提倡,希望以组装电脑的方式来开发应用
它是目录服务,通过该服务可以注册和发布webservcie,以便第三方的调用者统一调用
使用:
二、我们可以使用Java自带的WsImport来实现本地代理。这种方法会将WebService翻译成Java类,我们使用类一样去访问WebService就行了。非常好用。
三、除了调用别人发布的webService,也可以自己发布WebService服务
四、CXF框架可以与spring无缝连接,就不用我们自己Endpoint了。它还能记录日志之类的
五、我们还可以使用Idea下的webservice,能够使用图形画面的方式获取本地代理和生成WSDL文件。
Activiti
介绍
Activiti5是一个业务流程管理(BPM)框架
如果我们的业务是比较复杂的话,我们才会用到工作流!
使用Activiti的步骤
定义工作流
画一个BPMN图就可以了
部署工作流
执行工作流-->按照我们定义的工作流来执行
工作流在执行的过程中肯定会涉及到很多数据,Activiti是默认提供数据库表给我们使用的
Activiti工作流框架快速入门:
定义工作流,使用插件来把我们的流程图画出来。这个流程图就是我们定义的工作流。
工作流引擎是工作流的核心,能够让我们定义出来的工作流部署起来。
由于我们使用工作流的时候是有很多数据产生的,因此Activiti是将数据保存到数据库表中的。这些数据库表由Actitviti创建,由Activiti维护。
部署完的工作流是需要手动去执行该工作流的。
根据由谁处理当前任务,我们就可以查询出具体的任务信息。
根据任务的id,我们就可以执行任务了。
细节
流程定义:涉及到了四张数据库表
我们可以通过API把我们的流程定义图读取出来
可以根据查询最新版本的流程定义
删除流程定义
部署流程定义的时候也可以是ZIP文件
流程运行:涉及到两个对象,四张数据库表:
流程实例
获取流程实例和任务的历史信息
判断流程实例是否为空来判断流程是否结束了
查看正在运行服务的详细信息
通过流程实例来开启流程
流程变量:它涉及到了两张表。
流 程变量实际上就是我们的条件。
作用
我们可以在流程开始的时候设置流程变量,在任务完成的时候设置流程变量。
运行时服务和流程任务都可以设置流程变量。
连线
通过连线我们可以在其中设置条件,根据不同的条件流程走不同的分支
排他网关
SpringData JPA
简介
API
Repository接口
PagingAndSortingRepository
JpaRepository
JpaSpecificationExecutor
过滤条件查询接口
注解
nameQuery注解
SQL命名,调用的时候根据名称调用
查询注解
1,targetEntity 属性表示默认关联的实体类型,默认为当前标注的实体类。
2,cascade属性表示与此实体一对一关联的实体的级联样式类型。
3,fetch属性是该实体的加载方式,默认为即时加载EAGER
4,optional属性表示关联的该实体是否能够存在null值,默认为ture,如果设置为false,则该实体不能为null,
5, mapperBy属性:指关系被维护端
1,@JoinColumn注释是保存表与表之间关系的字段
2,如果不设置name,默认name = 关联表的名称+”-“+关联表
2020-06-19
Spring启动流程.java
AbstractApplicationContext.refresh(){
1.为刷新准备此上下文
prepareRefresh(){
initPropertySources();//在上下文环境中初始化任何占位符属性源
getEnvironment().validateRequiredProperties();//验证所有标记为必需的属性都是可解析的
this.earlyApplicationEvents = new LinkedHashSet<>();//保存容器中的一些早期的事件;在下面第10步会发布这些事件。
}
2.告诉子类刷新内部bean工厂。
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(){
GenericApplicationContext.refreshBeanFactory(){//Do nothing ,设置id
this.beanFactory.setSerializationId(getId());
}
GenericApplicationContext.getBeanFactory(){
return this.beanFactory= new DefaultListableBeanFactory();//创建一个beanFactory
}
}
3.准备bean工厂以供在此上下文中使用。配置工厂的标准上下文特征,例如上下文的类加载器和后置处理器。
prepareBeanFactory(beanFactory){
.
.
.
2020-06-19
现代操作系统.xmind
本书是操作系统领域的经典之作,与第2版相比,增加了关于Linux、Windows Vista和Symbian操作系统的详细介绍。书中集中讨论了操作系统的基本原理,包括进程、线程、存储管理、文件系统、输入/输出、死锁等,同时还包含了有关计算机安全、多媒体操作系统、掌上计算机操作系统、微内核、多核处理机上的虚拟机以及操作系统设计等方面的内容。此外,还在第2版的基础上对部分习题进行了增删,更有助于读者学习和对知识的理解及掌握。
本书适合作为高等院校计算机专业操作系统课程教材,也是设计、开发操作系统的重要参考书。
Tanenbaum教授作为三个操作系统的设计师或联合设计师,具有长期设计开发操作系统
2020-06-19
Java并发编程(学习笔记).xmind
Java并发编程
背景介绍
并发历史
必要性
进程
资源分配的最小单位
线程
CPU调度的最小单位
线程的优势
(1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率
(2)建模简单:通过使用线程可以讲复杂并且异步的工作流进一步分解成一组简单并且同步的工作流,每个工作流在一个单独的线程中运行,并在特定的同步位置交互
(3)简化异步事件的处理:服务器应用程序在接受来自多个远程客户端的请求时,如果为每个连接都分配一个线程并且使用同步IO,就会降低开发难度
(4)用户界面具备更短的响应时间:现代GUI框架中大都使用一个事件分发线程(类似于中断响应函数)来替代主事件循环,当用户界面用有事件发生时,在事件线程中将调用对应的事件处理函数(类似于中断处理函数)
线程的风险
线程安全性:永远不发生糟糕的事情
活跃性问题:某件正确的事情迟早会发生
问题:希望正确的事情尽快发生
服务时间过长
响应不灵敏
吞吐率过低
资源消耗过高
可伸缩性较低
线程的应用场景
Timer
确保TimerTask访问的对象本身是线程安全的
Servlet和JSP
Servlet本身要是线程安全的
正确协同一个Servlet访问多个Servlet共享的信息
远程方法调用(RMI)
正确协同多个对象中的共享状态
正确协同远程对象本身状态的访问
Swing和AWT
事件处理器与访问共享状态的其他代码都要采取线程安全的方式实现
框架通过在框架线程中调用应用程序代码将并发性引入应用程序,因此对线程安全的需求在整个应用程序中都需要考虑
基础知识
线程安全性
定义
当多个线程访问某个类时,这个类始终能表现出正确的行为,那么就称这个类是线程安全的
无状态对象一定是线程安全的,大多数Servlet都是无状态的
原子性
一组不可分割的操作
竞态条件
基于一种可能失效的观察结果来做出判断或执行某个计算
复合操作:执行复合操作期间,要持有锁
锁的作用
加锁机制、用锁保护状态、实现共享访问
锁的不恰当使用可能会引起程序性能下降
对象的共享使用策略
线程封闭:线程封闭的对象只能由一个线程拥有并修改
Ad-hoc线程封闭
栈封闭
ThreadLocal类
只读共享:不变对象一定是线程安全的
尽量将域声明为final类型,除非它们必须是可变的
分类
不可变对象
事实不可变对象
线程安全共享
封装有助于管理复杂度
线程安全的对象在其内部实现同步,因此多个接口可以通过公有接口来进行访问
保护对象:被保护的对象只能通过特定的锁来访问
将对象封装到线程安全对象中
由特定锁保护
保护对象的方法
对象的组合
设计线程安全的类
实例封闭
线程安全的委托
委托是创建线程安全类的最有效策略,只需要让现有的线程安全类管理所有的状态
在现有线程安全类中添加功能
将同步策略文档化
基础构建模块
同步容器类
分类
Vector
Hashtable
实现线程安全的方式
将状态封装起来,对每个公有方法都进行同步
存在的问题
复合操作
修正方式
客户端加锁
迭代器
并发容器
ConcurrentHashMap
用于替代同步且基于散列的Map
CopyOnWriteArrayList
用于在遍历操作为主要操作的情况下替代同步的List
Queue
ConcurrentLinkedQueue
*BlockingQueue
提供了可阻塞的put和take方法
生产者-消费者模式
中断的处理策略
传递InterruptedException
恢复中断,让更高层的代码处理
PriorityQueue(非并发)
ConcurrentSkipListMap
替代同步的SortedMap
ConcurrentSkipListSet
替代同步的SortedSet
Java 5
Java 6
同步工具类
闭锁
*应用场景
(1)确保某个计算在其需要的所有资源都被初始化后才能继续执行
(2)确保某个服务在其所依赖的所有其他服务都已经启动之后才启动
(3)等待知道某个操作的所有参与者都就绪再继续执行
CountDownLatch:可以使一个或多个线程等待一组事件发生
FutureTask
*应用场景
(1)用作异步任务使用,且可以使用get方法获取任务的结果
(2)用于表示一些时间较长的计算
状态
等待运行
正在运行
运行完成
使用Callable对象实例化FutureTask类
信号量(Semaphore)
用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量
管理者一组虚拟的许可。acquire获得许可(相当于P操作),release释放许可(相当于V操作)
应用场景
(1)二值信号量可用作互斥体(mutex)
(2)实现资源池,例如数据库连接池
(3)使用信号量将任何一种容器变成有界阻塞容器
栅栏
能够阻塞一组线程直到某个事件发生
栅栏和闭锁的区别
所有线程必须同时到达栅栏位置,才能继续执行
闭锁用于等待事件,而栅栏用于等待线程
栅栏可以重用
形式
CyclicBarrier
可以让一定数量的参与线程反复地在栅栏位置汇集
应用场景在并行迭代算法中非常有用
Exchanger
这是一种两方栅栏,各方在栅栏位置上交换数据。
应用场景:当两方执行不对称的操作(读和取)
线程池
任务与执行策略之间的隐形耦合
线程饥饿死锁
运行时间较长的任务
设置线程池的大小
配置ThreadPoolExecutor
构造参数
corePoolSize
核心线程数大小,当线程数= corePoolSize的时候,会把runnable放入workQueue中
如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会抛出异常,告诉调用者“我不能再接受任务了”
keepAliveTime
保持存活时间,当线程数大于corePoolSize的空闲线程能保持的最大时间。
workQueue
保存任务的阻塞队列
如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列。如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要创建线程运行这个任务
threadFactory
创建线程的工厂
handler
拒绝策略
unit
是一个枚举,表示 keepAliveTime 的单位(有NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS,7个可选值
线程的创建与销毁
管理队列任务
饱和策略
AbortPolicy
DiscardPolicy
DiscardOldestPolicy
CallerRunsPolicy
线程工厂
在调用构造函数后再定制ThreadPoolExecutor
扩展 ThreadPoolExecutor
afterExecute(Runnable r, Throwable t)
beforeExecute(Thread t, Runnable r)
terminated
递归算法的并行化
构建并发应用程序
任务执行
在线程中执行任务
清晰的任务边界以及明确的任务执行策略
任务边界
大多数服务器以独立的客户请求为界
在每个请求中还可以发现可并行的部分
任务执行策略
在什么(What)线程中执行任务?
任务按照什么(What)顺序执行(FIFO、LIFO、优先级)?
有多少个(How Many)任务能并发执行?
在队列中有多少个(How Many)任务在等待执行?
如果系统由于过载而需要拒绝一个任务,那么应该选择哪一个(Which)任务?另外,如何(How)通知应用程序有任务被拒绝?
在执行一个任务之前或之后,应该进行什么(What)动作?
使用Exector框架
线程池
newFixedThreadPool(固定长度的线程池)
newCachedThreadPool(不限规模的线程池)
newSingleThreadPool(单线程线程池)
newScheduledThreadPool(带延迟/定时的固定长度线程池)
具体如何使用可以查看JDK文档
找出可利用的并行性
某些应用程序中存在比较明显的任务边界,而在其他一些程序中则需要进一步分析才能揭示出粒度更细的并行性
任务的取消和关闭
任务取消
停止基于线程的服务
处理非正常的线程终止
JVM关闭
线程池的定制化使用
任务和执行策略之间的隐性耦合
线程池的大小
配置ThreadPoolExecutor(自定义的线程池)
此处需要注意系统默认提供的线程池是如何配置的
扩展ThreadPoolExector
GUI应用程序探讨
活跃度(Liveness)、性能、测试
避免活跃性危险
死锁
锁顺序死锁
资源死锁
动态的锁顺序死锁
开放调用
在协作对象之间发生的死锁
死锁的避免与诊断
支持定时的显示锁
通过线程转储信息来分析死锁
其他活跃性危险
饥饿
要避免使用线程优先级,因为这会增加平台依赖性,并可能导致活跃性问题。在大多数并发应用程序中,都可以使用默认的线程优先级。
糟糕的响应性
如果由其他线程完成的工作都是后台任务,那么应该降低它们的优先级,从而提高前台程序的响应性。
活锁
要解决这种活锁问题,需要在重试机制中引入随机性(randomness)。为了避免这种情况发生,需要让它们分别等待一段随机的时间
性能与可伸缩性
概念
运行速度(服务时间、延时)
处理能力(吞吐量、计算容量)
可伸缩性:当增加计算资源时,程序的处理能力变强
如何提升可伸缩性
Java并发程序中的串行,主要来自独占的资源锁
优化策略
缩
2020-06-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人