java开发
2020-07-13 15:35:38 0 举报
AI智能生成
java体系思维导图
作者其他创作
大纲/内容
JavaSE
基础语法
数据类型
8种基本数据类型
数值型
整型
byte
short
int
long
浮点型
float
double
布尔型boolean
字符型char
引用类型
接口
数组
类
枚举类型enum
类型转换
基本类型转引用类型
运算符与表达式
算术运算符
关系运算符
赋值运算符
位运算符
移位运算符
流程控制结构
顺序结构
选择结构
循环结构
方法重载 Overload
针对于同一个类或接口而言
同一个类中的多个同名方法之间参数列表必须不同。与返回值是否相同无关
方法重写/覆盖 Override
以继承为基础,子类可以覆盖父类实现的方法,实现自己的功能。
1、要保证子类中重写的方法签名要和父类一致,即返回值、方法名、参数列表必须完全一致; 2、子类抛出的异常不能超过父类相应方法抛出的异常 (子类异常不能大于父类异常);
3、子类中重写的方法访问控制权限不能低于父类。
3、子类中重写的方法访问控制权限不能低于父类。
不允许方法重写的两种特殊情况
private关键字修饰的方法
final关键字修饰的方法
面向对象
对象
在软件系统中视一切事物皆为对象,不仅包括现实中客观存在的事物,还包括抽象的东西
类
对于同一类型对象的抽象表达
接口
对行为的抽象表达,可以看作是一种协议
其中仅包含对行为的定义,不包含具体实现
三大特性
封装
对内将对象具有的特征与行为进行统一管理; 对外隐藏实现细节,仅提供公开接口。
属性
用于表达对象具有的某些特征,如大小、颜色等
方法
定义一系列对属性进行操作的行为
继承/派生
用于子类对父类的功能的扩展
表现形式
子类继承父类
子类实现接口
多态
即多种形态,通常表现于接口或抽象类中抽象方法的不同实现
表现形式就是方法重写
七大设计原则
迪米特法则
单一职责原则
简单而言,就是使类所具有的功能尽量单一。
开闭原则
对扩展开放,对修改关闭。
依赖倒转原则
抽象不应该依赖于细节,细节应该依赖于抽象
针对抽象(抽象类或接口)编程,而不是针对实现编程。
里氏替换原则
所有引用基类(父类)的地方必须能透明地使用其子类的对象。
接口隔离原则
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
接口隔离原则与单一职责原则区别: 其一,单一职责原则注重的是职责;而接口隔离原则注重对接口依赖的隔离。
其二,单一职责原则主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节;
而接口隔离原则主要约束接口接口,主要针对抽象,针对程序整体框架的构建。
其二,单一职责原则主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节;
而接口隔离原则主要约束接口接口,主要针对抽象,针对程序整体框架的构建。
合成复用原则
复用时要尽量使用组合/聚合关系(关联关系),少用继承。
迪米特法则
一个软件实体应当尽可能少地与其他实体发生相互作用,低耦合。(不要和“陌生人“说话
UML建模(visio工具)
常用的几类图:包括类图、用例图、时序图、状态图等
常用包
java.lang.reflect、java.net、java.nio、java.util.concurrent
java.lang、java.io、java.util
java.lang.reflect、java.net、java.nio、java.util.concurrent
AWT
Abstract Window Toolkit,抽象窗口工具包,该包提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的图形用户界面的基本工具
Swing
对AWT的扩展,更好的实现Java图形化编程
对AWT的扩展,更好的实现Java图形化编程
IO
区分阻塞、非阻塞、同步、异步
阻塞:等待结果返回,当前操作线程被挂起,后续操作被阻断 非阻塞:不等待返回结果,直接执行后续操作
同步:轮询模型 异步:监听模型
序列化与反序列化
序列化
序列化类型
JDK Serializable 对象序列化
ObjectInputStream、ObjectOutputStream
JSON 序列化
Fastjson、Jackson、Gson等库
XML 序列化
XStream、JAXB等
序列化协议
反序列化
IO(同步阻塞IO)
对象序列化
字节流/字符流
对象序列化
实现Serializable接口
readObject(ObjectInputStream ois)、writeObject(ObjectOutputStream oos)方法
文件操作(磁盘读写)
创建/删除文件
读/写文件
NIO(同步非阻塞IO),利用多路复用技术
传统IO(BIO)与NIO的区别:IO是面向流的,NIO是面向缓冲区的
主要组成
Channel(通道,双向)
多路复用。传统IO的流是单向的,不能同时用来进行读写操作,而Channel则是双向的
通过open()静态方法打开一个通道
Selector(选择器)
Selector类是NIO的核心类,它能够检测多个注册的Channel上是否有事件发生,如果有事件发生,便获取事件然后进行相应的处理
通过Selector.open()静态方法选择一个事件进行处理
Buffer(缓冲区)
其作用相当于BIO编程中常用的基本类型数组(byte[]、char[]等), 比如ByteBuffer就是对byte数组进行的封装,使得操作起来更方便。
1、使用的是堆外内存,不受GC管理(GC主要是堆内存)
2、非线程安全
1、使用的是堆外内存,不受GC管理(GC主要是堆内存)
2、非线程安全
Netty/Mina框架
基于NIO的高性能网络框架,通常用于分布式应用开发中进行网络数据传输
AIO(异步非阻塞IO)
输入流/输出流
字节流/字符流
网络编程
Socket
基于TCP/UDP,它是为进行TCP/UDP编程提供的API
URL、URLConnection、HttpURLConnection
InetAddress
反射机制
涉及到的类或接口
Class(表示一个类或接口)、Constructor(构造方法)、Method(方法)、Field(对应接口或类中的属性)、 Modifier(修饰符private、protected、public、static、final等)、ParameterizedType(泛型参数类型)等
JavaBean的内省
针对JavaBean的反射,包括BeanInfo、PropertyDescriptor(属性描述器)、Introspector(工具类)等常用类或接口
注解
注解(Annotation),也叫元数据。是一种代码级别的说明。
分类
自定义注解
元注解
@Target
用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
取值(ElementType)有: 1、CONSTRUCTOR:用于描述构造器
2、FIELD:用于描述字段
3、LOCAL_VARIABLE:用于描述局部变量
4、METHOD:用于描述方法
5、PACKAGE:用于描述包
6、PARAMETER:用于描述参数
7、TYPE:用于描述类、接口(包括注解类型) 或enum声明
如:@Target(ElementType.TYPE)
2、FIELD:用于描述字段
3、LOCAL_VARIABLE:用于描述局部变量
4、METHOD:用于描述方法
5、PACKAGE:用于描述包
6、PARAMETER:用于描述参数
7、TYPE:用于描述类、接口(包括注解类型) 或enum声明
如:@Target(ElementType.TYPE)
@Retention
用于描述注解的生命周期(即:被描述的注解在什么范围内有效
取值(RetentionPoicy)有: 1、SOURCE:在源文件中有效(即源文件保留)
2、CLASS:在class文件中有效(即class保留)
3、RUNTIME:在运行时有效(即运行时保留)
如:@Retention(RetentionPolicy.RUNTIME)
2、CLASS:在class文件中有效(即class保留)
3、RUNTIME:在运行时有效(即运行时保留)
如:@Retention(RetentionPolicy.RUNTIME)
@Documented
将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。
@Inherited
允许子类继承父类的注解
@Repeatable (Java8新增)
允许注解使用多次
允许注解使用多次
内建注解
@Override
供编译器检查,保证方法重写正确
供编译器检查,保证方法重写正确
@Deprecated
标记过时的方法或类型,并建议在javadoc指明替代方法或类型
@SuppressWarnings
使编译器忽略警告
@FunctionalInterface (Java8新增)
供编译器检查,接口是否满足函数式接口条件
自定义注解
区别于接口定义,使用@interface进行声明
泛型
?通配符
只读型容器
定界符super、extends
多线程、并发编程
集合框架
Map接口
Collection接口
Set接口
HashSet
LinkedHashSet
LinkedHashSet
SortedSet接口
TreeSet
List接口
ArrayList
LinkedList
Vector
Stack
Map接口
HashMap
LinkedHashMap
LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。
Hashtable
与HashMap的主要区别: * HashMap中键(key)和值(value)均可以为null,而Hashtable则不允许。
原因:由JDK源码可知,HashMap中key为null时hashCode取0,value没做限制;而Hashtable中key和value为null时均会出现NullPointerException。
* 方法加了synchronized关键字,线程安全
其中的对象必须实现equals和hashCode方法
java.util.Properties是其子类
原因:由JDK源码可知,HashMap中key为null时hashCode取0,value没做限制;而Hashtable中key和value为null时均会出现NullPointerException。
* 方法加了synchronized关键字,线程安全
其中的对象必须实现equals和hashCode方法
java.util.Properties是其子类
SortedMap接口
Map接口的有序子接口,按照键的自然顺序或指定排序规则Comparator进行排序
TreeMap
实现了SortedMap接口 * 底层就是红黑树算法的实现
* 线程不安全
* 线程不安全
WeakHashMap
其中的键是弱键,当它不被使用时会自动被GC给回收,同时其所在的entry节点会被删除
Collections工具类
提供了常用的集合操作方法,如排序sort等方法;同时还提供常用集合的同步实现,以适应多线程环境
异常处理
分类
预定义异常
运行时异常:RunTimeException类的子类
如:NullPointerException、IllegalArgumentException、ArrayIndexOutOfBoundsException等
不需要显示的在程序中进行try...catch处理
如:NullPointerException、IllegalArgumentException、ArrayIndexOutOfBoundsException等
受检异常CheckedException:非RuntimeException子类
必须在程序中显示进行异常捕获处理
如:IOException、SQLException、FileNotFoundException等
自定义异常
继承Exception或RuntimeException
语法
try...catch、try..catch...finally、try...finally
try...catch、try..catch...finally、try...finally
throw、throws
Java7易忽略的新特性
try-with-resources语句:简化资源的关闭操作,会自动在语句结束后将每个资源正确关闭。 注:该资源类必须要直接或间接实现 java.lang.AutoCloseable 接口,该接口只包含一个close方法
switch语句支持String类型
单个catch捕获多个异常,如 catch(IOException | SQLException | FileNotFoundException ex)
泛型实例化类型自动推断,如List<Integer> list = new ArrayList<>();
数值可以使用下划线分隔,如 int n = 1_000_000表示1000000
多核并行计算支持: fork/join 框架
Java8新特性
Java 9新特性
JavaEE
JavaEE基础
Servlet
生命周期
init(ServletConfig config)方法,在Servlet初始化时被调用
service(ServletRequest request, ServletResponse response)方法,处理客户端请求
destroy()方法,在Servlet销毁时被调用
配置
web.xml配置servlet和servlet-mapping
@WebServlet注解
ServletConfig
代表当前Servlet
获取Servlet初始化参数init-param
ServletContext
代表当前web应用
获取web应用初始化参数context-param
整个web应用数据共享
ServletRequest
代表客户端请求
请求转发forward,转发前后是同一个请求
ServletResponse
代表服务端响应
请求重定向redirect,前后是两个不同的请求
JSP
九大内置对象
pageContext:PageContext类型,页面上下文对象 request:ServletRequest类型,表示HTTP请求
response:ServletResponse类型,表示HTTP响应
session:HttpSession类型,表示当前会话
application:ServletContext类型,表示当前Web应用
exception:Throwable类型
out:JspWriter类型,JSP页面输出流
page:Object类型,页面对象
config:ServletConfig对象,表示当前Servlet
response:ServletResponse类型,表示HTTP响应
session:HttpSession类型,表示当前会话
application:ServletContext类型,表示当前Web应用
exception:Throwable类型
out:JspWriter类型,JSP页面输出流
page:Object类型,页面对象
config:ServletConfig对象,表示当前Servlet
四大作用域
page:表示页面范围 request:表示请求范围
session:表示当前会话范围
application:表示当前Web应用范围
session:表示当前会话范围
application:表示当前Web应用范围
JSTL
使用步骤
1、导入standard.jar和jstl.jar包到项目中 2、在jsp页面上使用taglib标签引入,指定前缀和uri
分类
核心标签库
引入核心标签库:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
常用标签
<c:if>、<c:set>、<c:out>、<c:choose>(<c:when>、<c:otherwise>)、<c:forEach>等
<c:if>、<c:set>、<c:out>、<c:choose>(<c:when>、<c:otherwise>)、<c:forEach>等
格式化标签库
格式化标签用来格式化并输出文本、日期、时间、数字
引入格式化标签库:<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
常用标签
<fmt:formatDate>、<fmt:parseDate>、<fmt:message>等
SQL标签库
SQL标签库提供了与关系型数据库(Oracle,MySQL,SQL Server等等)进行交互的标签
引入SQL标签库:<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
常用标签
<sql:setDataSource>、<sql:query>、<sql:update>、<sql:param>等
JSTL函数
其中包含一系列标准函数,大部分是字符串处理函数
引入SQL标签库:<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
常用函数
fn:replace()、fn:split()、fn:startsWith()、fn:substring()等
自定义标签
1、继承javax.servlet.jsp.tagext.SimpleTagSupport类,并重写doTag方法 2、在项目WEB-INF目录下创建tld文件(其中描述了标签的语法,如:标签有哪些属性,标签的属性是否支持表达式等内容)
EL表达式
Expression Language表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让JSP的代码更加简化。
语法:${expression}
监听器Listener
分类
ServletRequestListener
ServletRequestAttributeListener
HttpSessionListener
HttpSessionAttributeListener
ServletContextListener
ServletContextAttributeListener
配置
web.xml配置listener
@WebListener注解
过滤器Filter
生命周期
init()
初始化,由Servlet容器(如tomcat)创建
doFilter()
处理请求过滤
destroy()
销毁,由servlet容器完成
配置
web.xml配置filter和filter-mapping
@WebFilter注解
Cookie
为了弥补HTTP协议无状态的不足而引入的机制。由服务端创建,但由客户端(浏览器)保存。
应用:客户端记住密码
Session
由服务端创建,并保存到服务端
应用:用户登录验证
四种会话跟踪技术: 1、URL重写:将会话ID写到URL之后,服务端通过会话ID识别不同用户;
2、隐藏表单域:将会话ID放到表单的隐藏域中,随着表单提交到服务端;
3、Cookie:第一次请求时服务器主动发一小段信息给浏览器(即Cookie),下次请求时浏览器自动附带该段信息发送给服务器,服务器读取Cookie识别用户;
4、Session:服务器为每个用户创建一个Session对象保存到内存,并生成一个sessionID放入Cookie发送给浏览器,下次访问时sessionID会随Cookie传回来,服务器再根据sessionID找到对应Session对象。
2、隐藏表单域:将会话ID放到表单的隐藏域中,随着表单提交到服务端;
3、Cookie:第一次请求时服务器主动发一小段信息给浏览器(即Cookie),下次请求时浏览器自动附带该段信息发送给服务器,服务器读取Cookie识别用户;
4、Session:服务器为每个用户创建一个Session对象保存到内存,并生成一个sessionID放入Cookie发送给浏览器,下次访问时sessionID会随Cookie传回来,服务器再根据sessionID找到对应Session对象。
URL编码
网址路径编码:UTF-8,如xxx.com/title/编码
查询字符串:操作系统默认编码,win7是GBK
GET和POST方法的编码:网页的编码
Ajax调用中的编码:IE总是采用操作系统的默认编码,而Firefox总是采用UTF-8编码
XML
XML基础语法
文档声明
约束
DTD约束
Schema约束
XML解析
DOM
JDOM
Dom4J
SAX
websocket
基于TCP,全双工通信协议。可实现服务端消息主动推送,支持各种消息格式
主要API
注解
表示Websocket服务端
@ServerEndpoint
事件处理
@OnOpen,@OnMessage,@OnClose,@OnError
类
扩展配置
javax.websocket.server.ServerEndpointConfi
接口
会话
javax.websocket.Session
消息编码
javax.websocket.Encoder
消息解码
javax.websocket.Decoder
应用场景
Web聊天室
服务端消息通知
消息服务JMS
API
Message
消息是消息服务器在客户端之间发送的一条条信息。
消息类型
StreamMessage:Java原始值的数据流对象
MapMessage:一套名称-值对
TextMessage:一个字符串对象
ObjectMessage:一个序列化的 Java对象
BytesMessage:一个字节数据流
MapMessage:一套名称-值对
TextMessage:一个字符串对象
ObjectMessage:一个序列化的 Java对象
BytesMessage:一个字节数据流
ConnectionFactory
用于创建Connection对象的工厂,通常通过JNDI获取
Connection
连接对象是和JMS提供者通信的媒介
Destination
目标是受控对象。在JMS中表示一个队列或者一个主题。
点对点模型:Queue子接口
发布/订阅模型:Topic子接口
Session
用于创建消息的生产者、消费者和消息
MessageProducer
消息生产者,也叫做消息发送者
TopicPublisher子接口
MessageConsumer
消息消费者,也叫做消息接受者
TopicSubscriber子接口
开发步骤
1) 用JNDI 得到ConnectionFactory对象;
2) 用ConnectionFactory创建Connection 对象;
3) 用Connection对象创建一个或多个JMS Session;
4) 用JNDI 得到目标队列或主题对象,即Destination对象;
5) 用Session 和Destination 创建MessageProducer和MessageConsumer;
6) 通知Connection 开始传递消息。
2) 用ConnectionFactory创建Connection 对象;
3) 用Connection对象创建一个或多个JMS Session;
4) 用JNDI 得到目标队列或主题对象,即Destination对象;
5) 用Session 和Destination 创建MessageProducer和MessageConsumer;
6) 通知Connection 开始传递消息。
两种消息传递方式
PERSISTENT:持久化消息,将使用暂存后再转送的机理投递。 NON_PERSISTENT:非持久化消息,最多只能被投递一次。(默认)
分类
点对点模型(P2P)
消息队列Queue
消息生产者(发送者)MessageProducer
消息消费者(接收者)MessageConsumer
同步、异步(通过监听器MessageListener实现)
发布订阅模型(Pub/Sub)
主题Topic
主题发布者TopicPublisher
主题订阅者TopicSubscriber
框架
ActiveMQ
RokectMQ
RabbitMQ
Kafka
命名服务 JNDI
Java Naming Directory Interface
事务API JTA
Java Transaction API
用于处理分布式事务
持久化API JPA
Java Persistence API
邮件服务
JavaMail
Spring JavaMailSender
服务器中间件
web服务器
Nginx
Apache
应用服务器
Tomcat、Jetty
Servlet容器
底层原理:Socket通信(BIO/NIO)
JBoss、Weblogic、Websphere
开发框架
Spring
ConextLoaderListener监听器
是整个Spring应用启动的关键
Spring启动过程大致如下: 1、在Servlet容器启动后,会创建一个ServletContext(整个Web应用的上下文);
2、由于ContextLoaderListener实现了ServletContextListener,因此会在ServletContext创建完成后,其中的contextInitialized方法会自动被调用;
contextInitialized方法中将会通过ServletContext实例的getParameter()方法找到Spring配置文件位置,然后根据其中的内容为Spring创建一个根上下文(WebApplicationContext,即通常所说的IOC容器):
3、将WebApplicationContext作为ServletContext的一个属性放进去,名称是WebApplicationContext.ROOT_WEB_APPLICATIO
2、由于ContextLoaderListener实现了ServletContextListener,因此会在ServletContext创建完成后,其中的contextInitialized方法会自动被调用;
contextInitialized方法中将会通过ServletContext实例的getParameter()方法找到Spring配置文件位置,然后根据其中的内容为Spring创建一个根上下文(WebApplicationContext,即通常所说的IOC容器):
3、将WebApplicationContext作为ServletContext的一个属性放进去,名称是WebApplicationContext.ROOT_WEB_APPLICATIO
IOC
WebApplicationContext:即Spring IOC容器,由容器创建和管理Bean,使用时直接从容器中获取
配置方式
XML配置文件
@Resource/@Autowired注解配置
Bean的作用域
在Spring4中有以下几个作用域(见ConfigurableBeanFactory和WebApplicationContext接口源码) (1)singleton:默认的作用域,仅为每个Bean对象创建一个实例。
(2)prototype:可以根据需要为每个Bean对象创建多个实例。
(3)request:为每个HTTP请求创建它自有的一个Bean实例,仅在Web相关的ApplicationContext中生效。
(4)session:为每个HTTP会话创建一个实例,仅在Web相关的ApplicationContext中生效。
(5)global session:为每个全局的HTTP会话创建一个实例。一般仅在porlet上下文中使用生效。同时仅在Web相关的ApplicationContext中生效。
(6)application:为每个ServletContext创建一个实例。仅在Web相关的ApplicationContext中生效。
(2)prototype:可以根据需要为每个Bean对象创建多个实例。
(3)request:为每个HTTP请求创建它自有的一个Bean实例,仅在Web相关的ApplicationContext中生效。
(4)session:为每个HTTP会话创建一个实例,仅在Web相关的ApplicationContext中生效。
(5)global session:为每个全局的HTTP会话创建一个实例。一般仅在porlet上下文中使用生效。同时仅在Web相关的ApplicationContext中生效。
(6)application:为每个ServletContext创建一个实例。仅在Web相关的ApplicationContext中生效。
Bean的生命周期
依赖注入的几种方式
构造注入
属性注入setter
接口注入
FactoryBean与BeanFactory
AOP
动态代理
JDK动态代理(针对接口,代理类为其兄弟类)
目标对象实现了若干接口
拦截器
CGLIB动态代理(针对类,代理类为其子类)
目标对象没有实现接口
事务管理
五大事务隔离级别
七大事务传播特性
事务管理器
核心接口是PlatformTransactionManager
org.springframework.jdbc.datasource.DataSourceTransactionManager:主要用于jdbc和mybatis数据源
org.springframework.orm.hibernate3.HibernateTransactionManager:主要用于Hibernate数据源
编程式事务
通过使用TransactionTemplate或者PlatformTransactionManager相关事务API来实现事务管理
声明式事务
XML配置<tx:advice>标签
@Transactional注解
异常回滚
只会回滚RuntimeException异常
定时任务调度Spring Task
XML配置<task:scheduler>标签
@Scheduled注解配置
异步任务
XML配置<task:executor>标签
@Async注解配置
缓存支持Spring Cache
Spring 5 新特性
兼容 Java 9
最低要求 Java 8,因为使用了Java 8的一些新特性
响应式编程 WebFlux
即Spring-WebFlux模块,以 Reactor 库为基础,包含了对响应式 HTTP、服务器推送事件(Server-Sent Event)和 WebSocket 的客户端和服务器端的支持。
基于Java注解编程模型
使用方式与Spring MVC基本一样,只是使用的类型不是普通的对象,而是响应式编程中的Mono、Flux对象
Mono对象
表示单个对象,如User,用法与Optional类似
Flux对象
表示一系列的对象,类似于List<User>
基于函数式编程模型
服务器端
HandlerFunction 函数式接口
Mono<T extends ServerResponse> handle(ServerRequest request)方法用于处理客户端请求
RouterFunction 路由接口
Mono<HandlerFunction<T extends ServerResponse>> route(ServerRequest request) 方法用于选择处理对应请求的HandlerFunction对象并返回
只需要使用RouterFunctions.route 方法创建 RouterFunction 类型的 bean,就会被自动注册来处理请求并调用相应的 HandlerFunction
客户端
使用 WebClient.create方法创建客户端发起HTTP请求调用REST API 和 SSE(服务端推送)服务
使用 WebSocketClient 类的API 访问WebSocket
测试
使用 WebTestClient 类进行测试
Spring Boot
用于快速构建及开发Spring应用,可以看成是Spring框架的简化版
”约定优于配置“思想
使用约定的默认配置,减少配置文件编写
配置文件
properties文件
application.properties
yml文件
application.yml
基于注解配置
Spring原有的@Controller、@Service、@Component、@Bean、@Configuration等注解
@SpringBootApplication注解的类
表示整个应用的入口,通常位于项目的顶层包
properties配置文件读取
Spring原有的@Value
与@PropertySource配合使用读取指定配置属性值
缺点: 1、只支持单个属性值读取
2、只支持简单数据类型,如String、Boolean及数值类型
2、只支持简单数据类型,如String、Boolean及数值类型
Spring Boot新增的@ConfigurationProperties
可以指定配置属性前缀,自动绑定属性值
比@Value功能更强大 1、支持实体属性自动封装;
2、支持复杂数据类型的解析,比如数组、列表List
2、支持复杂数据类型的解析,比如数组、列表List
starter简化Maven配置
预先定义好需要的依赖并打包,需要时直接引入即可
所有Spring Boot项目公共的父依赖
spring-boot-starter-parent模块
自动配置AutoConfigurer
为项目添加默认配置
application.properties/application.yml文件中定义的配置会覆盖默认配置
自带的spring-boot-autoconfigure模块
内置Servlet容器
Tomcat、Jetty、Undertow等
ORM框架
Hibernate
HQL
可以看成是面向对象的SQL,它将原生SQL中的表名和列名分别用全类名和属性名替换了
对象的三种状态
transient(瞬时状态),persistent(持久化状态)以及detached(离线状态)
主要组成
Session:提供用户对数据库操作的API
SessionFactory:创建Session对象的工厂
Query:负责执行数据库查询操作,支持SQL、HQL两种方式
缓存机制
一级缓存
二级缓存
Criteria(QBC)
多表映射
注解
JPA提供的注解
javax.persistence包下:@Id,@Column,@Entity,@Table,@OneToMany,@ManyToOne等
Hibernate增加的注解
数据库方言Dialect
它是Hibernate数据库可移植性强的关键所在,不同的数据库使用不同的方言类进行处理,通常需要我们自己指定。 比如:Oracle10gDialect(Oracle数据库方言)、MySQL5Dialect(MySQL数据库方言)等
在方言类中包含了对不同类型数据库差异的处理,比如分页、常用函数的语法
HibernateTemplate
Spring对Hibernate的集成和封装,使用它可以很方便的进行数据库操作
HibernateTemplate的作用是保证session能够正确的打开和关闭,避免手工管理Session带来的问题。
使用 HibernateTemplate 时必须进行事务管理,否则将会报错
Mybatis
主要组成
Configuration MyBatis配置信息
配置方式
XML文件
注解
SqlSession 提供用户对数据库操作的API,完成增删改查
Executor 由SqlSession调用执行数据库操作
StatementHandler 对SQL语句进行操作
ParameterHandler 将用户传递的参数转换成JDBC Statement 所需要的参数
ResultSetHandler 将JDBC返回的ResultSet结果集对象转换成List集合
TypeHandler 负责java数据类型和jdbc数据类型之间的映射和转换
动态SQL
通过标签的形式大大的减少了条件查询时拼接SQL的难度,提高了SQL的准确率
常用标签
if、where、foreach等
结果映射
resultMap
数据类型转换
插件机制
Interceptor接口
分页插件
缓存机制
一级缓存:Session级别的缓存,Executor对象会维护一个Cache缓存,默认开启
二级缓存:Application级别的缓存,可以看作是作用于整个应用的全局缓存。 一般通过自定义缓存Redis、Memcached等实现
MVC框架
Struts2
SpringMVC
基本组成
DispatcherServlet
找到对应请求的HandlerMapping,将请求转发给对应的HandlerAdapter
处理器映射器HandlerMapping
保存请求的URL与Handler(可以是Controller或Servlet等)的对应关系
处理器适配器HandlerAdapter
调用对应的Handler进行处理,并返回ModelAndView对象给DispatcherServlet
控制器Controller
拦截器HandlerInterceptor
preHandle、postHandle、afterCompletion方法
HandlerExecutionChain
负责Handler执行前后的HandlerInterceptor的调用
模型视图ModelAndView、模型Model/ModelMap
视图解析器ViewResolver
将逻辑视图转换成物理视图
请求参数解析和封装
RequestMappingHandlerAdapter
HandlerMethodArgumentResolver接口
HandlerMethodArgumentResolverComposite类默认定义了26个不同的参数解析器
ServletModelAttributeMethodProcessor 两种情况: ①使用@ModelAttribute注解的类型;
②自定义实体POJO:通过特定的DataBinder将请求参数绑定到为实体中的属性上;
②自定义实体POJO:通过特定的DataBinder将请求参数绑定到为实体中的属性上;
其它类型的参数处理:如Map、ServletRequest、ServletResponse、Model等使用内置转换器自动转换
类型转换
Converter<S, T>接口
自定义类型转换器:实现Converter接口,并重写convert方法
ConversionService接口
方法返回值处理
HandlerMethodReturnValueHandler接口
文件上传
配置 CommonsMultipartResolverr 文件上传解析器
MultipartFile对象作为方法参数接收
全局异常处理
实现HandlerExceptionResolver接口
使用@ControlerAdvice/@RestControllerAdvice注解
其它框架
日志框架
作用
用于Java应用日志记录,通常保存到文件中,方便调试跟踪系统运行情况及排查问题
分类
日志门面
Apache的 commons-logging
Spring等框架依赖其做日志记录
slf4j
slf4j-api-xxx.jar
jboss-logging
Hibernate依赖其做日志记录
桥接器(适配器)
slf4j-log4j:slf4j适配log4j
slf4j-logback:slf4j适配logback
slf4j-jdk14:slf4j适配JDK提供的日志框架(JUL)
具体实现
log4j
log4j2
logback
JUL(java.util.logging)
安全框架
Shiro
主要功能
权限控制
身份认证(登录)Authentication
权限验证(授权)Authorization
会话管理
数据加密
常用的加密算法
API
当前用户(不一定是人,比如爬虫程序)Subject
安全管理器SecurityManager,shiro的核心
SecurityUtils工具类
Realm,域,从中获取用户的角色、权限信息进行身份认证
Spring Security
定时任务框架
Quartz
Spring Task
工作流引擎
JBPM(Java Business Process Management)
Activiti
模板引擎
freemarker、velocity、thymeleaf、beetl(国产)
全文搜索框架
Apache Lucene
主要功能
创建及维护索引,提供全文检索服务。支持结果排序及关键字高亮
主要组成
索引保存目录Directory
FSDirectory:索引存储在磁盘
RAMDirectory:索引存储在内存
索引文档Document
Field:StringField只索引不分词,TextField既索引又分词
分词器Analyzer
对于索引内容进行分词
常用分词器
简单分词器SimpleAnalyzer
标准分词器StandardAnalyzer
中文分词器
SmartChineseAnalyser
IKAnalyzer
庖丁分词器PaodingAnalyzer
索引管理器IndexWriter
负责索引文档的创建、更新、删除
查询分析器QueryParser
构造搜索条件并分析
索引阅读器IndexReader
索引阅读器IndexReader
索引搜索器IndexSearcher
根据搜索条件返回匹配的结果
Compass
基于Lucene,ElasticSearch的前身
提供了Spring、Hibernate框架集成
ElasticSearch
基于Lucene,分布式的,适用于实时、大数据量的搜索场景
Apache Solr
基于Lucene,适用于常规搜索场景
利用Zookeeper进行分布式管理
Hibernate Search
集成了Hibernate、Lucene和ElasticSearch
网络编程框架
HTTP客户端
Apache HttpClient
OkHttp
网络IO框架
Netty
Mina
Hibernate-Validator 参数校验框架
Bean Validation规范的实现
项目管理及构建工具
Maven
坐标
groupId、artifactId、version
仓库
本地、远程仓库
依赖配置
引入依赖:dependencies、dependency节点
排除依赖:exclusions、exclusion节点
聚合与继承,分别是modules、parent节点
生命周期和命令
mvn clean、mvn test、mvn package、mvn install
Archetype
创建Maven项目的基本骨架
自定义Archetype
Maven镜像
阿里云公有镜像http://maven.aliyun.com/nexus/content/group
Maven私服
Nexus私服配置
Maven插件
Maven功能的扩展
自定义Maven插件
继承AbstractMojo类
Ant/Gradle
版本控制工具
SVN
Git
CI 持续集成工具
jenkins
常用工具
Google Guava
Optional类
避免空指针
MoreObjects工具类
作为java.util.Objects类的扩展
字符串操作,如split、join等操作
Spliter、Joiner类
函数式编程
Apache Commons
commons-beanutils包
用于处理JavaBean相关操作,最常见的就是属性复制。
如 BeanUtils.copyProperties()、ProperUtils.copyProperties()
commons-lang包
如:StringUtils
commons-io包
简化IO操作
如:IOUtils
commons-collections包
简化集合操作
如:CollectionUtils
commons-fileupload包
处理文件上传相关操作
Spring 中的工具类
StringUtils
字符串操作
WebUtils
处理Web相关操作
FileCopyUtils(文件复制)、ResourceUtils(读取文件)等
ObjectUtils
ReflectionUtils
简化反射操作
其它常用工具
lombok
通过注解简化Java代码编写,使代码看起来更简洁。可以自动生成类的getter、setter、toString、hashcode、equals、构造器等
常用注解
@Getter、@Setter
为属性自动生成getter、setter方法
@NoArgsConstructor
生成无参构造器
@AllArgsConstructor
生成包含所有属性的构造器
@Data
生成getter、setter、hashcode、equals、toString方法
其它功能注解
@Slf4j 注入log日志对象
@NonNull 非空检查
......
Swagger
可以与Spring MVC集成为项目生成RESTful API文档,并且可以直接在页面测试
接口服务
Web Service
RPC
即Remote Procedure Call,远程过程调用。客户机通过网络实现对服务器上的方法进行调用
常见框架
Alibaba dubbo
Google grpc
Facebook Thrift
RMI
可以看成是RPC的Java实现,同时它也是JNDI(即Java Naming and Directory Interface,Java命名和目录接口)规范的一种实现。
主要组成
Naming类
LocateRegistry类
Remote接口:代表远程对象
UnicastRemoteObject类
使用步骤(HelloWorld程序)
1、声明远程接口(如IHelloService),并继承Remote接口;
2、在远程接口中声明需要远程调用的方法,注:必须声明抛出RemoteException异常!
3、编写远程对象接口的实现类(如HelloServiceImpl),必须继承UnicastRemoteObject类,方法中的参数必须实现Serializable接口;
4、编写服务端程序(即被远程调用的一方):
① 使用LocateRegistry.createRegistry(port);绑定端口
② 使用Naming.bind()方法将HelloServiceImpl对象进行绑定,如Naming.bind("rmi://localhost:8888/HelloService", new HelloServiceImpl());
① 使用LocateRegistry.createRegistry(port);绑定端口
② 使用Naming.bind()方法将HelloServiceImpl对象进行绑定,如Naming.bind("rmi://localhost:8888/HelloService", new HelloServiceImpl());
5、编写客户端程序(调用方):
① 使用Naming.lookup()方法根据服务端绑定的地址获取远程对象
如 IHelloService helloService = (IHelloService) Naming.lookup("rmi://localhost:8888/HelloService");
② 调用helloService对象的方法
如 helloService.hello();
① 使用Naming.lookup()方法根据服务端绑定的地址获取远程对象
如 IHelloService helloService = (IHelloService) Naming.lookup("rmi://localhost:8888/HelloService");
② 调用helloService对象的方法
如 helloService.hello();
Web Service
SOAP协议
Simple Object Access Protocol(简单对象访问协议),它是一种轻量的、简单的、基于XML和HTTP的Web数据交换协议。 它通过XML 来实现消息描述,然后再通过 HTTP 协议实现消息传输。
WSDL
即Web Service Description Language,Web服务描述语言。就是基于XML,用于描述Web 服务及其函数、参数和返回值的语言。
WSDD
即Web Serive Deployment Descriptor,Web服务部署描述符。用于服务端Web Service的发布
常见框架
Apache Axis
Apache CXF
RESTful
即表述性状态传递(Representational State Transfer,简称REST),它是一种软件架构风格,可以完全使用HTTP协议实现。 适用于完全无状态的CRUD(Create、Retrieve、Update、Delete,即数据的增删改查)操作
对资源的操作有获取、创建、修改和删除,与HTTP协议提供的GET、POST、PUT、DELTE等方法相对应
通过Spring MVC来实现
org.springframework.web.filter.HiddenHttpMethodFilter 过滤器 (由于浏览器form表单只支持GET与POST请求,而DELETE、PUT等method并不支持,此过滤器就可以将其转换成标准的HTTP方法,使得支持PUT、DELETE等请求)
统一异常处理
@ExceptionHandler注解
实现HandlerExceptionResolver 接口
token身份验证
高并发
概念
大量用户同时访问请求网站或系统,造成请求不能及时响应的现象
解决思路
负载均衡Load Balance,简称LB
硬件
F5
软件
nginx
Linux服务器集群系统LVS(Linux Virtual Server)
HaProxy
服务器集群
服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一个服务器。
常见集群
Weblogic服务器集群
数据库服务器集群
Tomcat服务器集群
Apache + Tomcat:一台Apache服务器进行反向代理与请求分发,多台Tomcat服务器处理请求
Nginx + Tomcat:一台Nginx服务器进行反向代理与请求分发,多台Tomcat服务器处理请求
Weblogic服务器集群
数据库服务器集群
锁机制
分布式锁
基于数据库实现
锁表
创建一张锁表,当需要锁住某个方法或资源时,我们就在该表中增加一条相应的记录,想要释放锁的时候就删除该条记录
排他锁
在查询语句后面增加for update,数据库会在查询过程中给数据库表增加排他锁,直到事务提交后才会释放锁
基于缓存实现
如redis、memcached等
基于zookeeper实现
Java中的锁
用于保证线程同步
同步锁synchronized关键字
Lock
CAS
数据库锁
已由数据库本身实现,只需调用相关语句即可
乐观锁
通常通过在表结构中增加一个版本号字段来解决,查询数据时将版本号一起查出来,需要更新数据时就将原有版本号加一
给数据库操作加个版本号判断,满足条件的才会执行,这就相当于给数据库操作加了一把锁
如 update user set name='Tom', version=2 where id=1 and version=1
悲观锁
共享锁
对于MySQL数据库,在查询语句后面加上lock in share mode,数据库就会在查询过程中给数据库表增加共享锁
排他锁
也称独占锁。排他锁与共享锁相对应,就是指对于多个不同的事务,对同一个资源只能有一把锁。
在查询语句后面增加for update,数据库会在查询过程中给数据库表指定行增加排他锁,直到事务提交后才会释放锁
如 select * from user where name='张三' for update
缓存技术
要解决的问题
缓存一致性
缓存与数据库中的数据需要保证一致
缓存雪崩
缓存在同一时间大面积失效
缓存穿透
同一时间大量请求查询不存在的缓存,造成后端数据库压力增大
好处
减轻数据库如MySQL、Oracle等的压力
提高数据访问的速度。
常用缓存中间件
Redis
Redis的安装及配置(Linux环境下)
下载源码
wget http://download.redis.io/releases/redis-2.8.13.tar.gz
解压后编译并安装
tar vxzf 下载的安装包名
cd 进入解压后的文件夹中
make 编译
make install 安装
redis.conf文件配置
后台启动配置参数
daemonize yes (no-不后台启动 yes-后台启动)
端口配置参数
port 6379 (可以更改自己的端口号,客户端登陆时,如改变默认端口,则需指定设置的端口进行登陆)
信息查看命令
查看redis客户端 which redis-cli 登录:redis-cli(默认登录本机6379端口)
info命令查看redis信息
info命令查看redis信息
过期时间expire
数据类型
String
最基本的存储结构
命令
get key set key value
mget key1 key2...、
mset key1 key2...
setnx key value
incr/decr key
get key set key value
mget key1 key2...、
mset key1 key2...
setnx key value
incr/decr key
Hash
key-value结构
命令
hget key field hset key field value
hmset key field1 value1 field2 value2...
hmget key field1 field2
hmset key field1 value1 field2 value2...
hmget key field1 field2
List
lpush、rpush、lpop、rpop、lset key index value
双向链表结构,数据按从左到右的顺序存储
lpush、rpush、lpop、rpop、lset key index value
Set
Set集合,不能有相同的值
命令
sadd key member1 member2... scard key
set key index value
sismember key member
smembers key
set key index value
sismember key member
smembers key
zset(sorted set)
有序集合,按照score排序
命令
zadd key score1 member1 score2 member2 ... zcard key
zrange key start stop [withscores]
zrange key start stop [withscores]
存储
内存、磁盘、日志文件
持久化
RDB快照
Append-only file(缩写为AOF)日志
发布/订阅
管道pipeline
以一次性发送多条命令并在执行完后一次性将结果返回
通过减少客户端与redis的通信次数来实现降低往返延时时间,而且其实现原理是队列,先进先出,因此可以保证数据的顺序性。
事务
事务中的多条命令要么都执行成功,要么都失败
memcached
特点: 1、只支持key-value数据结构存储
2、缓存数据全部在内存中,不支持数据持久化
2、缓存数据全部在内存中,不支持数据持久化
EhCache
CDN(Content Delivery Network,内容分发网络)缓存
服务降级
网页HTML静态化
数据库读写分离、分表分库
图片服务器分离
负载测试工具
Jmeter
Tsung
性能优化
性能指标
硬件层面
软件层面
响应时间
指系统对请求作出响应的时间,通常包括客户端响应时间、网络响应时间和服务端响应时间。
吞吐量
并发用户数
性能测试
Jmeter
硬件优化
CPU、内存、磁盘
据库SQL优化
分析SQL执行计划
MySQL 使用 explain 命令
如 explain select ...
Oracle 使用 explain plan for 命令
如 explain plan for select ...
SQL语句优化
建立及优化索引
JVM参数调优
内存泄漏
内存使用后未得到及时释放,而且不能被GC回收,导致虚拟机不能再次使用该内存,此时这段内存就泄露了
内存溢出OOM
即OutOfMemoryError,当没有足够的空闲内存可供程序使用时出现
常见类型
Java Heap Space : Java堆内存溢出
此种情况最常见,一般由于内存泄露或者堆的大小设置不当引起。 对于内存泄露,需要通过内存监控软件(如heapdump)查找程序中的泄露代码;而堆大小可通过设置JVM的参数-Xms、-Xmx来解决。
PermGen Space:永久代内存溢出
即方法区内存溢出,如果程序加载的类过多,或者使用反射、gclib等这种动态代理生成类的技术,就可能导致该区发生内存溢出。 此种情况可以通过更改方法区的大小来解决,设置-XX:PermSize=64m -XX:MaxPermSize=256m参数。
另外,过多的常量尤其是字符串也会导致方法区溢出,因为常量池也位于方法区中。
另外,过多的常量尤其是字符串也会导致方法区溢出,因为常量池也位于方法区中。
注:从Java8开始移除了Permgen Space,取而代之的是MetaSpace
StackOverFlowError:栈溢出
即虚拟机栈或本地方法栈区域内存溢出
出现原因:程序中出现死循环或递归次数过多;也可能是栈大小设置过小导致,可通过设置-Xss参数来调整栈大小。
监控工具
jps:查看Java进程
jmap:查看JVM当前的堆内存快照(heapdump)
jstack:查看JVM当前的线程快照,又称threaddump文件,它是JVM当前每一条线程正在执行的堆栈信息的集合
jinfo:实时查看JVM的参数信息
jstat:用于监控JVM的各种运行状态信息,如类的装载、内存、垃圾回收、JIT编译器等
jconsole:用于监控内存,线程、堆栈等信息
jprofile:类似于jconsole,比jconsole监控的信息更全面
程序优化
代码优化
遵循好的编码规范
阿里巴巴Java开发手册》
《Google编码规范》
运用好的编码技巧
提高代码可重用性、可扩展性
JNI(Java Native Interface,Java本地接口)
将底层的一些操作使用更接近操作系统的语言(如C/C++)进行实现,可以提高程序执行效率
DK中使用了很多的native方法,如System类中的arraycopy、currentTimeMillis方法等
算法
分类
排序算法
分类
内排序
内部排序是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列。
分类
插入排序
直接插入排序
将一个记录插入到已排序好的有序表中,从而得到一个新的有序表。 即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。
希尔排序
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
选择排序
简单选择排序
每次都找一个最大或者最小的排在开始即可。 1、首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置;
2、再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾;
3、重复第二步,直到所有元素均排序完毕
2、再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾;
3、重复第二步,直到所有元素均排序完毕
堆排序
堆排序(Heapsort) 是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。 可以利用数组的特点快速定位指定索引的元素。
大根堆(最大堆)
每个结点的值都不大于其父节点的值。从下往上,结点值越来越大,根结点值最大。
小根堆(最小堆)
每个结点的值都不小于其父节点的值。从下往上,结点值越来越小,根结点值最小。
交换排序
冒泡排序
冒泡排序可以算得上是最基础的排序算法了。算法的思想是: 依次比较相邻的两个元素,如果后一个小于前一个,则交换,这样从头到尾一次,就将最大的放到了末尾。
快速排序
基本思想:
1)选择一个基准元素,通常选择第一个元素或者最后一个元素;
2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大;
3)此时基准元素在其排好序后的正确位置;
4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。
1)选择一个基准元素,通常选择第一个元素或者最后一个元素;
2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大;
3)此时基准元素在其排好序后的正确位置;
4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。
归并排序
归并排序是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。 然后再把有序子序列合并为新的有序序列。基本原理是分治法,包括递归和合并。
基数排序
外排序
指能够处理极大量数据的排序算法。通常来说,外排序处理的数据不能一次装入内存,只能放在读写较慢的外存储器(通常是硬盘)上。
应用:大文件拆分排序
评估标准
时间/空间复杂度O
“时间换空间,空间换时间”
稳定性
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变, 即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。
查找算法
二分查找
分块查找
哈希查找
计算哈希值
贪心算法
求最小生成树的Prim算法和Kruskal算法
爬山问题
分治算法Divide and Conquer
算法思想: 1、划分:将原问题划分成多个子问题;
2、求解:递归地解各个子问题。若子问题足够小,则直接求解;
3、合并:将子问题的解进行合并,得到原问题的解。
2、求解:递归地解各个子问题。若子问题足够小,则直接求解;
3、合并:将子问题的解进行合并,得到原问题的解。
应用:归并排序
动态规划Dynamic Planning
基本思想
动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法的区别:
分治:各子问题间相互独立;动态规划:各子问题间存在重叠部分
分治:各子问题间相互独立;动态规划:各子问题间存在重叠部分
最优子结构,状态转移方程(递推关系)的确定
应用
求最长公共子序列LCS
矩阵连乘问题
爬楼梯问题
找零问题
0-1背包问题
回溯算法
n皇后问题
其它
Rabin fingerprints 文件指纹算法
为每个文件生成唯一的hash值,可用于文件内容相似度比较及匹配
应用:百度识图等类似场景
BitMap 位图算法
算法思想:将大量数据经过hash映射保存到一个bit数组中,大大减少了存储空间
用于处理大量数据的排序、查询以及去重
BloomFilter 布隆过滤器
用于高效检测数据元素是否在给定集合中存在,适用于大数据量。它是BitMap的扩展
应用:鉴别垃圾邮件
设计模式
创建型6种
单例模式
懒汉式/饿汉式/静态内部类
线程安全/线程不安全
线程安全
枚举
双重检验锁
工厂模式
简单工厂模式
通过传入不同的类型名称来生产不同的产品。 包括工厂(静态工厂方法)、抽象产品、具体产品三个角色
工厂方法模式
具体工厂生产具体产品。 在简单工厂基础上增加了“抽象工厂”角色
抽象工厂模式
包含创建一族产品的工厂方法,每一个方法对应一个产品族
建造者模式
复杂对象的组装与创建,包括抽象建造者、具体建造者、指挥者和复杂产品角色。 由指挥者决定产品组装的顺序
原型模式
对象克隆
深克隆
1、实现序列化接口Serializable 2、通过字节数组流和对象流进行克隆
浅克隆
Object的clone方法
结构型7种
适配器模式
对象适配器
适配器与适配者之间是关联关系。
类适配器
适配器与适配者之间是继承(或实现)关系。
双向适配器
在适配器中同时包含对目标类和适配者类的引用,适配者可以通过它调用目标类中的方法,目标类也可以通过它调用适配者类中的方法
缺省适配器
当不需要实现接口中所有方法时,可以使用一个抽象类去实现该接口,并提供其中方法的默认实现(空实现)。 使用时只需要继承抽象类,然后选择性的重写其中的方法即可。
在一些开源框架中应用广泛:如Spring MVC中典型的HandlerInterceptor接口和HandlerInterceptorAdapter抽象类
代理模式
1、给某个对象提供一个代理对象,并由代理对象来控制对目标对象的访问,外部客户端不直接对目标对象进行操作; 2、代理对象和原对象需要实现相同的接口,这样一来在任何使用目标对象的地方都可以使用代理对象来替代(里氏代换原则)
3、代理类中维护一个目标接口的引用
3、代理类中维护一个目标接口的引用
应用分类
JDK代理
静态代理
让代理类和目标类实现一样的接口;同时代理类中维护一个目标类对象的引用。 如Thread类(代理)和Runnable接口(目标),在Thread类中包含一个Runnable接口类型的引用
缺点: 1、目标类必须实现接口(因为生成的代理类会默认继承Proxy类,就不能再继承其他类了)
2、当改变目标类后,相应的代理类不能随之改变,必须自己修改代理类代码
2、当改变目标类后,相应的代理类不能随之改变,必须自己修改代理类代码
动态代理
它是静态代理的改进:当代理的接口发生改变时相应的代理对象也随之改变。 让代理类实现InvocationHandler接口,动态为目标接口生成代理类
缺点:目标类必须实现接口(因为生成的代理类会默认继承Proxy类,Java不支持多继承,因此就不能再继承其他类了)
cglib代理
使用字节码技术(asm框架)动态创建目标类的子类做为代理类,突破了JDK代理中目标类必须实现接口的限制
缺点:无法为final修饰的类或方法创建代理
装饰模式
1、通过创建一个包装类来扩展一个类的功能(比如添加新的方法),是对继承的一种替代方案,但能达到与继承一样的效果; 2、装饰类和原有类需要实现相同的接口,这样一来在任何使用原始对象的地方都可以使用装饰对象来替代;
3、装饰类中维护一个原有类型接口的引用
3、装饰类中维护一个原有类型接口的引用
特点:被装饰的对象一般会作为构造方法的参数传入装饰器类
与代理模式的区别: 装饰模式可以在不改变原有类的情况下对原有类进行功能扩展(增加方法);
而代理模式不会扩展原有类的功能(方法),只能控制在调用原有类的访问操作前后增加额外的操作,比如记录操作日志。
而代理模式不会扩展原有类的功能(方法),只能控制在调用原有类的访问操作前后增加额外的操作,比如记录操作日志。
外观模式
通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口, 使子系统与客户端的耦合度降低,且客户端调用非常方便。
外观模式并不会给系统增加任何新功能,它仅仅是简化调用接口
桥接模式
组合模式
组合多个对象形成树形结构,以表示具有“整体—部分”关系的层次结构。 组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。
主要角色:抽象构件Component、叶子构件Leaf(单个对象)、容器构件Composite(组合对象)
典型应用:Spring MVC中的HandlerMethodArgumentResolver(单个对象)与HandlerMethodArgumentResolverComposite(组合对象)
享元模式
行为型11种
策略模式
解释器模式
模板方法模式
定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
典型应用:HttpServlet中的service方法
观察者模式
组成:抽象目标(包含一个观察者对象集合)、具体目标、抽象观察者、具体观察者
应用:MVC(Model-View-Controller,当模型M(目标)中的数据改变时,通知相应视图V(观察者)做出改变)、Event Listener事件监听机制
策略模式
避免多个if...else分支判断语句
应用:SpringMVC中的HandlerMethodArgumentResolver,根据不同的参数或注解类型选择不同的参数解析器进行解析(即参数绑定)
迭代器模式
ava集合框架Iterator,包括抽象集合、具体集合、抽象迭代器、具体迭代器
责任链模式
请假审批流程
工作流
实际应用
Java EE中的Filter/FilterChain 过滤器/过滤器链
Spring MVC HandlerInterceptor拦截器
Struts2 拦截器/拦截器栈
命令模式
关灯
状态模式
访问者模式
中介者模式
备忘录模式
撤销操作
解释器模式
计算机操作系统
进程管理和调度
进程调度算法
短作业优先调度算法
先来先服务调度算法FCFS
最高优先数优先算法
短作业优先调度算法
基于时间片的轮转调度算法
同步机制
信号量
P、V原语操作
死锁
产生原因
竞争资源
竞争不可剥夺资源
竞争临时资源
进程推进顺序不当
四个必要条件
互斥条件
资源不能被共享,同一时间只能由一个进程使用
请求与保持条件
已经得到资源的进程可以再次申请新的资源
非剥夺条件
已经分配的资源不能从相应的进程中被强制地剥夺
循环等待条件
系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。
预防和避免方法(破坏四个必要条件)
银行家算法
银行家算法
内存管理
物理内存
虚拟内存
页面置换算法
LRU算法
文件系统
为用户提供操作文件的功能,包括创建、修改、删除等操作
用户界面
提供用户操作的界面
驱动程序
JVM
运行时数据区
数据
堆
这是被所有线程共享的一块内存区域,其中存放的是对象实例本身以及数组(数组的引用在栈中)。
划分
年轻代(Young Generation)
年轻代用来存放新创建的Java对象。对年轻代的垃圾回收称为“Minor GC”,采用的是复制清除算法、并行收集器。 为使JVM更好的管理堆内存中对象的分配及回收,年轻代又被分为三个区域:Eden、From Survivor、To Survivor。
注意:年轻代可用内存空间是Eden区+一个Survivor区,另一个Survivor区则保持空闲状态,其中Eden区与一个Survivor区大小比例可以通过 -XX:SurvivorRatio参数进行设置,默认为8,表示Eden区与一个Survivor区大小比值是8:1。
注意:年轻代可用内存空间是Eden区+一个Survivor区,另一个Survivor区则保持空闲状态,其中Eden区与一个Survivor区大小比例可以通过 -XX:SurvivorRatio参数进行设置,默认为8,表示Eden区与一个Survivor区大小比值是8:1。
老年代(Tenured Generation)
年轻代中经过多次垃圾回收没有回收掉的对象将被Copy到老年代,因此可以认为老年代中存放的都是生命周期较长的对象。对老年代中对象的垃圾回收称为“Full GC”,采用的是标记-清除算法。
永久代(Permanent Generation)
简称Perm Gen,位于方法区。用于存放Class、Interface的元数据,其大小跟项目的规模、类、方法的量有关。永久代的对象垃圾回收发生在Full GC过程中。
注:Java 8 已经去掉了永久代,用 MetaSpace 予以替代
注: 1)其中年轻代和年老代位于堆内存,堆内存会从JVM启动参数(如-Xmx:3G表示最大堆内存为3G)指定的内存中分配;
2)Perm Gen不位于堆内存中,而是属于方法区,由虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize 等参数调整其大小。
2)Perm Gen不位于堆内存中,而是属于方法区,由虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize 等参数调整其大小。
方法区
用于存储已经被虚拟机加载的类、常量、静态变量、编译器编译后的字节码等数据信息。 在方法区中还包含有运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。
需要注意的是,虽然方法区逻辑上属于堆内存,但是在JVM规范中并没有强制要求对该区域进行垃圾回收。
运行时常量池
属于方法区。用于存储数值型常量、
指令
程序计数器 Program Counter
也称作PC寄存器。它跟汇编语言中的程序计数器的功能在逻辑上是等同的,用来标识执行的是哪条指令。每个线程都有自己独立的程序计数器,并且相互之间是独立的。
在JVM规范中规定: 1、如果线程执行的是非native方法,则程序计数器中保存的是当前需要执行的指令的地址;
2、如果线程执行的是native方法,则程序计数器中的值是undefined。
2、如果线程执行的是native方法,则程序计数器中的值是undefined。
虚拟机栈
其中存放的是一个个的栈帧,每个栈帧对应一个被调用的方法,在栈帧中包括局部变量表(Local Variables)、操作数栈(Operand Stack)、指向当前方法所属的类的运行时常量池(运行时常量池的概念在方法区部分会谈到)的引用(Reference to runtime constant pool)以及方法返回地址(Return Address)。
本地方法栈
存放native方法信息,也就是由C/C++实现的方法
类加载机制
加载过程
包括以下几个步骤: 1、加载:类加载器从类的.class文件读取二进制流到内存,并为之创建java.lang.Class对象,作为访问Class文件中的各种数据的入口,如反射机制。
2、连接:把类的二进制数据存储到虚拟机的各个内存区域中。
① 验证:目的是确保当前Class文件中的内容符合JVM规范的要求,并且不会危害虚拟机自身安全。主要包括文件格式验证、元数据验证、字节码验证、符号引用验证。
② 准备:为静态变量分配内存并设置类变量的默认值(如int、float的默认值是0,引用类型默认值是null。特别地,对于final修饰的静态变量,如final static int a = 20则在此阶段结束a的值为20)。
③ 解析:将常量池中的符号引用替换为直接引用。
3、初始化:为静态变量赋予正确的初始值。如对于代码 static int i = 20,准备阶段结束后i的值是0,此阶段结束后i的值才变为20。
2、连接:把类的二进制数据存储到虚拟机的各个内存区域中。
① 验证:目的是确保当前Class文件中的内容符合JVM规范的要求,并且不会危害虚拟机自身安全。主要包括文件格式验证、元数据验证、字节码验证、符号引用验证。
② 准备:为静态变量分配内存并设置类变量的默认值(如int、float的默认值是0,引用类型默认值是null。特别地,对于final修饰的静态变量,如final static int a = 20则在此阶段结束a的值为20)。
③ 解析:将常量池中的符号引用替换为直接引用。
3、初始化:为静态变量赋予正确的初始值。如对于代码 static int i = 20,准备阶段结束后i的值是0,此阶段结束后i的值才变为20。
类加载器
BootstrapClassLoader
启动类加载器:负责加载java基础类,主要是 %JAVA_HOME/jre/lib/rt.jar中的类。它是用C++语言写的。 由JVM启动,然后初始化sun.misc.Launcher ,sun.misc.Launcher初始化Extension ClassLoader、App ClassLoader。
ExtensionClassLoader
ExtensionClassLoader
ExtensionClassLoader
扩展类加载器:主要负责加载%JAVA_HOME%/jre/lib/ext/*.jar中的类
AppClassLoader
应用程序类加载器:主要负责加载应用中classpath目录下的类。
自定义ClassLoader
自定义ClassLoader需要继承ClassLoader抽象类,重写findClass方法,这个方法定义了ClassLoader查找class的方式。
双亲委派模型
当加载一个类的时候会先委托给父类加载器去加载,当父类加载器无法加载的时候再尝试自己去加载,因此类的加载顺序是”自上而下“的。采用这种方式的好处: 1、主要是保证了安全性,避免用户自己编写的类动态替换Java的一些核心类,比如 java.lang.String;
2、避免了类的重复加载,因为在JVM中只有类名和加载类的ClassLoader都一样才认为是同一个类(即使是相同的class文件被不同的ClassLoader加载也被认为是不同的类)
2、避免了类的重复加载,因为在JVM中只有类名和加载类的ClassLoader都一样才认为是同一个类(即使是相同的class文件被不同的ClassLoader加载也被认为是不同的类)
由于双亲委托机制不是万能的,在某些情况下无法使用,因此可以通过重写类加载器的loadClass方法来避免双亲委托机制。
C垃圾回收策略
垃圾回收的目标区域
堆内存
方法区
主要包括对废弃的常量和无用的类进行回收
垃圾判断方法
引用计数法
每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时表示可以回收。
优缺点:此方法简单,但无法解决对象相互循环引用的问题。因此Java虚拟机未采用该种方法
可达性分析法
从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。即为不可达对象,所以会被判定为是 可以回收的对象。
在Java中,GC Roots包括: * 虚拟机栈(栈帧中的局部变量表)中引用的对象
* 方法区中类静态属性引用的对象
* 方法区中常量引用的对象
* 本地方法栈中JNI(即native方法)引用的对象
* 方法区中类静态属性引用的对象
* 方法区中常量引用的对象
* 本地方法栈中JNI(即native方法)引用的对象
垃圾回收算法
标记-清除算法
复制算法
标记-整理算法
分代收集
指的是针对不同分代的内存区域,采用不同的垃圾回收算法
年轻代一般采用复制算法,老年代则一般采用标记-整理算法
垃圾收集器
Serial收集器
ParNew收集器
Parallel收集器
Parallel Old 收集器
CMS收集器
G1收集器
数据库
关系型数据库
事务
SQL语法
数据查询语言DQL
数据查询语言,顾名思义就是从数据库中查询数据。包括select、where、order by、group by、having等动词。
数据定义语言DDL
数据定义语言,用于数据库表结构的相关操作,如创建表CREATE、删除表DROP、添加表索引等。
数据操作语言DML
通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。
数据操纵语言DCL
实现对数据库表数据的查询、增加、删除和修改操作,包括insert、update、delete
SQL执行顺序
SQL语句的语法书写顺序与其执行顺序有区别
语法顺序:SELECT -> DISTINCT -> FROM -> JOIN ON -> WHERE -> GROUP BY -> HAVING -> UNION -> ORDER BY 执行顺序:FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> UNION -> ORDER BY
常见关系型数据库
SQL Server、MySQL、Oracle等
数据库设计
完整性约束
三大范式
第一范式1NF:列的原子性
第二范式2NF:满足第一范式,必须要有主键列
第三范式3NF:满足第二范式,主外键引用
完整性约束
域(列)完整性:包括取值范围、类型、默认值、非空等
实体(行)完整性:主关键字既不能重复,也不能为空值
参照完整性:外键约束
用户自定义完整性:范围约束等
数据库模型
概念模型
E-R图,即Entity Relationship,实体关系。可以通过PowerDesigner进行建模
逻辑模型
关系:二维表
关系:二维表
物理模型
表结构,包括字段类型、长度、主外键、是否非空等信息
JDBC
Java DataBase Connectivity,即Java数据库连接,是用Java语言定义的统一的数据库操作规范,具体实现由各个数据库厂商完成。 位于java.sql包中,包含对数据库的各种操作相关接口和类
操作步骤
加载数据库驱动
导入对应数据库的驱动jar包
Class.forName(数据库驱动全类名) 加载驱动
获取连接对象
DriverManager.getConnection(url, userName, password)
获取语句对象Statement/PreparedStatement
进行数据操作(增、删、改、查)
释放资源:关闭结果集ResultSet、语句对象Statement、连接对象Connection
API
DriverManager类
用于获取数据库连接对象
DriverManager.getConnection(url, userName, password)
Connection接口
完成数据库操作的主要对象,其中包括了数据操作相关的方法
事务相关
设置手动提交事务: connection.setAutoCommit(false);
提交事务:connection.commit();
Statement接口
执行SQL语句
PreparedStatement接口
Statement的子接口
执行预编译SQL语句,防止SQL注入,及提高SQL执行效率
ResultSet接口
代表查询结果集
CallableStatement接口
处理存储过程的调用
PreparedStatement的子接口
处理存储过程的调用
DatabaseMetaData接口
包含对数据源的元数据(比如表结构、字段类型、函数、触发器、存储过程等)信息进行获取的API
通过Connection对象的getMetaDta()方法获取
ResultSetMetadata接口
包含对查询结果集中的元数据(比如字段类型、字段值)等信息进行获取的API
通过ResultSet对象的getMetadata()方法获取
数据库连接池
C3P0
DBCP
Druid
带有监控功能的数据库连接池,由阿里巴巴开源
HikariCP
“光”,号称是性能最好的数据库连接池
事务
ACID四大特性
原子性Atomicity
事务是原子性操作,要么都执行,要么都不执行
一致性Consistency
事务在执行前后数据完整性必须保持一致
隔离性Isolation
并发的事务之间是相互隔离的,事务内部的操作对于其他事务而言都是互不可见的。 如果不考虑隔离性,就可能发生脏读、不可重复读、幻读的问题
1)脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据无效。 2)不可重复读:在同一事务中,多次读取同一数据返回的结果不同。
3)幻读:一个事务读取了几行记录后,另一个事务插入一些记录。后来的查询中,前一个事务就会发现有些原来没有的记录。
3)幻读:一个事务读取了几行记录后,另一个事务插入一些记录。后来的查询中,前一个事务就会发现有些原来没有的记录。
持久性Durability
事务一旦完成提交,引起的数据改变将是永久性的,即使数据库发生故障也不应该对其有任何影响
游标
相当于一个指针,用于对数据库中数据进行遍历操作,通常以行为单位进行遍历
函数
CREATE FUNCTION func_name
(@[参数名] [类型],@[参数名] [类型], ......) RETURNS [返回值类型1], [返回值类型2]......
AS
BEGIN
.....
END
(@[参数名] [类型],@[参数名] [类型], ......) RETURNS [返回值类型1], [返回值类型2]......
AS
BEGIN
.....
END
有返回值,可以在select语句中使用
存储过程
CREATE PROCEDURE/PROC sp_name
@[参数名] [类型],@[参数名] [类型], ......
AS
BEGIN
.....
END
@[参数名] [类型],@[参数名] [类型], ......
AS
BEGIN
.....
END
ThreadPoolExcutor
触发器
类似于存储过程,唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行T-SQL语句时自动触发执行。
视图
基于 SQL 语句的结果集构成的表(虚拟表)
索引
普通索引
最基本的索引类型,没有唯一性之类的限制
唯一索引
不允许其中任何两行具有相同索引值的索引
主键索引
主键索引是唯一索引的特定类型,索引字段为主键
全文索引
按包含的字段数量
单一索引
单个字段作为索引
组合索引
多个字段一起作为一个索引
按数据结构
Btree索引
以B/B+树的数据结构存储,应用范围广
Hash索引
通过Hash算法计算索引位置,效率高,一次定位。但需要解决Hash冲突。不支持范围检索
按物理存储结构
聚集索引
数据和索引存放在同一文件中,以主键为索引存储数据
表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。
非聚集索引
数据和索引分开单独存放在不同的文件中,索引文件不存储数据,而是存储数据的地址
数据库表中记录的物理顺序与索引顺序可以不相同。一个表中可以包含多个非聚集索引
注意事项
1、适合索引的列是出现在where子句中的列,或者连接子句中指定的列
2、选择基数大的列作为索引,基数计算方式:COUNT(DISTINCT columnName) / COUNT(*)
2、组合索引遵循最左原则
如 对于索引 index(a,b,c),当查询条件包含列a时会使用索引
3、如果列类型是字符串,那一定要在查询条件中给数据加上引号,否则会进行隐式类型转换,不会使用索引
4、前导模糊查询不能命中索引,如 like '%abc'
SQL执行计划
MySQL
explain 命令,如 explain select * from tb_user
Oracle
explain plan 命令,如 explain plan for select * from tb_user
非关系型数据库
Redis、MongoDB等
分布式数据库
Apache HBase
Alibaba OceanBase
ElasticSearch
大数据
以云计算技术为基础,高效处理海量的数据分析
云计算
"云" 隐喻互联网,“云计算”其实就是使用互联网来接入存储或者运行在远程服务器端的应用、数据、或者服务,比如云服务器、云数据库等。
"云" 隐喻互联网,“云计算”其实就是使用互联网来接入存储或者运行在远程服务器端的应用、数据、或者服务,比如云服务器、云数据库等。
三种服务模式: IaaS:Infrastructure as a Service,基础设施即服务;
PaaS:Platform as a Service,平台即服务;
SaaS:Software as a Service,软件即服务
PaaS:Platform as a Service,平台即服务;
SaaS:Software as a Service,软件即服务
通俗而言: IaaS:一台服务器(硬件,一般可以带操作系统),其它软件需要自己安装;
PaaS:Java应用开发环境(JDK、Tomcat、MySQL等);
SaaS:一个已经开发完成可立即投入使用的网站或系统
PaaS:Java应用开发环境(JDK、Tomcat、MySQL等);
SaaS:一个已经开发完成可立即投入使用的网站或系统
OpenStack:IaaS层面的云计算平台
四种部署模式:私有云、公有云、混合云、社区云
云服务供应商:阿里云、腾讯云、谷歌云、亚马逊云等
开发平台
Hadoop、Spark、zookeeper
Hadoop、Spark、zookeeper
分布式
CAP理论
指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼
1、一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
2、可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
3、分区容错性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
2、可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
3、分区容错性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
幂等性
幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。
在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。
在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。
分布式计算
大运算量计算场景
MapReduce、Hadoop、Spark
分布式存储
大数据量存储场景
分布式数据库
Redis、MongoDB、HBase等
分布式文件系统Distributed File System,HDFS
一致性哈希Consist Hashing算法
用于分布式数据存储,使数据在各个存储节点上均匀分布
广泛应用于分布式缓存
分布式消息服务(消息队列)
ActiveMQ、RabbitMQ、RocketMQ、Kafka
可应用于高并发场景
分布式系统需要解决的问题
分布式事务
分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。
Session共享
ip hash负载均衡
使用缓存如redis保存Session
通过编写自己的HttpServletRequest实现替代Tomcat的Session管理,然后在Filter中使用
已有的解决方案:Spring Session + Redis
1、引入Spring Session相关jar包
2、在web.xml增加SpringSessionRepositoryFilter配置
3、引入Redis相关jar包,并增加相应的Spring Bean配置
服务器Session复制
1、修改conf/server.xml文件,打开注释:<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
2、在web.xml文件中加入配置:<distribute/>
软件架构
SOA
是一种粗粒度、松耦合服务架构,各服务间均需要基于ESB(Enterprise Service Bus,企业服务总线)进行消息通信
微服务
它是SOA的细粒度体现。将单体架构系统按照业务进行垂直切分成独立的服务,并独立部署、运行; 各服务间通常是基于RESTful API(同步)和消息队列(MQ,异步)进行通信。
框架工具
技术选型
Dubbo + Zookeeper
dubbo作为RPC调用框架,提供服务调用功能;zookeerper作为服务注册中心。
Spring Cloud
主要组件
Docker容器
主要解决的问题: 1、通过镜像的方式将应用和运行环境一起打包部署,能做到开发、测试、线上环境保持一致
2、作为一种新的虚拟化技术,降低了传统虚拟化技术带来的成本
2、作为一种新的虚拟化技术,降低了传统虚拟化技术带来的成本
Docker的安装
yum -y install docker
相关概念
镜像
镜像是一个只读的文件系统,包括应用文件、环境文件。它通常包含堆叠在彼此之上的联合分层文件系统。 一个Docker容器中往往有多个不同的镜像。镜像没有状态并且始终不会发生更改。
自定义镜像
两种方式
通过Dockerfile文件快速创建镜像
编写Dockerfile文件,然后执行docker build命令创建镜像
使用docker commit 命令从容器创建一个新的镜像
仓库
本地镜像仓库
远程镜像仓库
容器
Docker容器是Docker镜像的运行时实例。
Docker 容器中包含
Docker 镜像
执行环境
一组标准指令
此概念借用自船运集装箱,它们定义了在全球运送货物的标准。Docker 定义了交付软件的标准。
Docker 容器中包含
Docker 镜像
执行环境
一组标准指令
此概念借用自船运集装箱,它们定义了在全球运送货物的标准。Docker 定义了交付软件的标准。
常用命令
docker login [OPTIONS] [SERVER]
录到一个Docker镜像仓库
docker search [OPTIONS] TERM
搜索远程仓库镜像,如docker search centos表示搜索与centos相关的镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
从远程仓库拉取镜像到本地,默认tag(版本号)是latest
OPTIONS: -a :拉取所有 tagged 镜像
如:docker pull centos表示拉取最新的centos镜像到本地
docker rmi [OPTIONS] 镜像ID/仓库名:镜像名
删除本地仓库中的镜像
PTIONS: -f:强制删除
docker run [OPTIONS] [镜像ID/仓库名:镜像名]
包含两步操作: 1、将镜像放到容器中
2、启动容器,相当于docker start
2、启动容器,相当于docker start
OPTIONS: 1)-i:以交互模式运行,通常与 -t 一起使用简写为-it
2)-d:以后台程序运行,并返回容器ID
3)-p:指定端口映射,宿主机端口:容器端口
4)--name:为容器指定一个名称
2)-d:以后台程序运行,并返回容器ID
3)-p:指定端口映射,宿主机端口:容器端口
4)--name:为容器指定一个名称
docker run -it 镜像ID/仓库名:镜像名 /bin/bash可以进入docker容器中的命令行模式 exit 或 Ctrl+D 命令退出并销毁当前docker容器
Ctrl+P,Ctrl+Q也可退出,且不会销毁docker容器
Ctrl+P,Ctrl+Q也可退出,且不会销毁docker容器
端口映射
命令格式: docker run -p 宿主机端口:容器端口
docker run -P
docker run -P
-p:指定映射端口 -P:随机映射端口
1)使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口; 2)-p则可以指定要映射的IP和端口,但是在一个指定端口上只可以绑定一个容器。
支持的格式有 hostPort:containerPort、ip:hostPort:containerPort、 ip::containerPort。
支持的格式有 hostPort:containerPort、ip:hostPort:containerPort、 ip::containerPort。
如:docker run -p 80:80 --name mynginx -p 80:80:将容器的80端口映射到主机的80端口
--name mynginx:将容器命名为mynginx
--name mynginx:将容器命名为mynginx
如创建并启动mysql容器: docker run --name mysql -p 3306:3306 -v /var/lib/mysql/:/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD=123 -d mysql:5.7
其中 --name 指定容器以mysql命名, -p 指定端口映射,-v 指定挂载宿主机目录,-e 指定环境变量,-d 指定镜像
其中 --name 指定容器以mysql命名, -p 指定端口映射,-v 指定挂载宿主机目录,-e 指定环境变量,-d 指定镜像
docker start <容器名或ID>
启动容器
docker stop <容器名或ID>
停止容器运行
docker restart <容器名或ID>
重启容器,相当于stop和start组合命令
docker rm <容器名或ID>
删除指定的容器,该容器必须已经停止运行
ocker commit <容器名或ID>
使用容器创建镜像
docker push [仓库名:镜像名]
将本地镜像推送至远程仓库
docker ps [OPTIONS]
查看容器
如: docker ps:查看正在运行的容器
docker ps -a:查看所有的容器,包括已经停止的
docker ps -a:查看所有的容器,包括已经停止的
docker images [OPTIONS] [REPOSITORY[:TAG]]
查看本地有哪些镜像
docker logs <容器名或ID>
查看容器日志
docker port <容器名或ID>
查看容器端口映射情况
docker exec -it <容器名或ID> bash
以交互模式进入正在运行的容器,输入 exit 则退出
Jenkins 持续集成工具
Linux基础
目录结构
常用操作命令
帮助命令(man、help、info)
命令终端xshell/SecureCRT/putty
vi/vim编辑器
:w (保存)、:q(退出)、:wq(保存并退出),加!号表示强制命令,如:q!表示强制退出;:set nu(显示行号)
文件和目录操作
cd(切换目录)、ls(查看目录)、pwd(查看当前工作目录)、cp(拷贝文件或目录)、mv(移动、重命名文件或目录)、chmod(改变文件或目录访问权限) rm(删除文件或目录)、rmdir(删除空目录)、touch(创建文件)、mkdir(创建目录)、查看文件(cat、more、less、tail)、tar(压缩、解压文件)等
用户和用户组
useradd(添加一个普通用户)、passwd(修改用户登录密码)、chown(更改文件拥有者)
其它
wget(文件下载,用法:wget [参数] URL)
top(性能监控)、ps(查看进程)
文件搜索:find(支持正则)、whereis、which
文本搜索:grep(Global Regular Expression Print,支持正则表达式的全局文本搜索工具)
ifconfig(类似于Windows的ipconfig,获取及修改网络接口配置信息)
文件编辑器
vi/vim
文件传输
sftp命令
常用命令
sftp <-oPort=port> <user>@<host>:连接sftp服务器,其中port默认为22,user默认当前用户
put:将本地文件上传到远程服务器
get:将文件从远程服务器下载到本地
cd、pwd、ls、mkdir:远程服务器操作,与Linux系统命令一致; lcd、lpwd、lls、lmkdir:与远程操作对应的本地操作命令
建立sftp连接后可通过在终端输入 help 命令查看其它操作命令
ftp/sftp客户端软件xftp
可视化文件操作
软件安装
自己下载安装包
yum install
数据结构
线性表
顺序表
数组
栈
栈,是限定仅在表尾进行插入或删除操作的线性表。后进先出(LIFO)。
队列
链队列
循环队列
双端队列
Java中的Deque接口
链表
单向链表
循环链表
双向链表
树
二叉树
分类
完全二叉树
堆
堆总是满足下列性质: 1、是一棵完全二叉树;
2、任意结点的值总是不大于或不小于其父结点的值。
将根结点值最大的堆叫做最大堆或大根堆,根结点值最小的堆叫做最小堆或小根堆。
2、任意结点的值总是不大于或不小于其父结点的值。
将根结点值最大的堆叫做最大堆或大根堆,根结点值最小的堆叫做最小堆或小根堆。
满二叉树
哈夫曼编码
用于二进制表示字符串
哈夫曼树
二叉搜索树
平衡二叉树
AVL树
红黑树
遍历
先序遍历(根->左->右)
中序遍历(左->根->右)
后序遍历(左->右->根)
层序遍历
多叉树
B树
查找节点
插入节点
删除节点
左旋
B+树
查找节点
插入节点
删除节点
图
分类
有向图
无向图
表示方法
邻接矩阵
邻接表
遍历
深度优先搜索
广度优先搜索
哈希表
哈希函数
直接定址法
数字分析法
平方取中法
折叠法
除留余数法
随机数法
处理哈希冲突
开放定址法
再哈希法
链地址法
建立一个公共溢出区
计算机网络
分类
按网络范围
局域网LAN
定义:网络为一个单位所拥有,且地理范围和站点数目均有限。 特点:距离短、延迟小、数据速率高、传输可靠。
LAN一般都属于广播性网络。
目前常用的LAN类型为Ethernet(以太网)。
LAN一般都属于广播性网络。
目前常用的LAN类型为Ethernet(以太网)。
广域网WAN
在大范围区域内提供数据通信服务,主要用于互连局域网。
按网络使用者
公用网
专用网
计算机网络交换类型
电路交换
通信前需要预先在通信双方间建立一条传输通道,通信双方在通信过程中将一直该通道,直到通信结束。
具有实时性强,时延小等特点
报文交换
以报文为数据交换的单位,报文中携带有目标地址、源地址、数据等信息,由交换结点采用存储转发的方式进行数据传输。 不需要为通信双方预先建立一条专用的通信线路。
分组交换
在发送端将较长的报文分割成较短、固定长度的数据段,在每个数据段前加上首部构成分组。 以分组作为数据传输的基本单元,通过存储转发的方式进行传输。
网络组件
终端设备
在以人为本的网络和通信网络间提供接口。
包括手机、台式电脑、笔记本电脑、平板电脑、打印机、IP电话、网真端点等
中间设备
为主机提供网络连接并连接多个网络形成网际网络。
包括路由器、无线路由器、多层交换机、LAN交换机、防火墙设备
网络介质
为消息提供从源传输到目标的通道。
包括LAN媒体、WAN媒体、无线介质
分层模型
OSI七层模型
从上到下依次是:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
TCP/IP四层模型
在OSI模型基础上将表示层、会话层合并到了应用层
TCP/IP协议族
应用层
提供应用程序网络接口
DNS、FTP、HTTP、POP3、SMTP、Telnet、RPC等
传输层
提供端到端的通信
TCP
传输数据前需要先建立连接。三次握手,四次挥手
UDP
不需要建立连接,不能保证数据传输可靠性
网络层
寻址和路由
IP、ICMP(ping命令)、ARP(地址解析协议,IP地址解析为物理地址)、RARP(逆地址解析协议,将物理地址解析IP地址)等
网络接口层
提供与底层网络的接口
IP地址
是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址(MAC地址)的差异
IPv4和IPv6
IPv4:32位
IPv6:128位
子网划分
将一个网络划分为更小的网络,比如将公司的网络根据不同部门进行划分
IP划分
子网掩码
A类
B类
C类
D类
E类
子网数
子网中的主机数
其它
TCP的几种通信方式
单工通信
通信双方中发送方与接收方分工明确,只能在由发送方向接收方的单一固定方向上传送数据
半双工通信
通信双方都既可以是发送方,也可以是接收方,它们之间可以相互传送数据,但某一时刻则只能向一个方向传送数据,如HTTP
全双工通信
通信双方都既可以是发送方,也可以是接收方,且双方可以同时在两个方向上传送数据,如WebSocket
计算机组成原理
组成部分
存储器
内存(主存)
RAM、ROM
外存(辅存)
硬盘、软盘、U盘等
高速缓存
运算器
算术运算
逻辑运算
与、或、非、异或
控制器
输入输出(IO)设备
鼠标、键盘、打印机等
数据表示
进制
二进制
ThreadPoolExcutor
定点数与浮点数
八进制
十进制
十六进制
0 条评论
下一页