Java基础回顾系列-第一天-基本语法

2024-09-08 15:32

本文主要是介绍Java基础回顾系列-第一天-基本语法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基本语法

  • Java基础回顾系列-第一天-基本语法
    • 基础常识
      • 人机交互方式
      • 常用的DOS命令
      • 什么是计算机语言(编程语言)
    • Java语言简介
      • Java程序运行机制
        • Java虚拟机(Java Virtual Machine)
        • 垃圾收集机制(Garbage Collection)
      • Java语言的特点
        • 面向对象
        • 健壮性
        • 跨平台性
    • 编写第一个Java程序
      • 什么是JDK, JRE
      • 下载及安装 JDK
      • 配置环境变量 path
      • HelloWorld 类
      • HelloWorld 细节
    • Java 基本语法
      • Java 注释
      • Java API文档
      • 关键字
      • 标识符
      • 常量
      • 变量
        • 变量的概念
        • 变量的定义
        • 变量的使用
        • 变量的分类
          • 按被声明的位置划分
          • 按所属的数据类型划分
      • 基础数据类型
        • 整形类型(byte、short、int、long)
        • 浮点类型(float、double)
        • 字符类型(char)
        • 布尔类型(boolean)
        • 基本数据类型转换
          • 自动类型转换(隐式类型转换)
          • 强制类型转换
      • 引用数据类型
      • 进制
      • 运算符
        • 算术运算符
        • 赋值运算符
        • 比较运算符(关系运算符)
        • 逻辑运算符
        • 位运算符
        • 三元运算符(三目运算符)
        • instanceof 运算符
    • 程序逻辑控制
      • 选择结构
        • if 语句
        • switch 语句
        • switch语句和if语句的各自使用场景
      • 循环结构
        • while 循环
        • do while 循环
        • for 循环
        • Java 增强 for 循环
        • 死循环和循环语句对比
        • 嵌套循环
        • 嵌套循环性能优化案例
      • 控制循环结构
        • break 语句
        • continue 语句
        • return 语句
        • 控制外层循环
    • 方法
      • 方法的定义
      • 方法的重载
    • 数组
      • 一维数组
      • 多维数组
      • Arrays 工具类

Java基础回顾系列-第一天-基本语法

基础常识

人机交互方式

  • 图形化界面(Graphical User Interface GUI)这种方式简单直观,使用者易于接受,容易上手操作。
  • 命令行方式(Command Line Interface CLI):需要有一个控制台,输入特定的指令,让计算机完成一些操作。较为麻烦,需要记录住一些命令。

常用的DOS命令

  • dir(directory):列出当前目录下的文件以及文件夹
  • md(make directory):创建目录
  • rd(remove directory):删除目录
  • cd(change directory):进入指定目录
  • cd ..:退回到上一级目录
  • cd \..:退回到根目录
  • exit:退出 dos 命令行

什么是计算机语言(编程语言)

人与计算机交流的方式。如果人要与计算机交流,那么就要学习计算机语言。计算机语言有很多种,如:C,C++,Java,PHP等。

Java语言简介

Java程序运行机制

Java虚拟机(Java Virtual Machine)
  • JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指令,管理数据、内存、寄存器。
  • JVM 用于运行 Java 应用程序
  • 对于不同的平台,有不同的虚拟机。
  • Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行”。
垃圾收集机制(Garbage Collection)
  • 垃圾回收:将不再使用的内存空间进行回收。
  • 在 C/C++ 等语言中,由程序员负责回收无用内存。
  • Java 不需要程序员负责回收无用的内存:它提供一种系统级线程跟踪存储空间的分配情况。并在JVM空闲时,检查并释放那些可被释放的存储空间。
  • 垃圾回收在 Java 程序运行过程中自动进行,程序员无法精确控制和干预。

Java语言的特点

面向对象
  • 两个基本概念:类、对象
  • 三大特性:封装、继承、多态
健壮性

吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分。如:指针、内存的申请与释放等

跨平台性
  • 跨平台性:通过Java语言编写的应用程序在不同的系统平台上都可以运行。
  • 原理:只要在需要运行 java 应用程序的操作系统上,先安装一个Java虚拟机 (JVM Java Virtual Machine) 即可。由JVM来负责Java程序在该系统中的运行。

编写第一个Java程序

什么是JDK, JRE

简单而言,使用 JDK 的提供的开发工具完成 java 程序的开发,使用 JRE 运行开发好的 Java 应用程序。
JDK(Java Development Kit Java开发工具包):JDK是提供给 Java 开发人员使用的,其中包含了 java 的开发工具,也包括了JRE。所以安装了JDK,就不用在单独安装JRE了。
JRE(Java Runtime Environment Java运行环境) :包括Java虚拟机(JVM:Java Virtual Machine)和 Java 程序所需的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。

下载及安装 JDK

官方网址:www.oracle.com
注意: 当提示安装 JRE 时,可以选择不安装。

配置环境变量 path

  • 每次执行 java 的工具都要进入到 bin 目录下,是非常麻烦的。
  • 根据windows系统在查找可执行程序的原理,可以将java工具所在路径定义到 path 环境变量中,让系统帮我们去找运行执行的程序。

配置方法:

  1. 进入桌面–选择“此电脑”–右键“属性”–选择“高级系统设置”–环境变量–系统变量–新建JAVA_HOME=D:\Program Files\Java\jdk-11.0.2
  2. 编辑 path 环境变量,在变量值开始处加上"%JAVA_HOME%\bin",后面用 “ ; ”和其他值分隔开即可。
  3. 打开DOS命令行,任意目录下敲入javac。如果出现javac 的参数信息,配置成功。

提示:Windows 10 配置Java 环境变量:http://www.runoob.com/w3cnote/windows10-java-setup.html

HelloWorld 类

public class HelloWorld {public static void main(String[] args) {System.out.println("Hello World");}
}

HelloWorld 细节

  • main的方法:Java应用程序的执行入口是main()方法。它有固定的书写格式:public static void main(String[] args) {...}
    如果没有 main 方法则在运行时会抛出如下异常:
    在这里插入图片描述
  • 想要和JVM来个互动,只要在main方法中加入一句System.out.println("Hello World");
  • 一个 Java 源文件中最多只能有一个 public 类。其它类的个数不限,如果源文件文件包含一个 public 类,它必须是该类名命名。
  • Java 语言严格区分大小写。
  • Java方法由一条条语句构成,每个语句以分号结束。

Java 基本语法

Java 注释

// 单行注释
/* 多行注释 */
/** 文档注释javadoc */

对于单行和多行注释,被注释的文字,不会被JVM(java虚拟机)解释执行。
多行注释里面不允许有多行注释嵌套。

Java API文档

API (Application Programming Interface,应用程序编程接口)是 Java 提供的基本编程接口。
官网地址:https://docs.oracle.com/en/java/javase/
Java语言提供了大量的基础类,因此 Oracle 也为这些基础类提供了相应的API文档,用于告诉开发者如何使用这些类,以及这些类里包含的方法。

关键字

关键字的定义和特点
定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)
特点:关键字中所有字母都为小写
用于定义数据类型的关键字:
在这里插入图片描述

标识符

Java 对各种变量、方法和类等要素命名时使用的字符序列称为标识符
凡是自己可以起名字的地方都叫标识符。
定义合法标识符规则

  • 由26个英文字母大小写,数字:0-9 ,_或 $ 组成数字不可以开头。
  • 不可以使用关键字和保留字,但能包含关键字和保留字。
  • Java中严格区分大小写,长度无限制。
  • 标识符不能包含空格。

注意: 在起名字的时,为了提高阅读性,要尽量有意义,“见名知意”。

常量

程序中固定不变的值。
需注意基本类型与引用类型的区别。

final double PI = 3.14159;

变量

变量的概念
  • 内存中的一个存储区域
  • 该区域有自己的名称(变量名)和类型(数据类型)
  • Java中每个变量必须先声明,后使用
  • 该区域的数据可以在同一类型范围内不断变化
变量的定义

数据类型 变量名 = 初始化值

变量的使用

变量是通过使用变量名来访问这块区域的。
Java是强类型语言,每个变量必须先声明类型,后使用
变量的作用域:一对{ }之间有效。

变量的分类
按被声明的位置划分
  • 成员变量:方法外部、类的内部定义的变量。
  • 局部变量:方法或语句块内部定义的变量。

注意: 类外面(类对应的大括号外面)不能有变量的声明。

按所属的数据类型划分

基本数据类型变量
引用数据类型变量

基础数据类型

在这里插入图片描述
参考使用原则:

  • ==如果要是描述数字首选一定是int(整数)、double(小数)
  • 如果要是进行数据传输或者文字编码转换使用byte类型(二进制处理操作)
  • 处理中文的时候最方便的操作使用char(字符)
  • 描述文件大小、描述表的主键列(自动增长)可以使用long
整形类型(byte、short、int、long)

注意: Java 的整型常量默认为 int 型,声明 long 型常量须后加 ‘l’ 或 ‘L’,推荐大写’L’,因为小写的跟数字一很相像。
在这里插入图片描述

浮点类型(float、double)

float表示单精度类型;double表示双精度类型。
注意: Java 的浮点型常量默认为 double 型,声明 float 型常量,须后加 ‘f’ 或 ‘F’。
浮点型常量有两种表示形式
十进制数形式:如:5.12 512.0f .512 (必须有小数点)
科学计数法形式:如:5.12e2 512E2 100E-2
在这里插入图片描述

字符类型(char)

char 型数据用来表示通常意义上"字符"。
字符型常量的三种表现形式

  • 字符常量是用单引号('')括起来的单个字符,涵盖世界上所有书面语的字符。例如:char c1 = 'a'; char c2 = '中'; char c3 = '9';
  • Java中还允许使用转义字符\'来将其后的字符转变为特殊字符型常量。例如:char c3 = '\n'; -- '\n'表示换行符
  • 直接使用 Unicode 值来表示字符型常量:’\uXXXX’。其中,XXXX代表一个十六进制整数。如:\u000a 表示 \n
布尔类型(boolean)

boolean 类型适于逻辑运算,一般用于程序流程控制

  • if条件控制语句;
  • while循环控制语句;
  • do-while循环控制语句;
  • for循环控制语句;

注意:boolean类型数据只允许取值truefalse,不可以0或非 0 的整数替代true和false,这点和C语言不同。

基本数据类型转换
自动类型转换(隐式类型转换)

容量小的类型自动转换为容量大的数据类型。 数据类型按容量大小排序为:
在这里插入图片描述

  • 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。
  • byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。
  • 当把任何基本类型的值和字符串值进行连接运算时(+),基本类型的值将自动转化为字符串类型。
强制类型转换

自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符(()),但可能造成精度降低或溢出,格外要注意。
注意:

  • 通常,字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。 如: String a = "43"; int i = Integer.parseInt(a);
  • boolean类型不可以转换为其它的数据类型。

引用数据类型

除了8种基本数据类型之外,其它的所有类型都是引用类型,包括类、接口、数组。引用类型的默认值都是null

进制

二进制:0,1 ,满 2 进 1.以 0b 或 0B 开头。
十进制:0-9 ,满 10 进 1.
八进制:0-7 ,满 8 进1. 以数字 0 开头表示。
十六进制:0-9 及 A-F,满 16 进1. 以 0x 或 0X开头表示。此处的A-F不区分大小写。

所有数字在计算机底层都以二进制形式存在。
计算机以补码的形式保存所有的整数。
正数的补码与其原码相同;负数的补码是在其反码的末位加1。
原码:直接将一个数值换成二进制数。
反码:是对原码按位取反,只是最高位(符号位)保持不变。
Java整数常量默认是int类型,当用二进制定义整数时,其第32位是符号位;当是long类型时,二进制默认占64位,第64位是符号位。

运算符

算术运算符

在这里插入图片描述
注意:

  • 如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。 但被模数是负数就另当别论。
  • 对于除号"/",它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。 例如:int x=3510;x=x/1000*1000; x的结果是3000
  • "+"除字符串相加功能外,还能把非字符串转换成字符串;例如:System.out.println("5+5="+5+5); //打印结果是?5+5=55
赋值运算符

符号:=
扩展赋值运算符: *+=, -=, =, /=, %=

比较运算符(关系运算符)

在这里插入图片描述
注意:

  • 比较运算符的结果都是boolean型,也就是要么是true,要么是false
  • 比较运算符"=="不能误写成"="
逻辑运算符

在这里插入图片描述
注意: 逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 && x<6 。
&和&&的区别:

  • 单&时,左边无论真假,右边都进行运算;
  • 双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。

||的区别同理,双或时,左边为真,右边不参与运算。
异或( ^ )与或(| )的不同之处是:对于 ^ 而言,当左右都为true时,结果为false

位运算符

位运算是直接对二进制进行运算
在这里插入图片描述
在这里插入图片描述

三元运算符(三目运算符)

格式:
(条件表达式)?表达式1:表达式2;

  • 如果条件为true,运算后的结果是表达式1;
  • 如果条件为false,运算后的结果是表达式2;
instanceof 运算符

该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。
使用格式如下:
( Object reference variable ) instanceof (class/interface type)

String name = "James";
boolean result = name instanceof String; // 由于 name 是 String 类型,所以返回真

程序逻辑控制

选择结构

if 语句
// 语法一:if
if(布尔表达式) {//如果布尔表达式为true将执行的语句
}// 语法二:if...else
if(布尔表达式){//如果布尔表达式的值为true
}else{//如果布尔表达式的值为false
}// 语法三:if...else if...else
// 注意:一旦其中一个 else if 语句检测为 true,其他的 else if 以及 else 语句都将跳过执行。
if(布尔表达式 1){//如果布尔表达式 1的值为true执行代码
}else if(布尔表达式 2){//如果布尔表达式 2的值为true执行代码
}else if(布尔表达式 3){//如果布尔表达式 3的值为true执行代码
}else {//如果以上布尔表达式都不为true执行代码
}
// 只会输出1
public static void main(String[] args) {int b = 6;if(3<b)System.out.println("1");else if(3<b)System.out.println("2");else if(3<b)System.out.println("4");elseSystem.out.println("3");
}// 语法四:嵌套if…else
if(布尔表达式 1){如果布尔表达式 1的值为true执行代码if(布尔表达式 2){如果布尔表达式 2的值为true执行代码}
}
switch 语句
// 语法
switch(expression){case value ://语句break; //可选case value ://语句break; //可选//你可以有任意数量的case语句default : //可选//语句
}

使用规则:

  • switch 语句中的变量类型可以是: byteshortint 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。
  • switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。
  • case 语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。
  • 当变量的值与 case 语句的值相等时,那么 case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。
  • 当遇到 break 语句时,switch 语句终止。程序跳转到 switch 语句后面的语句执行。case 语句不必须要包含 break 语句。如果没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现 break 语句。
  • switch 语句可以包含一个 default 分支,该分支一般是 switch 语句的最后一个分支(可以在任何位置,但建议在最后一个)。default 在没有 case 语句的值和变量值相等的时候执行。default 分支不需要 break 语句。

switch case 执行时,一定会先进行匹配,匹配成功返回当前 case 的值,再根据是否有 break,判断是否继续输出,或是跳出判断。

switch语句和if语句的各自使用场景

switch建议判断固定值的时候用;
if建议判断区间或范围的时候用。
提示: switch能做的,用if都能做,单反过来则不行。

循环结构

顺序结构的程序语句只能被执行一次。如果您想要同样的操作执行多次,,就需要使用循环结构。
Java中有三种主要的循环结构

  • while 循环
  • do…while 循环
  • for 循环
while 循环
// 语法
while( 布尔表达式 ) {//循环内容
}
do while 循环

对于 while 语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。
do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次。

do {//代码语句
}while(布尔表达式);

注意: 布尔表达式在循环体的后面,所以语句块在检测布尔表达式之前已经执行了。 如果布尔表达式的值为 true,则语句块一直执行,直到布尔表达式的值为 false。

for 循环

虽然所有循环结构都可以用 while 或者 do…while表示,但 Java 提供了另一种语句 —— for 循环,使一些循环结构变得更加简单。
for循环执行的次数是在执行前就确定的。语法格式如下:

// 语法
for(初始化; 布尔表达式; 更新) {//代码语句
}

关于 for 循环有以下几点说明:

  • 最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。
  • 然后,检测布尔表达式的值。如果为 true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句。
  • 执行一次循环后,更新循环控制变量。
  • 再次检测布尔表达式。循环执行上面的过程。
Java 增强 for 循环
// 语法
for(声明语句 : 表达式) {//代码句子
}

声明语句: 声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
表达式: 表达式是要访问的数组名,或者是返回值为数组的方法。

死循环和循环语句对比
嵌套循环
嵌套循环性能优化案例

控制循环结构

break 语句

break 主要用在循环语句或者 switch 语句中,用来跳出整个语句块。
break 跳出最里层的循环,并且继续执行该循环下面的语句。

continue 语句

continue 适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代。
在 for 循环中,continue 语句使程序立即跳转到更新语句。
在 while 或者 do…while 循环中,程序立即跳转到布尔表达式的判断语句。

return 语句

return 表示结束循环所在的方法,方法都结束了,相应的循环结构也结束了。

控制外层循环
package com.qiqitrue.spring.framework;/*** 控制外层循环* @author laiqi**/
public class JavaTest {public static void main(String[] args) {outter:for (int i = 1; i < 10; i++) {for (int j = 1; j <= i; j++) {System.out.print(j + "x" + i + "=" + (i * j) + "\t");if(i == 5) {break outter; // 结束外层循环}}System.out.println();}}
}

方法

Java方法是语句的集合,它们在一起执行一个功能

  • 方法是解决一类问题的步骤的有序组合
  • 方法包含于类或对象中
  • 方法在程序中被创建,在其他地方被引用

方法的优点:

  1. 使程序变得更简短而清晰。
  2. 有利于程序维护。
  3. 可以提高程序开发的效率。
  4. 提高了代码的重用性。

方法的命名规则:
1.方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson
2.下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。一个典型的模式是:test<MethodUnderTest>_<state>,例如 testPop_emptyStack。

方法的定义

修饰符 返回值类型 方法名(参数类型 参数名){

方法体

return 返回值;
}

方法包含一个方法头和一个方法体。下面是一个方法的所有部分:
修饰符: 修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
返回值类型 : 方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void。
方法名: 是方法的实际名称。方法名和参数表共同构成方法签名。
参数类型: 参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
方法体: 方法体包含具体的语句,定义该方法的功能。

方法的重载

就是说一个类的两个方法拥有相同的名字,但是有不同的参数列表
Java编译器根据方法签名判断哪个方法应该被调用。
方法重载可以让程序更清晰易读。执行密切相关任务的方法应该使用相同的名字。
重载的方法必须拥有不同的参数列表。你不能仅仅依据修饰符或者返回类型的不同来重载方法。

数组

  • 数组是多个相同类型数据的组合,实现对这些数据的统一管理。
  • 数组属引用类型,数组型数据是对象(Object),数组中的每个元素相当于该对象的成员变量
  • 数组中的元素可以是任何数据类型,包括基本类型和引用类型

一维数组

一维数组的声明方式: type var[] 或 type[] var;首选的方法是type[] var;
例如:

int a[];
int[] a1;
double  b[];
Mydate []c;  	//对象数组
public class TestArray {public static void main(String[] args) {double[] myList = {1.9, 2.9, 3.4, 3.5};// 打印所有数组元素for (int i = 0; i < myList.length; i++) {System.out.println(myList[i] + " ");}// 计算所有元素的总和double total = 0;for (int i = 0; i < myList.length; i++) {total += myList[i];}System.out.println("Total is " + total);// 查找最大元素double max = myList[0];for (int i = 1; i < myList.length; i++) {if (myList[i] > max) max = myList[i];}System.out.println("Max is " + max);}
}
  • Java中使用关键字 new 创建数组对象
  • 定义并用运算符 new 为之分配空间后,才可以引用数组中的每个元素;
  • 数组元素的引用方式:数组名[数组元素下标]
  • 数组元素下标可以是整型常量或整型表达式。如a[3] , b[i] , c[6*i];
  • 数组元素下标从0开始;长度为n的数组合法下标取值范围: 0 - n-1; 如int a[]=new int[3]; 可引用的数组元素为a[0]、a[1]、a[2]
  • 每个数组都有一个属性 length 指明它的长度,例如:a.length 指明数组 a 的长度(元素个数)

注意: Java语言中声明数组时不能指定其长度(数组中元素的数), 例如: int a[5]; //非法

多维数组

多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组,例如:

String str[][] = new String[3][4];

Arrays 工具类

java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。
具有以下功能:

  • 给数组赋值:通过 fill 方法。
  • 对数组排序:通过 sort 方法,按升序。
  • 比较数组:通过 equals 方法比较数组中元素值是否相等。
  • 查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作

这篇关于Java基础回顾系列-第一天-基本语法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1148485

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听