Spring知识点
Spring知识点Spring概述什么是Spring?Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。
使用Spring框架的好处是什么?
轻量: Spring 是轻量的,基本的版本大约2MB。
控制反转: Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
面向切面的编程(AOP): Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
容器: Spring 包含并管理应用中对象的生命周期和配置。
MVC框架: Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
事务管理: Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
异常处理: Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异 ...
Java多线程知识汇总(1)
Java多线程知识汇总(1)
引用自Java多线程知识小抄集(一)
interrupted与isInterrupted的区别
interrupted():测试当前线程是否已经是中断状态,执行后具有状态标志清除为false的功能。 isInterrupted():测试线程Thread对象是否已经是中断状态,但不清除状态标志。
方法:
1234567public static boolean interrupted() { return currentThread().isInterrupted(true);}public boolean isInterrupted() { return isInterrupted(false);}private native boolean isInterrupted(boolean ClearInterrupted);1234567
终止正在运行的线程的三种方法:
使用退出标志,是线程正常退出,也就是当run方法完成后线程终止; 使用stop方法强行终止线程,但是不推荐使用这个方法,因为 ...
Java多线程知识汇总(2)
Java多线程知识汇总(2)
引用自Java多线程知识小抄集(二)
ConcurrentHashMap
ConcurrentHashMap是线程安全的HashMap,内部采用分段锁来实现,默认初始容量为16,装载因子为0.75f,分段16,每个段的HashEntry<K,V>[]大小为2。键值都不能为null。每次扩容为原来容量的2倍,ConcurrentHashMap不会对整个容器进行扩容,而只对某个segment进行扩容。在获取size操作的时候,不是直接把所有segment的count相加就可以可到整个ConcurrentHashMap大小,也不是在统计size的时候把所有的segment的put, remove, clean方法全部锁住,这种方法太低效。在累加count操作过程中,之前累加过的count发生变化的几率非常小,所有ConcurrentHashMap的做法是先尝试2(RETRIES_BEFORE_LOCK)次通过不锁住Segment的方式统计各个Segment大小,如果统计的过程中,容器的count发生了变化,再采用加锁的方式来统计所有的Segmen ...
Java多线程知识汇总(3)
Java多线程知识汇总(3)
引用自Java多线程知识小抄集(三)
SimpleDateFormat非线程安全
当多个线程共享一个SimpleDateFormat实例的时候,就会出现难以预料的异常。
主要原因是parse()方法使用calendar来生成返回的Date实例,而每次parse之前,都会把calendar里的相关属性清除掉。问题是这个calendar是个全局变量,也就是线程共享的。因此就会出现一个线程刚把calendar设置好,另一个线程就把它给清空了,这时第一个线程再parse的话就会有问题了。
解决方案:1. 每次使用时创建一个新的SimpleDateFormat实例;2. 创建一个共享的SimpleDateFormat实例变量,并对这个变量进行同步;3. 使用ThreadLocal为每个线程都创建一个独享的SimpleDateFormat实例变量。
CopyOnWriteArrayList
在每次修改时,都会创建并重新发布一个新的容器副本,从而实现可变现。CopyOnWriteArrayList的迭代器保留一个指向底层基础数组的引用,这个数组当前位于迭代器的起 ...
Linux IO模式及select、poll、epoll详解
Linux IO模式及select、poll、epoll详解
引用自Linux IO模式及 select、poll、epoll详解
本文讨论的背景是Linux环境下的network IO。
概念说明用户空间与内核空间现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。
进程切换为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。 ...
ConcurrentHashMap
ConcurrentHashMapHashMap在put的时候,插入的元素数量超过了容量(由负载因子决定)的范围是会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在get时会出现死循环,所以HashMap是线程不安全的。
我们来了解另一个键值存储集合HashTable,它是线程安全的,它在所有涉及到多线程操作的都加上了synchronized关键字来锁住整个table,这就意味着所有的线程都在竞争一把锁,在多线程的环境下,它是安全的,但是无疑是效率低下的。
其实HashTable有很多的优化空间,锁住整个table这么粗暴的方法可以变相的柔和点,比如在多线程的环境下,对不同的数据集进行操作时其实根本就不需要去竞争一个锁,因为他们不同hash值,不会因为rehash造成线程不安全,所以互不影响,这就是锁分离技术,将锁的粒度降低,利用多个锁来控制多个小的table,这就是这篇文章的主角ConcurrentHashMap JDK ...
类加载机制
类加载机制
引用自jvm系列(一):java类的加载机制
什么是类的加载类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class 对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的 Class 对象, Class 对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。
类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误)如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误。
加载 .class 文件的方式
从本地系统中直接加载
通过网络下载.class文件
从zip,jar等归档文件中加载.class文件
从专有数据库中提取.class文件
将Java源文件动态编译为.class文件
类的生命周期
其中类加载的过程包括了加载、验 ...
web框架Gin使用手册
项目地址:https://github.com/gin-gonic/gin
安装要安装Gin软件包,您需要先安装Go并设置Go工作区。
下载并安装
1$ go get -u github.com/gin-gonic/gin
导入gin
1import "github.com/gin-gonic/gin"
(可选)导入 net/http。可以使用 http.StatusOK 之类的一些常量
1import "net/http"
快速开始12# assume the following codes in example.go file$ cat example.go
12345678910111213package mainimport "github.com/gin-gonic/gin"func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H ...
JVM自带命令
JVM自带命令
引用自jvm系列(四):jvm调优-命令篇
运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole、大名鼎鼎的VisualVM,IBM的Memory Analyzer等等,但是在生产环境出现问题的时候,一方面工具的使用会有所限制,另一方面喜欢装X的我们,总喜欢在出现问题的时候在终端输入一些命令来解决。所有的工具几乎都是依赖于jdk的接口和底层的这些命令,研究这些命令的使用也让我们更能了解jvm构成和特性。
Sun JDK监控和故障处理命令有jps jstat jmap jhat jstack jinfo
jpsJVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。
命令格式
jps [option] [hostid]
option参数
-l:输出主类全名或jar路径
-q:只输出LVMID
-m:输入JVM启动时传递给main()的参数
-v:输出JVM启动时显示指定的JVM参数
其中[option]、[hostid]参数也可以不写。
...
ORM框架gorm使用手册
项目地址:https://github.com/jinzhu/gorm
gorm文档
GORM 中文文档http://gorm.book.jasperxu.com/
Golang写的,开发人员友好的ORM库。
概述
全功能ORM(几乎)
关联(包含一个,包含多个,属于,多对多,多种包含)
Callbacks(创建/保存/更新/删除/查找之前/之后)
预加载(急加载)
事务
复合主键
SQL Builder
自动迁移
日志
可扩展,编写基于GORM回调的插件
每个功能都有测试
开发人员友好
安装1go get -u github.com/jinzhu/gorm
升级到V1.0
更新日志
快速开始12345678910111213141516171819202122232425262728293031323334353637package mainimport ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/sq ...
搭建GitLab私有代码托管
引用自:GitLab官方安装教程,快速安装 GitLab 并汉化
CentOS 7安装 GitLab
安装并配置必要的依赖关系
如果您安装了Postfix用于发送电子邮件,请在安装过程中选择“Internet站点”。你也可以使用SendMail或配置自定义 SMTP 服务器,并将其设置为 SMTP 服务器。
在 CentOS 上,下述命令将在系统防火墙中打开 HTTP 和 SSH 访问。
12345678sudo yum install curl policycoreutils openssh-server openssh-clients -ysudo systemctl enable sshdsudo systemctl start sshdsudo yum install postfixsudo systemctl enable postfixsudo systemctl start postfixsudo firewall-cmd --permanent --add-service=httpsudo systemctl reload firewalld
添加 GitL ...
Git Flow模型
git-flow 是在 git branch 和 git tag 基础上封装出来的代码分支管理模型,把实际开发模拟称 master develop feature release hotfix support 几种场景,其中 master 对应发布上线,develop 对应开发,其他几个在不同的情况下出现。通过封装,git-flow 屏蔽了 git branch 等相对来说比较复杂生硬的命令(git branch 还是比较复杂的,尤其是在多分支情况下),简单而且规范的解决了代码分支管理问题。
Git Flow 将 branch 分成2个主要分支和3个临时的辅助分支。
主要分支:
master:永远处在即将发布(production-ready)状态。
develop:最新的开发状态。
辅助分支:
feature:开发新功能的分支,基于 develop,完成后 merge 回 develop。
release:准备要发布版本的分支,用来修复 bug。基于 develop,完成后 merge 回 develop 和 master。
hotfix:修复 master 上的问题,等 ...
Git分支管理
当前项目开发过程中,项目版本一般使用git进行管理,在进行git相关操作约定之前先对分支管理的细则进行说明。
分支的划分工程的分支主要分为master、dev、hotfix、feature四类
master:线上app代码主分支,该代码和线上代码一致
dev:开发分支,包含即将上线的新功能,由各个新功能开发分支经测试后合入,属于分支测试后的产物
feature:功能开发分支,当有新开发任务时,开发需要从dev分支拉取feature分支,开发完毕经过分支测试后,可以进行pull request请求,申请将分支合入dev分支,该分支是开发过程中最常使用的分支
hotfix:bug修复分支,或紧急需求开发分支(一般不要在hotfix分支上进行新需求的开发)。该分支从master分支拉出,经开发测试完成之后,可以进行pull requets,申请将分支合入master
特别注意:
feature只能从dev分支拉出,hotfix分支只能从master拉出在进行pull request请求之前必须对当前的开发分支进行反合,即dev分支反合feature分支,master分支反合hotfi ...
GitLab使用手册
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。随着Git的流行和DevOps的逐步落地,GitLab越来越成为日常工作中不可或缺的工具,本文是在实际开发过程中正确高效地使用GitLab方法的总结。
1、GitLab设置1.1 使用SSH代替账号密码进行认证Git提供了账号密码、SSH、GPG三种方式访问代码,其中使用最多最为方便的是SSH。
生成ssh key生成ssh key需要安装Git,在 Git Bash 中依次进行以下操作。
设置Git的全局user的name和email
1git config --global user.name "xxx"
1git config --global user.email "xxx@posun.cn"
生成ssh key
1ssh-keygen -t rsa -C “xxx@posun.cn”
之后会看到提示输入保存ssh key的文件名和加密串,建议直接回车跳过。
查看ssh key
完成上述操作之后,可以在当前用户 ...
阿里云服务器环境搭建
远程云服务器的管理是运维人员的必备技能,本文总结了阿里云linux服务器的基本环境的搭建过程,方便日后查看回顾。
远程登录目前windows平台上比较常见的SSH客户端有XShell、Putty等,这里选用比较熟悉的XShell。官网需要填写个人信息之后才能下载,这里直接选择百度软件中心下载。
安装完成之后,开始登录远程的linux服务器。
新建会话
输入用户名、密码,执行登录
操作系统这里选用的是CentOS 7
环境搭建CentOS 7 可以使用yum安装包管理器快速安装配置各种常用的软件工具。
在安装软件工具之前,先对yum进行更新。
1$ yum update
JDK安装前的检查首先检查是否已经安装其他版本JDK,如openjdk等。
1$ rpm -qa | grep -E '^open[jre|jdk]|j[re|dk]'
这里显示的输出信息为:
检查当前java版本信息
1$ java -version
如果已经安装了openjdk,使用 yum remove java-1.x.x-openjdk 命令卸载。
下载并安 ...
使用hexo快速搭建个人博客
摘要:本文主要介绍使用 hexo博客框架 + GitHub托管代码 + GitHub Pages 搭建个人博客网站。
由于各种原因,博主一直都有搭建个人博客的想法。在使用hexo之前,博主曾尝试过使用SpringBoot + JQuery编写了一个包含博客功能的网站,由于这种运行于Java环境的项目正式部署到线上比较麻烦,所以就舍弃了。偶然间发现了hexo搭配GitHub Pages可以快速搭建一个博客网站,心中甚是欢喜,立马就动手搭建了起来。在这里分享下使用这种方式搭建博客网站的过程。
环境搭建安装git进入git官网,下载安装git工具即可。
安装node.js同样的,进入node.js官网,下载安装node.js工具即可。
安装hexohexo的安装需要node.js环境,在命令行中输入以下命令安装hexo-cli(hexo的命令行工具)。
1npm install hexo-cli -g
使用hexo创建本地hexo项目1234hexo init blog #使用hexo初始化blog项目cd blog #进入blog目录npm install ...