JavaEE知识体系
2023-11-25 21:27:05 0 举报
AI智能生成
为你推荐
查看更多
JavaEE,全称Java Platform, Enterprise Edition,是用于开发企业级应用的一种主流的、开源的、跨平台的Java技术标准。它包括了一系列的服务、API和协议,如Servlet、JSP、EJB、JMS等,用于构建分布式、多层的、可扩展的企业级应用。JavaEE的主要目标是简化企业级应用的开发,提高开发效率,降低开发成本。JavaEE的知识体系主要包括Java语言基础、Java Web开发、Java EE服务、Java EE架构和设计模式等方面。
作者其他创作
大纲/内容
使用软件在不同操作系统中,模拟相同的环境。
JVM(Java Virtual MachineJava)JAVA虚拟机
JRE(Java Runtime Environment)Java运行环境,包含了jvm和Java类库
“我的电脑”--属性--高级属性--环境变量:找到path变量:将jdk中bin文件夹的的路径复制到path中
环境变量搭建
JDK:(Java Development Kit)Java开发工具和类库 ,包含了jre
JavaSE:Java Platform Standard Edition(Java平台标准版) CoreJava
JavaEE:Java Platform Enterprise Edition(Java平台企业版)
JavaME:Java Platform Micro Edtion(Java平台微小版)
名词解释
机器语言
汇编语言
高级语言
计算机语言发展
简单
win版JVM
mac版JVM
lin版JVM
一次 编写随处运行
java程序
跨平台性
封装
继承
多态
面向对象(Object Oriented)OO
由于它支持TCP/IP协议,使得用户可以通过浏览器访问到Internet上的各种动态对象。并且在网络上用户可以交互式地进行各种动作,而多线程技术的引入使得这种交互式操作更为容易
交互式特性,多线程机制
Java的强类型机制保证任何数据必须有明确的数据类型;Java提供异常处理机制,能够统一处理异常事件;
健壮性
提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、 ServerSocket等;Java的RMI(远程方法调用)机制是开发分布式应用的重要手段;
分布式
java语言采用了自动垃圾回收机制进行内存的管理。在c++语言中,需要程序员自己对内存进行及时的释放,不然就存在内存泄露等不可预知的问题。但是在java有一个垃圾回收器,可以对程序中产生的对象进行跟踪,知道哪些对象已经是无用的了,对无用的内存进行释放,为程序员大大减少了内存管理方面的问题
动态内存管理机制
Java语言在安全性方面引入了实时内存分配及布局来防止程序员直接修改物理内存布局;通过字节代码验证器对字节代码的检验,以防止网络病毒及其它非法代码侵入。
安全性
Java语言的特点
概述
Java虚拟机默认分配的物理内存容量是计算机1/8
内存即是一块瞬时状态的存储空间,有一定的容量
计算机内存中的一块存储空间,是存储数据的基本单位
数据类型
变量名
值
组成部分
数据类型 变量名;变量名=值;
先声明,再赋值
数据类型 变量名=值;
声明并赋值
数据类型 变量名1=值1,变量名2=值2;
多个同类型的变量同时声明并赋值
声明方式
类名:由一个或多个单词组成,每个单词首字母大写
包名:全小写,采用域名倒置的规则
变量名和函数名:由一个或多个单词组成,首单词首字母小写,拼接词首字母大写
常量:全大写,多个单词用_ 连接
//单行注释
/* 多行注释*/
(生成外部文档:javadoc -d .HelloWorld.java)
/**文档注释 */
其他
如果用了public class进行声明,则类名称必须与文件名称完全一致
命名规则
可以由:字母、数字、_. $组成,但不能以数字开头
不能与关键字、保留字重名
java中严格区分大小写
注意:在起名字的时,为了提高阅读性,要尽量有意义
在一个.java文件中可以有多个Java类;最多只能有一个public类
语言基础
定义在函数内部的变量
作用范围仅限函数内部
可与全局变量同名,局部变量优先
多个变量在重合的作用范围内,不可出现重名
局部变量
在方法外类内声明的变量
全局变量(成员变量)
变量
默认值0
-128~127
1个字节
byte
-2^15 ~ 2^15-1
2个字节
short
-2^31 ~ 2^31-1
4个字节
int
追加L
-2^63~2^63-1
8个字节
long
整数默认:int
追加F
默认值0.0
-3.403E38~3.403E38
float
-1.798E308~1.798E308
double
小数默认double
默认值:false
只能存true/false
boolean
布尔
默认空字符(\\u0000)
\\'
\\\"
\\\\输出反斜线
\\t制表符
\换行
转义字符\\
char
字符
基本数据类型
String
字符串
对象
枚举类
注解
数组
引用数据类型
大范围整数向小范围整数转换
整数向浮点型转换
字符向整型转换
两种类型相互兼容,目标类型大于源类型
自动类型转换
小范围整数向大范围整数转换
浮点型向整型转换
整型向字符转换
两种类型相互兼容,目标类型小于源类型
整数长度足够,数据完整
整数长度不够,数据截断
会造成精度的损失
小数强转整数,数据截断
保证正整数转换成字符,可以正常显示
字符整数互转,数据完整
boolean不可与其他类型转换
+= 隐式的将加操作的结果类型强制转换为持有结果的类型
转换规则
强制类型转换
类型的转换
+-*/%++--
算数运算符
= += -= *= /= %=
赋值元素安抚
> < >= <= == !=
关系运算符
&& || !
逻辑运算符
布尔表达式?结果1:结果2
三元运算符
位运算符
运算符
常量
概念:根据已知条件进行落尽判断,满意条件后执行相应的操作
基本if结构
if else结构
相互排斥,有一个选项为true,其他选择不再执行,适用于区间判断
多重if结构
可以在一个选择结构当中,嵌套另一个选择结构,语法正确、格式正确的情况下,可以任意组合
嵌套if结构
选择结构
可判断变量类型:byte,short,int,char,String(JDK7+),枚举类
case被选中后,不会主动退出这个结构,需手工追加break,跳出整个switch。
dafalut表示没有匹配的case
switch条件分支
概念:通过某个条件,重复的执行一段逻辑代码
作用:减少代码的重复性
结构:初始部分;循环条件:循环操作;迭代部分
首次没有入口条件,先执行、再判断,适用于循环次数不明确
dowhile循环
先判断、再执行;适用于循环条件明确
while循环
先判断,再执行,适用于循环次数明确
for循环
循环结构
在一个完整的循环结构中,嵌套另一个循环结构
外层控制行数,内层控制列数
嵌套循环
中止、跳出:switch分支结构、循环结构
通过添加标记,可以结束任意层的循环
break
结束本次循环,进入下一次
continue
流程控制语句
概念:实现特定功能的一段代码,可反复使用。
定义的位置:定义在类的内部,与main函数并列
函数调用时,优先执行函数内部代码,结束后,返回到函数调用处,继续向下执行
函数的调用:函数名();
经验:一个函数制作一件事(单一职能原则)
定义返回值类型:基本数据类型、引用数据类型、void
return value; //应用在具有返回值类型的函数中,函数结束时,伴有返回值,返回到函数调用处
return; //应用在返回值类型为void的函数中,遇到return时,直接结束函数
返回值与返回值类型
实际再发中,递归可以解决一些具有既定规律的问题。
当需要解决的问题可以拆分成若干个小问题,大问题、小问题的解决方法相同,有特定的规律,函数自己调用自己。
设置有效的出口条件,避免无穷递归。
递归
在一个类中定义多个相同名称的方法
概念
方法名称相同
参数列表不同
与访问修饰符、返回值无关
要求
屏蔽用户的使用差异,方便
好处
重载
形式参数
实际参数
在参数列表中只能出现一个
必须出现在参数列表的最后
方法名(参数类型... bianliangming )
可当作数组使用
可变长参数
函数
概念:一组连续的存储空间,存储多个相同数据类型的值
先声明,再分配空间
需要声明数组长度
int [] a = new int[5];
声明并分配空间
如果声明时赋值,则不能再声明数组长度
需要写在同一行
创建
通过下标访问,语法:数组名[下标]
下标的范围:0 ~ 数组的长度-
下标越界异常ArrayIndexOutOfBoundsException
访问
创建长度大于原数组的新数组。
将原数组中的数据依次复制到新数组当中。
数组一旦创建长度不可改变,只能通过地址引用到新数组
思路:
手工循环完成逐一的赋值
三种方法
扩容
固定值与其他值比较大小,互换位置
选择排序
相邻的两个值比较大小,互换位置
冒泡排序
java.util.Arrays.sort(数组名);默认升序
JDK排序
排序
创建语法:数据类型[][] 数组名 = new 数据类型[高维下标][低维下标]
访问元素的方式:数组名[高维下标][低维下标]
第一个下标控制行,第二下标控制列
高维数组中存储的是一维数组地址
二维数组
程序:程序是为了模拟现实世界,解决现实问题而使用计算机语言编写的指令集合
对象:一切客观存在的事物都是对象,万物皆对象。对象一定具有自己的特征和行为
类:定义了对象应具有的特征和行为,类是对象的模板。
对象实体:拥有多个特征和行为的实体,对象是类的实例。
每个类都有一个默认的无参构造器,用于创建对象;
没有返回值,方法不加返回值类型,方法名与类名相同
开辟内存空间;
如果没有初始值,全部都是默认值
初始化属性;
执行构造方法中的代码块
将内存地址赋值给引用变量
执行过程
默认提供了无参构造方法
一旦定义了有参构造方法,无参构造方法就消失了;除非手动再次定义
构造方法(构造器)
定义在类内、方法外
在类内处处可用;
有默认值
局部变量可与属性同名,此时局部变量优先级高;
field:字段、全局变量、属性、实例成员属性
类的抽取:在一组相同或类似的对象中,抽取出共性的特征和行为,保留所关注的部分。
面向对象
封装反映了事物的相对独立性
尽可能隐藏对象的内部实现细节,控制对象的修改及访问的权限
在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装、隐藏起来的方式
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
由private修饰为私有的属性 + 提供set/get公共的访问方法
封装之后,不可直接访问属性,仅可通过get/set公共访问进行访问,可以在方法内部对数据进行过滤
子主题
private
defalut
protected
public
访问修饰符
程序中的继承,是类与类之间特征和行为的一种赠与或获得
构成继承关系的要求:两个类之间必须满足\"is a\"的关系
选择父类:功能越精细、重合点越多,越接近直接父类
父类的抽象:在一组相同或类似的类中,抽取出共性的特征和行为,定义在父类中,实现重用
定义子类时:class 子类 extends 父类
产生继承关系后,子类可以使用父类中的属性和方法,也可以定义子类独有的属性和方法
Java为单继承,一个类只能有一个直接父类,但可以多级继承,属性和方法逐级叠加
不可继承:父类构造方法、父类中由private修饰的成员、父子类不在同一个包时由default修饰的成员
父类提供的方法无法满足子类需求、可在子类中定义相同的方法进行覆盖
方法覆盖后,优先执行子类覆盖后的版本
执行
方法的覆盖(重写)
指这个类的当前实例
第一种用法:调用当前实体的属性和方法
必须定义在构造方法中的第一句话
this调用构造方法的语句只能出现一次
this(),this(参数列表)--调用无参、有参构造,按参数的类型、个数、顺序匹配对应的有参构造;
两种用法
this关键字
代表父类
this调用构造方法的语句只能出现一次;
必须定义在构造方法中的第一句话;
使用\" super. \"的形式在子类中访问父类的属性和方法(解决属性遮蔽、方法覆盖调用
使用\" super() \"、\" super(实参) \"在子类构造方法的首行,调用父类的构造方法,如果没有显示书写,则默认调用父类无参构造super()
同一个子类的构造方法中,super()、this()不可同时存在
构建子类对象时,先构建父类对象
super关键字
概念:父类引用指向子类对象,从而产生多种形态
父类引用仅可调用父类中所声明的属性和方法,不可调用子类独有的属性和方法
实际运行过程中,依旧遵循覆盖原则,如果子类覆盖了父类中的方法,则执行子类中覆盖后的方法,否则执行父类中的方法
使用父类作为方法形参的数据类型,使方法参数的类型更为宽泛
使用父类作为方法返回值实现多态,使方法可以返回不同的子类对象
两种应用场景
任何一个子类都可以自动类型提升,提升为父类类型(宽泛的类型)
可替换性(substitutability可扩充性(extensibility)接口性(interface-ability)灵活性(flexibility)
好处:达到统一编码,降低耦合度,减少冗余代码
三大特性
概念:似是而非的,像却又不是,具备某种对象的特征,但不完整
子类继承抽象类后,必须覆盖父类中所有的抽象方法,否则,子类还是抽象类。
不一定有抽象方法,但有抽象方法的类一定是抽象类。
抽象类:不能new对象,但可以声明引用
抽象方法:只有方法声明,没有方法实现。(必须包含在抽象类中)
与private、final、static不能同时使用
abstract
概念:static可以修饰属性、方法和代码块,即为静态属性(类属性)、静态方法(类方法),静态代码块
静态成员是全类所有对象共享的额成员,全类中只有一份,不因创建多个对象而产生多份,不必创建对象
可直接通过类名访问,也支持通过对象访问
静态成员(静态属性)
允许直接访问静态成员,不能直接访问实例成员
因为this或super都代表对象,都需要先创建对象
不允许使用this、super关键字
可被继承
不能覆盖,没有多态
定义工具类里,方法建议用static
静态方法
类加载的执行环节,执行地位和静态属性一致,只有首次加载类时,需要执行,仅一次
类内可以定义多个静态代码块,定义序即执行序
只能使用静态属性
加载时机
静态代码块
执行:每当创建一次对象,就优先于构造器执行一次
类内可以定义多个动态代码块,定义序即执行序
可以使用静态属性和非静态属性;
动态代码块
当前类创建对象
当前子类创建对象
调用当前类的静态属性、方法
Class.forName(\"全类名\")(反射技术)
时机
JVM首次使用某个类时,通过CLASSPATH查找该类的.class文件,并将.class文件中对类的描述信息加载到内存中,进行保存
类加载
static
final表示不可改变的
这个属性称为常量
一般建义全大写字母表示,多个单词之间用下划线连接
在定义时必须初始化赋值;
修饰属性
不能被重写
修饰方法
不能被继承
修饰类
final
三个关键字
概念:再一个类的内部再定义一个完整地类
Outer$Inner.class
编译之后可生成独立的字节码文件
可为外部类提供必要的内部功能组件。
特点
在类的内部定义,与实量、实例方法同级别的类。
Outer out=new Outer();Inner in=out.new inner();
外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象。
不能定义静态成员
成员内部类
只能直接访问外部类的静态成员(实例成员需实例化外部类对象)
静态内部类
没有类名的局部内部类(一切特征都与局部内部类相同)
必须继承一个父类或者实现一个接囗
优点:减少代码量。
缺点:可读性较差
匿名内部类
局部内部类
内部类
object类型可以存储任何对象
应用:通常用于判断两个引用中实际存储对象类型是否一致。
返回引用中存储的实际对象类型。
getClass方法 public final Class<?> getClass()
哈希算法根据对象的地址或字符串或数字计算出来的int类型的数值。
返回该对象的十进制的哈希码值。
hash Code方法 public int hashCode()
返回该对象的字符串表示(表现形式)。
toString()方法 public string tostring()
equals()方法覆盖步骤:比较两个引用是否指向同一个对象。判断obj是否为null判断两个引用指向的实际对象类型强制类型转换。依次比较各个属性值是否相同。
equals()方法 public boolean equals(object obj)
手动回收机制:使用 System.gcQ;通知JWM执行垃圾回收
finaliz方法
方法
Object类
基本数据类型所对应的引用数据类型
包含
byteValueO+以byte形式返回指定的数值。doubleValue o以 doubl形式返回指定的数值。float Value O以1at形式返回指定的数值。int Value o以int形式返回指定的数值。long value o以1ong形式返回指定的数值。short Value o以 short形式返回指定的数值。
由其父类Number提供6个共性方法,常用作自动拆箱
parseXXX() 将字符串转换为包装类
通过基本类型构建
通过String构建
注意:在使用字符串构建数字型包装类型对象时,要保证类型的兼容,否则产生NumberFormatException。
每种子类的valueOf()将数值转为基本类型
转型方法
包装类转为基本类型
拆箱
基本类型装为包装类
装箱
JDK5之后,提供自动装箱、拆箱,简化使用包装类的编程过程
自动装箱时,会调用valueOf方法,Byte、Short、Integer、Long,
四种整数包装类型都提供了对应的cache缓冲区,将常用的256个数字提 前创建对象并保存在数组中,实现复用。
装箱拆箱
包装类
字符串是常量,创建之后不可改变。
字符串字面值存储在字符串池中,可以共享
从左向右查询,查询子串首次出现的下标,如果查不到,则返回-1;local默认为0;
常用方法
可变字符串
JDK5发布,线程不安全,运行效率快
StringBuilder
JDK1.0发布,线程安全,运行效率慢
StringBuffer
作用:精确计算浮点数
包:Java.math.BigDecimal
BigDecimal(int)
BigDecimal(double)
BigDecimal(long)
BigDecimal(String)
构造函数
add(BigDecimal)
subtract(BigDecimal)
multiply(BigDecimal)
参数scal:指定精确到小数点后几位。
取值为 BigDecima1. ROUND HALF UP。
divide(BigDecimal)
计算
toString()
floatValue()
doubleValue()
longValue()
intValue()
转化
NumberFormat类的format()方法可以使用BigDecimal对象作为其参数,可以利用BigDecimal对超出16位有效数字的货币值,百分值,以及一般数值进行格式化控制
格式化
当double必须用作BigDecimal的源时,请注意,此构造方法提供了一个准确转换;它不提供与以下操作相同的结果:先使用Double.toString(double)方法,然后使用BigDecimal(String)构造方法,将double转换为String。要获取该结果,请使用static valueOf(double)方法。
注意事项
BigDecima
常用类
接口是一种能力和约定
特殊的抽象类,用interface修饰
没有构造方法,不能创建对象
其中的属性都是公开静态常量,默认用publicstaticfinal修饰
其中的方法都是公开抽象方法,默认用public static
规范:任何类在实现接口时,必须覆盖接口中所有的抽象方法,否则此类还是抽象类
Java单继承,当父类的方法种类无法满足子类需求时,可实现接口来扩充子类的能力
关系用implements表示
可以多实现,为一个类扩充多种能力
实现抽象方法时,访问修饰符必须是public
实现类
接口应用同父类引用一样,可以声明为引用,指向实现类对象,仅可调用接口中所声明的方法,无法调用实现类独有方法
接口引用指向实现类对象时,需要调用实现类独有方法,可强转回实现类本身类型,进行调用
接口回调
接口
对象的容器,存储对象的对象,可代替数组
集合是容器的工具,定义个对多个对象进行操作的常用方法
位置:java.util.*
数组声明了它容纳的元素的类型,而集合可以不声明。
数组的长度是固定的,集合长度是可以改变的。
数组的存放的类型只能是一种(基本类型/引用类型),集合存放的类型可以不是一种(不加泛型时添加的类型是Object)。集合只能存应用类型
集合以接口和类的形式存在,具有封装,继承和多态等类的特性,通过简单的方法和属性调用即可实现各种复杂的操作,大大提高软件的开发效率。
与数组区别
泛型
数组结构
树结构
链表结构
数据结构
数组结构存储,
查询快,增删慢。
JDK1.2发布,运行效率快,线程不安全
每次扩容只会增加50%
只保证在修改数据时不会有并发问题;但在使用迭代器时任然会报错,迭代器在获取数据时会检查集合是否被修改过
多线程环境下,Collections 的 synchronized(List) 方法将其转换成线程安全的容器后再使用
初始容量10
ArrayList
链表结构存储,
查询慢,增删快
线程不安全
其节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素
比ArrayList更占内存
LinkedList
数组结构存储
查询快 ,增删慢
JDK1.0发布,运行效率慢,线程安全
每次扩容增加1倍
Vector
有序、有下标、元素可以重复
Object get(int index):获得指定位置的元素
实现类独有方法(都与下标相关)
List
基于HashCode实现元素不重复
当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入。
存入自定义必须实现重写类的hashset和equals方法,指定比较策略
无顺序性
使用的底层结构是hashmap
底层实现是哈希表和链表(linkedhashmap)
保持了HashSet的速度,还能按照插入元素的顺序维持元素顺序(有序)
LinkedHashSet
HashSet父类
基于排列顺序实现元素不重复。
有顺序性
实现了SortedSet接口,对集合元素自动排序。
底层实现是红黑树(自平衡二叉树)
通过重写CompareTo方法确定是否为重复元素。
存入自定义必须实现Comparable接口,指定排序规则。
TreeSet
SortedSet接口
无序、无下标、元素不可重复
无实现类独有方法
Set
ArrayBlockingQueue
LinkedBlockingQueue
BlockingQueue
双端队列
Dqueue
都是返回第一个元素
相同点
如果没有元素poll()返回nullremove()会抛出异常NoSuchElementException
不同点
poll()和 remove()区别
Queue
Collection父接口:代表一组任意的对象,无序、无下标
返回集合的长度
int size()
判断是否为空
Boolean isEmpty()
判断是否包含
Boolean contains()
Iterator<泛型>(迭代器)
将集合转换为数组
Object[] toArray()
add(对象类型)
remove(对象),建议先查后删,用迭代器遍历查询到后,再执行删除
是否包含另一个集合
boole containsAll
移除所有元素
removeAll
需要实现Predicate接口
removeif(Predicate filter)
父类方法(10种)
Collection体系集合
JDK1.2版本提供,线程不安全,运行效率快
允许用null作为Key或Value
HashMap底层是链表数组
有序,保存了记录的插入顺序
非线程安全
LinkedHashMap
重写hashset和equals方法
实现comparable接口
a.compare(b)
实现compareto接口
对象可比较
哪些对象可以存入
初始容量16
每次扩容增加75%
HashMap接口【重点】
JDK1.0版本提供,线程安全,运行效率慢
不允许用null作为Key或Value
Key和Value都是String类型
setProperty();存值
getProperty();读取值
常用于配置文件的读取
Properties
可以对Key做自动排序
TreeMap
SortedMap接口
Hashtable
父接口特点:存储一对数据(Key-Value),无序、无下标,键不可重复(重复会覆盖),值可重复
返回所有的键值集合
Set<k> keySet()
返回所有的值的集合
Collection<v> values()
返回所有键值对集合
entrySet()
根据键的值存入值,如果键存在会覆盖值
去除对应的值
Object get(Object key)
Map接口
只能单向遍历
迭代器允许调用者在迭代过程中移除元素。
只能遍历List
可以双向遍历List
对Iterator的扩展
ListIterator
(Iterator)
迭代器
集合
概念:程序在运行过程中出现的特殊情况
Error:JVM、硬件、执行逻辑错误,不能手动处理
RuntimeException:运行时异常,可处理,可不处理
CheckedException:受查异常,必须处理
Exception:程序在运行和配置过程中产生的问题,可处理
Throwable:可抛出的,一切错误或异常的父类,位于java.lang包中
分类
自动抛出异常:当程序在运行时遇到不符合规范的代码或结果时,会产生异常
手动抛出异常:throw new 异常类型(\"实际参数\");
结果:相当于遇到return语句,导致程序因异常而终止
产生
按照方法的调用链反向传递,如果始终没有处理异常,最终会由JVM进行默认处理(打印堆栈跟踪信息)
受查异常:throws 异常类型 声明异常,修饰在方法参数列表后端
由于运行时异常,是可处理可不处理,所以无需声明异常
传递
try{}catch(Exception e){}
try{}catch(){}finally{}
注意:多重catch情况下,异常捕获的顺序要遵循从子(小)到父(大)的顺序,父类异常在最后
常见异常处理结构
try{}catch(Exception e){}finally{}
处理
无参构造方法
String message参数调用父类有参构造方法
需要继承Exception或Exception的子类,常用RuntimeExceptio
自定义异常
方法名、参数列表、返回值类型必须和父类相同
子类的访问修饰符和父类相同或比父类更宽
子类中的方法,不能抛出比父类更宽泛的异常,可以抛出更多的异常。
异常方法覆盖
异常
java基础
真正运行时的程序,称之为进程
单核cpu,在任何时间点上,只能运行一个进程
宏观并行,微观串行
进程
轻量级进程
程序中的一个顺序控制流程,也是CPU调度的基本单位
进程可以单个或多个线程组成,批次完成不同的工作,交替执行。称之为多线程。
JVM是一个进程,当中默认包含了主线程main
CPU时间片
存储线程需要使用的局部变量,每个线程都拥有独立的栈
栈空间
存储线程需要使用的对象,多个线程可以共享堆中的对象
堆空间
运行数据
线程的组成
线程
extends Threa
implements Runnable(callable)
创建多线程方式
(创建)
休眠 sleep(long millis);
放弃 yield();
结合 join();
(等待)
线程的状态
常见方法
临界资源:共享资源(同一对象),一次仅允许一个线程使用,才能保证其正确性
原子操作:不可分割的多步操作,被视作为一个整体,其顺序和步骤不可打乱或缺省
不同的任务用同一个属性锁住
保证执行代码的完整性
同一个任务用多个线程完成,用***.class锁住
保证临界资源争抢的安全性
当多线程并发访问临界资源时,如果破坏原子操作,可能会造成数据不一致
wait();
等待
在等待队列中随机唤醒一个线程
notify();
唤醒等待队列中所有的线程
notifyAll()
通知(唤醒)
线程的通信
同步代码块 synchronized(临界资源对象)
同步方法,方法修饰加synchornized
线程的状态(阻塞)
synchronized
JDK5加入,与synchronized比较,显示定义,结构更灵活
void lock();上锁
void unlock();释放锁
boolean tryLock();//尝试获取锁
最多持有2147483648把锁
重入锁
ReentrantLock
一种支持一写多读的同步锁,读写分离,可分配读锁、写锁
多次分配读锁,多个读操作可以并发执行
写-写:互斥,阻塞
读-写:互斥,读阻塞写、写阻塞读
读-读:不互斥、不阻塞
在读操作远远大于写操作的环境中,可在保障线程安全的情况下,提高运行效率
互斥规则
ReentrantReadWriteLock
ReadWriteLock
Lock锁
以synchronized开头的方法
JDK1.2提供,接口统一、维护性高,但是性能没有提升,均以synchronized实现
Collections中的工具方法
线程安全的ArrayList,加强版读写分离
写有锁,读无锁,读写之间不阻塞,优于读写锁
写入时,先copy一个容器副本,再添加新元素,最后替换引用
CopyOnWriteArrayList
底层是CopyOnWriteArrayList
在添加新元素时,使用addIfAbsent();添加,遍历数组
如果重复了,则抛弃掉副本(复制的数组)
CopyOnWriteArraySet
初始容量16段(Segment),使用分段锁设计
不对整个Map加锁,而是对每个Segment加锁
当多个对象存入同一个Segment时,才需要互斥
最理想的状态为16个对象分别存入16个Segment,并行数量16个
JDK1.7
Node+CAS+synchronize
JDK1.8
ConcurrentHashMap
FIFO
抛出异常的方法
返回特殊值的方法(推荐)
线程安全、可高效读写的队列,高并发下性能最好的队列
采用的是无锁、CAS比较交换算法
V:要更新的变量 E:预期值 N:新值
只用当V==E时,V=N,否则标识已被更新过,则取消当前操作
ConcurrentLinkedQueue
put 阻塞添加
take 阻塞移除
可用于解决消费者、生产者的问题
数组结构实现,有界队列,手工固定上限
链表结构实现,无界队列(默认上限是Integer.MAX_VALUE)
BlockingQueue 阻塞队列
Queue 队列
线程安全的集合
线程安全
线程容器,可以设定线程分配的数量上限
预先创建线程对象,存入池中,并实现重用池中的线程对象
避免频繁的创建、销毁
newFixedThreadPool(int nThreads);手动固定线程池的数量
newCachedThreadPool();动态数量线程池
Executors 工厂类
ExecutorService 线程池接口
Executor 顶级接口
线程池
public V call() throws Exception{}
JDK5加入,与Runnbale类似,都代表了一个线程任务
call方法,具有泛型返回值,可以声明异常
异步接收ExecutorService.submit();方法返回的结果。包含了call方法的返回值
V get();以阻塞形式等待Future中的异步处理结果(call的返回值)
Future接口
Callable<V>接口
多线程
内存与存储设备之间传输数据的通道
将存储设备中的内容读入到内存中
输入流
将内存中的内容写入到存储设备中
输出流
按方向
以字节为单位,可以读写所有的数据(万能流)
字节流
一个字符=两个字节,一个汉字是一个字符;
以字符为单位,只能读写文本数据
字符流
按单位
具有实际传输数据的读写功能
节点流
在节点流的基础之上增强功能
过滤流
按功能
InputStream 字节输入流
OutputStream 字节输出流
ObjectOutputStream
ObjectInputStream
概念:使用对象字节流传输对象的过程
保证其属性均可序列化
必须实现Serializable接口
读取到文件末尾:java.io.EOFException
transient修饰的属性为临时属性,不参与序列化
序列化、反序列化
对象字节流
FileInputStream
FileOutputStream
抽象类
BufferedInputStream
BuffereOutpuStream
字节节点流
字节过滤流
Reader
FileReader
FileWriter
BufferedWriter
BufferedReader
打印流
PrintWriter
字符过滤流
代表了物理盘符中的一个文件或文件夹
对获取文件进行过滤,满足条件的文件或文件夹才能保存下来
FileFilter接口
创建一个新文件
createNewFile()
创建一个新目录
MKdir()
输出文件或空目录
Delete()
判断File对象是否存在
Exisits()
是否是目录
isDirectory()
是否是文件
isFile()
取得名字
getName()
获得相对目录
getPath()
获得文件的长度
length()
列出目录中所有的内容
listFiles()
修改文件名为
renameTo(File file)
UTF-8针对 Uni code的可变长度字符编码
GB2312 简体中文
GBK 简体中文、扩充
字符编码
File类
IO流
由点和线构成的,标识诸多对象间的相互联系
为实现资源共享和信息传递,通过通信线路连接起来的若干主机(Host)
互联网:点与点相连
万维网:端与端相连
物联网:物与物相连
网络编程:让计算机与计算机之间建立连接、进行通信
计算机网络
第一层:物理层(双绞线、光导纤维)
第二层:链路层(MAC)
第三层:网络层(IP地址)
第四层:传输层(TCP、UDP)
第五层:会话层(断点续传)
第六层:表示层(对数据转换以及加密)
第七层:应用层(HTTP、FTP、SMTP)
网络模型:OSI开放式系统互联
第一层:网络接口层(以太网、ADSL)
第二层:网络层(分配地址、传送数据,IP协议)
第三层:传输层(文本数据,协议是TCP、UDP协议)
第四层:应用层(负责传送最终形态的数据,协议为HTTP、FTp)
一组用于实现网络互联的通信协议,分为了四层
TCP/IP模型
是一种面向连接、可靠的、基于字节流的传输层通信协议。数据大小无限制。
客户端向服务端发起连接
服务端接收请求并进行确认
客户端对服务端的响应进行确认
三次握手
客户端发起挥手请求
服务器端接收挥手请求
服务器发起关闭连接
客户端进入关闭连接的状态
四次挥手
建立连接的过程需要三次握手, 断开连接的过程需要四次挥手
TCP:传输控制协议
是一种无连接的传输层协议,提供面向事务的简单、不可靠信息传送服务
每个包的大小是64KB
UDP:用户数据报协议
TCP/UDP
GET
POST
OPTIONS
TRACE
Others
请求方法
GET /HTTP/1.1Host:localhostcsrftoken:Zr6Sy6DpRMjMYjDGjHavus9lwc5JLCt2MxMiogaNhd7pueKHwR4tbOcvJa5smoaz
GET请求demo
POST HTTP/1.1Host:localhostcsrftoken:Zr6Sy6DpRMjMYjDGjHavuS9lwc5JLCt2MxMiogaNhd7pueKHwR4tbOcvJa5smoazContent-Length:20Content-Type:application/x-www-form-urlencoded
POST请求demo
GET和POST最常用,所以HTTP请求通常分为GET请求和POST请求
请求路径(即请求的相对路径)
HTTP/1.1
HTTP/1.0
请求协议
请求行
Host(必须)
Cookie(模拟登陆)
Content-Type(PosT必须)
Content-Length(PoST必须)
Referer(HTTP访问的来源)
请求头信息
JSON
XML
请求主体信息(POST必须)
HTTP请求
协议板本
1XX:接收到请球,地续处理
2XX:请求成功
302:请求被临时由定向到另一个地址304:Not Modified〔资源未修改,从本地取缓存】301:请求按永久重定问到另一个地址307:重定问中保特原有的post数据,防止数据委失
3XX:请求重定向
404:没有找到请求文件403:客户请访问错误
4XX:客户端请求错误
5XX:服务端出现问题
状态码
对于状态码的文字解将
状态文字
响应行
响应头信息
HTTP响应
HTTP协议
互联网协议/网际协议地址
分配给互联网设备的唯一数字标签(标识)
4字节32位整数,分成4段8位的二进制数
255.255.255.255
IPV4
16字节128位整数,分成8段十六进制整数
FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF
IPV6
127.0.0.1
localhost
回环地址
0~65535
在通信实体上进行网络通讯的程序的唯一标识
Web服务器:80
FTP服务器:21
Port端口
IP
网络
标识互联网协议(IP)地址对象。封装了与该IP地址对象相关的所有信息,并提供常用方法
无法直接创建对象,构造方法私有化。需要通过getXXX方法来获得
InetAddress
是网络中的一个通信节点
分为客户端Socket和服务端ServerSocket
通信要求:IP地址+端口号
socket.getInputStream
socket.getOutputStream
socket通信节点
基于字节节点流
单客户端与服务器持续收发消息
多客户段与服务收发消息
客户端收发消息独立
多客户端群聊
案例:服务器与客户端互发消息
基于TCP的网络编程
DatagarmSocket创建连接
send(packet)
数据相关信息,将字节数组转为字符串
拆包:getData()
getLength
getAddres
getPort
receive(packet)
数据的携带用DatagramPacket
数据报通信方式
UDP编程
Socket
网络编程
一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结
可简单理解为特定问的固定解决方法
《设计模式》书中描述了23种设计模式
主要负责对象创建的问题
工厂模式
单例模式
模板模式
可重用代码、让代码更容易被他人理解、保证代码可靠性、重用性。
设计模式
二分查找法
快速排序
算法
Java8(又称业D18)是Java语言开发的一个主要版本。Oracle公司于2014年3月18日发布Java8
函数式接口FunctionalIntrface
语法
Lamada表达式
函数式接口
Stream 原料 工序 Stream
Stream自己不会存储元素。
中间操作
使用步骤
通过 Collection对象的 stream()或 parallelStream()方法
通过 Arrays类的 stream()方法
通过 Stream接口的of0、 iterate( generate方法
通过 Instream、 OnstReam、 Doublestream接口中的of、 range、 ange Closed方法。
创建方法
fter、lmt、skip、 distinct、 sorted、map、parallel
终止操作
Stream API
localDate
时间格式化类
Date TimeFormatter
Instant表示瞬间;和前面Date类似
Zoned表示时区信息。
Instant、 Zoned类
日期API
JDK8新特性
JVM调优
JUC安全并发包
任何类的类对象都是Class
每个类只有一个类对象
类对象
使用new关键字创建出来的对象,是一个具体的实例对象
类的对象
实例.getClass()
类.class
全类名:包名+类名
Class.forName(\"全类名\");
获得类对象的三种方式
getDeclaredMethods()获得所有方法
获得方法
调用方法
反射
Class类型封装类(任意类)的成员信息,包括:属性、方法、构造。
开发人员可以通过注解告诉类如何运行。
使用@interface关键字
枚举类型
String类型
Cass类型
注解类型
以上类型的一维数组
注解属性类型
注解中只能包含属性
常见注解@Override、@Deprecated
Class
注解记录在 class文件中,运行Java程序时,JVM会保留,程序可以通过反射获取该注释
runtime:
编译时直接丢弃这种策略的注释
source
@Retention 注解的生效时间RetentionPoclicy(枚举类)
Mehod
Field
strutor
@Target 表示注解用于修饰那些成员ElementType(枚举类)
获得注解
getDeclaredAnnotation
元注解:注解中的注解
定义注解
注解Anotation
反射,注解
java进阶
数据库:数据库是“按照数据结构来组织、存储和管理数据的仓库。是一个长期存储在计算机内的、有组织的、有共享的、统一管理的数据集合
状结构数据库
层次结构数据库
关系结构数据库
非关系型数据库
一路下一步
默认为3306
端口号
建议UTF-8
字符编码方式
服务名称
path=${安装路径}\\bin
环境变量设置
记好管理员密码
超级管理员账户一定是root
安装
1.双击安装包进行卸载删除。
第二步:删除目录: 把C:\\ProgramData下面的MySQL目录干掉。(隐藏目录) 把C:\\Program Files (x86)下面的MySQL目录干掉。
卸载
计算机-->右键-->管理-->服务和应用程序-->服务-->找到mysql服务
启动MySQL的服务
|information_schema || mysql || performance_schema || test
mysql默认自带了4个数据库。
mysql -uroot -p密码
登录
exit;
退出
使用
安装和使用
Navicat for MySQL
客户端使用
服务器配置
SHOW DATABASES;
查看所有数据库
use 库名;
选中数据库
creata database 库名 character set utf8;
创建数据库
drop database 库名;
删除数据库
select version();
查看mysql数据库的版本号
select database();
查看当前使用的是哪个数据库
show databases;
查看库中的所有表
创建表create table 表名( 字段 字符);
创建表
select * from 表名;
字段 as ‘别名’
别名
distinct 字段
去重
基本查询
asc 升序
desc 降序
select 字段 from 表名 order by 排序字段 排序规则
排序查询
select 字段 from 表名 where 判断条件
=
等值判断
and or not
逻辑判断
< > <= >= != <>
不等值判断
between and
区间判断
null判断
in(值1,值2,值3)
枚举查询
_(单个字符)
%(任意个字符)
like 条件语句
模糊查询
CASEWHEN 条件1 THEN 结果1WHEN 条件2 THEN 结果2ELSE 结果
分支结构查询
条件查询
当前系统时间
SYSDATE()
NOW()
获得知道日期的年份
YEAR()
时间函数
新增一个列:alter table 表 add column 列名 类型修改列类型:alter table 表 modify 列名 新类型修改列名:alter table 表 change 原列名 新列名 类型删除列:alter table 表 drop 列名
查询语句
SELECT,FROM,WHERE,GROUP BY,HAVING和ORDER BY
CREATE、ALTER与DROP
INSERT、UPDATE、DELETE
GRANT 和 REVOKE
数据控制语言 (Data Control Language,DCL)
SQL之语句分类
SQL语句分类
基础语句
多表查询语句
常见函数
约束语句
基础
索引,索引原理和数据结构
用户权限管理
三大范式
视图,存储过程
ER图 ,Power Desiner
行专列,列转行
原理
原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;一致性(Consistent):事务结束后系统状态是一致的;隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。
四大特性
事务
id
简单查询。查询不包含子查询和union
simple
复杂查询中最外层的select
primary
包含在select中的子查询(不在from子句中)
subquery
derived
UNION
从UNION表获取结果的SELECT
UNION RESULT
表示对应行是简单还是复杂的查询
select_type
显示这一行的数据是关于哪张表
table
NULL
最优到最差分别为:system > const > eq_ref > ref > range > index > ALL
type
列的含义
Explain
进阶
MySQL
连接流程
基本使用
查询封装(ORM)
注入攻击解决
事务控制
JDBC
数据库
HTML5
CSS
JavaScript
JQuery
BootStrap
LayUI
Vue
前端
将一个单体应用,拆分成多个
微服务
一个应用,分别部署在不同的服务器
在一个分布式系统中,Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性),不能同时成立。
值所有节点在同一时间数据完全一致
Consistency(一致性)
服务一直可用,而且是正常相应时间
Availability(可用性)
指分布式系统在遇到网络分区(即某些节点之间的网络连接中断)时,仍能够继续正常工作的能力。
Partition Tolerance(分区容错性)
CAP理论
Base 理论的核心思想是最终一致性,即使无法做到强一致性(Strong Consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual Consistency)。
实现基本可用的几个策略:1、流量削峰(不同地区售票时间错峰出售)以订票系统设计为例,在春运期间,开始借票前后会出现及其海品的请求峰值。可以在不同的时间。出售不同区域的票,将访问请求错开,削弱请求峰值。2、延迟响应,异步处理(买票排队,基于队列先收到用户买票请求,排队异步处理,延迟响应)还以订票系统为例。用户提交购票请求后,往往会在队列中排队等待处理。可能几分钟或十几分钟后:系统才开始处理,然后响应处理结果。3、体验降级(看到非实时数据,采用缓存数据提供服务)以互联网系统为例,若出现网络热点申件,产生了海量的突发流量,系统过载,大虽图片因为网路超时无法显示,那么可以用小图片代替原始图片,降低图片的清晰度和大小,提升系统处理能力。4、过载保护溶断/限流,直接拒绝掉一部分请求,或者当清求队列满了,移除部分清求,保证整体系统可把接收到的清球放在指定的队列中排队处理,如果请求等待时间超时,这时直接拒绝超时清球:如果队列满了之后,就清除队列中一定数量的非邦队请求,保护系统不过载,实现系统堪本可用。5、故障隔离(出现故障,做到故障隔离,避免影响其他服务)
基本可用本质是一种妥协,也就是出现节点故障或者系统过载时,通过牺牲非核心功能的可用性,保障核心功能的稳定运行。
基本可用(Basically Available)
软状态(弱状态)·>允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性,即允许系统在多个不同节点的数据副本存在数据诞迟。
软状态(Soft State)
上面说软状态,然后不可能一直是软状态,必须有个时间期那限。在期限过后。应当保证所有副本保特贸据一致性。从而达到傲据的最终一致性。这个时间期哪限取决于网络延时,系统负载。数据复制方案设计等等因素。
最终一致性(Eventually Consistent)
分布式事务是相对本地事务而言的,对于本地事务,利用数据库本身的事务机制,就可以保证事务的ACD特性。
2PC
3PC
TCC
Saga事务
MQ
最大努力通知
实现方案
分布式事务
Base理论
CAS(Compare and Swap)操作是一种原子操作,用于实现无锁并发。
它的基本原理是:先比较内存中的值和期望值是否相等,如果相等,则将新值写入内存中;否则不做任何操作。整个操作是原子性的,不会被其他线程中断。
开销大
只能确保一个共享变量
ABA问题
缺点
CAS操作
理论
JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载器)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。 ·Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)来装载class文件到Runtime data areal中的method area。 ·Execution engine(执行引擎):执行classes中的指令。 ·Native Interface(本地接口):与native libraries交互,是其它编程语言交互的接口。 .Runtime data area(运行时数据区域):这就是我们常说的JVM的内存。
jvm的组成原理
Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而类加载器的工作就是把class文件从硬盘读取到内存中。
类装载方式,有两种:1.隐式装载, 比如new 方式生成对象时,隐式调用类装载器加载对应的类到jvm中;2.显式装载,通过class.forname()等方法,显式加载需要的类;Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,其他类需要的时候才加载。这是为了节省内存开销。
类装载分为以下 5 个步骤:加载:根据路径找到 class 文件然后导入;验证:检查加载的 class 文件的正确性;准备:给类中的静态变量分配内存空间;解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而直接引用直接指向内存中的地址;初始化:对静态变量和静态代码块执行初始化工作。使用:卸载:
1. 启动类加载器(Bootstrap ClassLoader)用来加载java核心类库,无法被java程序直接引用。
2. 扩展类加载器(extensions class loader):它用来加载Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载Java类。
4.用户自定义类加载器,通过继承java.lang.ClassLoader类的方式实现。
主要有一下四种类加载器:
双亲委派机制: 如果一个类加载器收到了类请求,它首先不会自己去加载这个类,而是把这个请求委派给父类加载器去完成,每一层的类加载器都是如此,这样所有的加载请求都会被传送到顶层的启动类加载器中,只有当父加载无法完成加载请求(它的搜索范围中没找到所需的类)时,子加载器才会尝试去加载类。 当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,由父类去加载,如果此时父类不能加载,反馈给子类,由子类去完成类的加载。
jvm的类加载机制
jvm
一个运行中的程序就是一个进程,一个进程可以包含多个进程,进程
进程是系统资源分配的基本单位,线程是CPU调度的基本单位
进程间不能共享数据段地址,但同进程下的线程可以
线程和进程的区别
准备状态
就绪状态
运行状态
阻塞状态
死亡状态
线程的五种状态
1.集成thread类
2.实现runable
3.实现callable
创建线程的方式
sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复。wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。
sleep()方法和对象的wait()方法都可以让线程暂停执行,有什么区别
Thread之五:线程的优先级
线程的优先级
1、synchronized是Java的关键字,jvm级别,lock是一个接口
2、synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;
3、synchronized在发生异常时候会自动释放占有的锁,因此不会出现死锁;lock必须手动unlock来释放锁,可能引起死锁的发生
4、synchronized只能等待锁的释放,不能响应中断;lock等待锁过程中可以用interrupt来中断等待
5、synchronized锁适合代码少量的同步问题;Lock锁适合大量同步的代码的同步问题
synchronized和lock的区别
并发容器
1.String是不可变的,如果尝试去修改,会新生成一个字符串对象,StringBuffer和StringBuilder是可变的
2.StringBuffer是线程安全的,StringBuilder是线程不安全的,所以在单线程环境下StringBuilder效率会更高
深入理解String、StringBuffer和StringBuilder类的区别
1.<?extends T>表示包括T在内的任何T的子类
2.<?super T>表示包括T在内的任何T的父类
泛型中extends和super的区别
==:如果是基本数据类型,比较是值,如果是引用类型,比较的是引用地址
equals:具体看各个类重写equals方法之后的比较逻辑,比如String类,虽然是引用类型,但是String类中重写了equals方法,方法内部比较的是字符串中的各个字符是否全部相等。
==和equals方法的区别
//todo
A.java.lang.ThreadB.java.lang.NumberC.java.lang.DoubleD.java.lang.MathE.java.lang.StringF.java.lang.ClassLoader
下列哪些类可以被继承()
在各种BeanFactory以及ApplicationContext创建中都用到了
1.工厂模式
在各种BeanFactoryl以及ApplicationContext实现中也都用到了
2.模版模式
Spring AOP利用了Aspecj AOP实现的!Aspecj AOP的底层用了动态代理
3.代理模式
比如在创建bean的时候
5.单例模式
6.现察者模式
7.适配器模式
源码中类型带Wrapper或者Decorator的都是
8.装饰者模式
Spring框架中使用了哪些设计模式及应用场景?
Spring Framework
Spring MVC
Spring Boot
Spring Data
Spring Cloud
Spring Security
spring全家桶有哪些
Resource默认按照ByName自动注入
@Resource装配顺序:①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。
bean注入
属于java
@Resource
Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用
属于spring
@Autowired
@autowired和resource的区别
spring
1.用户发送请求至前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用处理器映射器HandlerMapping。
3.处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。
4.DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作
5.执行处理器Handler(Controller,也叫页面控制器)。
6.Handler执行完成返回ModelAndView
7.HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体View
10.DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)。
11.DispatcherServlet响应用户。
SpringMVC执行流程及工作原理
执行流程
SpringMVC
spring mvc
主要有.properties和.yml格式,它们的区别主要是书写格式不同。另外,yml格式不支持@PropertySource注解导入配置。
Spring Boot的配置文件有哪几种格式?它们有什么区别
Spring Boot的核心配置文件是application和bootstrap配置文件
application配置文件主要用于Spring Boot项目的自动化配置
使用Spring Cloud Config配置中心时,需要在bootstrap配置文件中添加连接到配置中心的配置属性,来加载外部配置中心的配置信息:
一些固定的不能被覆盖的属性;
一些加密或解密的场景:
bootstrap配置文件有三个应用场景
Spring Boot的核心配置文件有哪几个?它们的区别是什么?
@EnableAutoConfiguration注解、@Configuration注解和@ConditionalOnClassi注解组成了Spring Boot自动配置的核心,首先它得是一个配置文件,其次根据类路径下是否有这个类去自动配置。具体是通过maveni读取每个starter中的spring.factories.文件,该文件配置了所有需要被创建在spring容器中的bean。
请描述Spring Boot自动装配的过程
1、获取SpringApplicationListener监听器;
2、启动所获取到的所有监听器:
3、初始化ConfigurableEnvironment(配置文件);
4、打印Banner图标
5、创建容器ConfigurableApplicationContext;
6、准备容器ConfigurableApplicationContext;
7、初始化容器ConfigurableApplicationContext;
8、监听器通知容器启动完成:
9、监听器通知容器正在运行;
除了上述核心操作,u方法运行过程中还涉及启动时长统计、异常报告、启动日志、异常处理
首先,Spring Boot]项目创建完成会默认生成一个名为*Application的入口类,我们是通过该类的main方法启动Spring Bootl项目的。在main方法中,通过SpringApplication的静态方法,即run方法进行SpringApplication类的实例化操作,然后再针对实例化对象调用另外一个run方法来完成整个项目的初始化和启动。SpringApplication调用的run方法的大致流程:
介绍Spring Bootl的启动流程
@Transactional失效的场景
Spring Boot推荐使用Java配置同时支持XML配置,通过@ImportResource注解加载XML配置;
可以兼容,使用@ImportResource注解导入老Spring项目配置文件。
Spring Boot是否可以使用XML配置?Spring Boot可以兼容老Spring项目吗
bootstrap比applicaton优先加载,配置在应用程序上下文的引导阶段生效,而且boostrap里面的属性不能被覆盖;
application.propertiesi和bootstrap.properties?有何区别;
YAML是一种可读的数据序列化语言,它通常用于配置文件。
优点:配置有序支持数组,数组中的元素可以是基本数据类型或者对象简洁方便
spring boot
eureka注册中心
zuul网关
ribbob服务调用
config配置中心
hystrix熔断器
Springcloud五大组件
2.异步:系统A给消容队列发送完消息之后,就可以继续其他事情了
3.流量削峰:如果使用消息队列的方式来调用某个系统,那么消息将在队列中排队,由消费者白己控制消费速度
消息队列有哪些作用
1.死信认列也是一个消息队列,它是用来存放那些没有被成功消费的消息的,通常可以用来作为消息重试
2.延时认列通常是用来存放需要在指定时间被处理的元泰的队列,通常可以用来处理一些具有过期性操作的业务,比如十分中内未支付则取消订单
死信队列是什么?延时队列是什么?
数据库数据量过大
深度分页问题
查询未命中索引
表没有建立索引
join连表过多
1、数据库问题
代码逻辑冗余
循环调用
2、业务代码问题
线程个数过多或者过少
JVM设置不合理
3、JVM、线程池问题
4、机器性能问题
线上接口响应很慢一般是哪些问题?
幂等性:一个接口多次调用没有副作用;
场景:用户重复操作,代码重试,消息重复消费,网络波动等:
幂等性的理解
spring cloud
SQL语言介绍 SQL(Structure Query Languge,结构化查询语言)是一种数据库专用的计算机语言,不管是Oracle、MS SQL 、Access、MySQL或其他公司的数据库,也不管数据库建立在大型主机或个人计算机上,都可以使用SQL语言来访问和修改数据库的内容。虽然不同公司的数据库软件多多少少会增加一些专属的SQL语法,但大体上,它们还是遵循ASNI(美国国家标准协会)制定的SQL标准。因为SQL语言具有易学习及阅读等特性,所以SQL逐渐被各种数据库厂商采用,而成为一种共通的标准查询语言。只要你学会SQL,即可操作各种数据库如Visual Foxpro、Access、dBase等等。总之,SQL语言是各种数据库都可以使用的数据库查询语言。 SQL语言不仅仅具有查询数据库的功能,而且可以对数据库完成选取、增删、更新与跳转等各种操作。
SQL则集数据定义语言DDL、数据操纵DML、数据控制语言DCL的功能于一体,语言风格统一,可以以独立完成数据库生命周期中的全部活动,包括:定义关系模式,插入数据,建立数据库;对数据库中的数据进行查询和更新;数据库重构和维护;数据库安全性、完整性控制; 等一系列操作要求。 这就为数据库应用系统的开发提供了良好的环境。特别是用户在数据库系统投入运行后,还可根据需要随时地逐步地修改模式,并不影响数据库的运行,从而使系统具有良好的可扩展性。
1. 综合统一
而用SQL进行数据操作,只要提出“做什么”,而无须指明“怎么做”,因此无需了解存取路径。存取路径的选择以及SQL的操作过程由系统自动完成。这不但大大减轻了用户负担,而且有利于提高数据独立性
2. 高度非过程化
非关系数据模型采用的是面向记录的操作方式,操作对象是一条记录。而SQL采用集合操作方式,不仅操作对象、查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。
3. 面向集合的操作方式
SQL既是独立的语言,又是嵌入式语言。 作为独立的语言,它能够独立地用于联机交互的使用方式,用户可以在终端键盘上直接键入SQL命令对数据库进行操作;作为嵌入式语言,SQL语句能够嵌入到高级语言程序中,供程序员设计程序时使用。而在两种不同的使用方式下,SQL的语法结构基本上是一致的。这种以统一的语法结构提供多种不同使用方式的做法,提供了极大的灵活性与方便性。
4. 以同一种语法结构提供多种使用方式
SQL功能极强,但由于设计巧妙,语言十分简洁,完成核心功能只有9个动词,如表所示。SQL接近英语口语,因此容易学习,容易使用。
5. 语言简洁,易学易用
commit、rollback。
事务控制语言(Trasactional Control Languag,TCL)
简述sql语言
2.检查所利用的索引,是否是最优索引
3.检查所查字段是否都是必须的,是否查询了过多字段,查出了多余数据
4.检查表中数据是否过多,是否应该进行分库分表了
5.检查数据库实例所在机器的性能置,是否太低,是否可以造当增加资源
MySql慢查询如何优化
原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
一致性(Consistent):事务结束后系统状态是一致的;
隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。
由于创建连接和释放连接都有很大的开销(尤其是数据库服务器不在本地时,每次建立连接都需要进行TCP的三次握手,释放连接需要进行TCP四次握手,造成的开销是不可忽视的),为了提升系统访问数据库的性能,可以事先创建若干连接置于连接池中,需要时直接从连接池获取,使用结束时归还连接池而不必关闭连接,从而避免频繁创建和释放连接所造成的开销,这是典型的用空间换取时间的策略(浪费了空间存储连接,但节省了创建和释放连接的时间)。池化技术在Java开发中是很常见的,在使用线程时创建线程池的道理与此相同。基于Java的开源数据库连接池主要有:C3P0、Proxool、DBCP、BoneCP、Druid等。
连接池有什么作用
(1) 在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。
(2) GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
(3) 安全性问题。使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。
GET与POST区别
java面试
JavaEE+分布式开发
收藏
0 条评论
回复 删除
下一页