2021计算机Java二级考试四十五套题真题【收藏版】(一周裸考计划)

您所在的位置:网站首页 计算机二级python操作题题库有多少题啊 2021计算机Java二级考试四十五套题真题【收藏版】(一周裸考计划)

2021计算机Java二级考试四十五套题真题【收藏版】(一周裸考计划)

#2021计算机Java二级考试四十五套题真题【收藏版】(一周裸考计划)| 来源: 网络整理| 查看: 265

文章目录 前言一周冲刺表一周考建议45套操作题考试的意义JAVA测试题传授经验结语附加面试题证书面貌

前言

当你看到这篇文章的时候,相信自己已经在考试的路上,或者即将踏入计算机二级考试的道路。建议收藏,方便学习时候的查找。 再网上看了很多的java面试题,有很多都是零零碎碎的,有或者是需要付费加密🔐的,加个vip什么的,故而以下是博主整理的有关java面试题的以下内容,我想以一种幽默风趣😜的风格来给大家分享和探讨。另外附加有一些公司的面试真题(内部分享)下面我就开启🎧耳机模式。并且⭐是重要部分,要记易考噢。

2021计算机Java二级考试四十五套题(内涵原题) 请各位看官大人往下走…

一周冲刺表

当然了,这是对于时间比较紧迫的同学们,最好还是提前一个月来备考,做好万全的准备,才能游刃有余噢。 在这里插入图片描述

一周考建议

1.有一定的java基础,能大致看懂代码含义 2.了解题目结构[题目结构:45套题,每套题三个大题,分别是:基本操作,简单应用,总和应用] 3.java 选择题40道(一道一分),必须过一半的选择题,有java基础的一般都能过 4.先简单的阅览一遍,这时候有很多不懂的别急 5.一支笔,一张纸,把每道题的答案写一遍(记住手写+电脑记事本打字+理解性的记忆),难以理解的多写几遍也无妨,俗话说好记性不如烂笔头(烂鼠标也行🤭) 6.在刷,重点抓那些单词在题目重复出现,易错和很记忆不是很模糊的部分 7.可以把题目复制到你熟悉的编辑器里面测试(eclipse,intellij idea),如果有时间你能手打出来就更好了 8.不会的地方重点标记,你要写下让你能够开始思考的方法。感觉不够的话大题再来几次,拒绝完美主义~ 在这里插入图片描述

小可爱你的题库一上线 在这里插入图片描述

二级Java考试大纲

45套操作题

@you 一周计划表给你安排好了,合理安排时间嗯(注释:点击就行)

java操作题1套 java操作题2套 java操作题3套 java操作题4套 java操作题5套 java操作题6套 java操作题7套 java操作题8套 java操作题9套 java操作题10套

@you 刷到这里,放松一下自己的“窗户”——👀,闭目一会儿,学习更高效噢!

java操作题11套 java操作题12套 java操作题13套 java操作题14套 java操作题15套 java操作题16套 java操作题17套 java操作题18套 java操作题19套 java操作题20套

@you 有同学叫你去玩你想去吗?🐎 给我刷,把不会的标记下来,让正能量影响他人

java操作题21套 java操作题22套 java操作题23套 java操作题24套 java操作题25套 java操作题26套 java操作题27套 java操作题28套 java操作题29套 java操作题30套

@you 该吃饭的点了吗? 叫上你的小伙伴去吧!

java操作题31套 java操作题32套 java操作题33套 java操作题34套 java操作题35套 java操作题36套 java操作题37套 java操作题38套 java操作题39套 java操作题40套

@you 以为刷完结尾就结束了吗?给我把易错疑难点在记一遍!别给我哭,坚持give five👆

java操作题41套 java操作题42套 java操作题43套 java操作题44套 java操作题45套

考试的意义

直接背题能通过二级 Java 考试吗? 本人大二…学过c语言…没学过java…现在想考二级java…我是先找本大学的清华大学出版社编写的java教材进行学习…还是直接找本真题开始做和背那?我这种水平三个月后考试可以考过嘛?

在这里插入图片描述

JAVA测试题

选择题(针对以下题目,请选择最符合题目要求的答案,针对每一道题目,所有答案都选对,则该题得分,所选答案错误或不能选出所有答案,则该题不得分。)(每题2分) JAVA所定义的版本中不包括:()

A、 JAVA2 EE

B、 JAVA2 Card

C、 JAVA2 ME

D、 JAVA2 HE

E、 JAVA2 SE

2、 下列说法正确的是()

A、 JAVA程序的main方法必须写在类里面

B、 JAVA程序中可以有多个main方法

C、 JAVA程序中类名必须与文件名一样

D、 JAVA程序的main方法中如果只有一条语句,可以不用{}(大括号)括起来

3、 Java中,在如下所示的Test类中,共有()个构造方法。

public class Test{

private int x;

public Test(){

x=35;

}

public void Test(double f){

This.x=(int)f;

}

public Test(String s){}

}

A、 0

B、 1

C、 2

D、 3

4、 变量命名规范说法正确的是()

A、 变量由字母、下划线、数字、$符号随意组成;

B、 变量不能以数字作为开头;

C、 A和a在java中是同一个变量;

D、 不同类型的变量,可以起相同的名字;

5、 下列javaDoc注释正确的是()

A、 /我爱北京天安门/

B、 //我爱北京天安门*/

C、 /我爱北京天安门/*

D、 /我爱北京天安门*/

6、 为一个boolean类型变量赋值时,可以使用()方式

A、 boolean = 1;

B、 boolean a = (9 >= 10);

C、 boolean a=“真”;

D、 boolean a = = false;

7、 以下()不是合法的标识符

A、 STRING

B、 x3x;

C、 void

D、 de$f

8、 表达式(11+3*8)/4%3的值是()

A、 31

B、 0

C、 1

D、 2

9、 ()表达式不可以作为循环条件

A、 i++;

B、 i>5;

C、 bEqual = str.equals(“q”);

D、 count = = i;

10、 运算符优先级别排序正确的是()

A、 由高向低分别是:()、!、算术运算符、关系运算符、逻辑运算符、赋值运算符;

B、 由高向低分别是:()、关系运算符、算术运算符、赋值运算符、!、逻辑运算符;

C、 由高向低分别是:()、算术运算符、逻辑运算符、关系运算符、!、赋值运算符;

D、 由高向低分别是:()、!、关系运算符、赋值运算符、算术运算符、逻辑运算符;

11、 以下程序的运行结果是:()

public class Increment{

public static void main(String args[]) {

int a;

a = 6;

System.out.print(a);

System.out.print(a++);

System.out.print(a);

}

}

A. 666

B. 667

C. 677

D. 676

12、 下列值不为true的表达式有()。

A、 “john” = = “john”

B、 “john”.equals(“john”)

C、 “john” = "john"

D、 “john”.equals(new String(“john”))

13、 下列输出结果是()

int a = 0 ;

while ( a < 5 ) {

switch(a){ case 0: case 3 : a = a + 2; case 1 : case 2 : a = a + 3; default : a = a + 5; }

}

System.out.print ( a ) ;

A、 0

B、 5

C、 10

D、 其他

14、 下列代码输出结果是()

int i = 10;

while ( i > 0 ){

i = i + 1;

if ( i = =10 ){

break;

}

}

A. while循环执行10次

B. 死循环

C. 循环一次都不执行

D. 循环执行一次

15、 下面有关for循环的描述正确的是()

A、 for循环体语句中,可以包含多条语句,但要用大括号括起来

B、 for循环只能用于循环次数已经确定的情况

C、 在for循环中,不能使用break语句跳出循环

D、 for循环是先执行循环体语句,后进行条件判断

16、 下列()属于引用数据类型(选择两项)

A、 String

B、 char

C、 用户自定义的Student类类型

D、 int

17、 对象的特征在类中表示为变量,称为类的()。

A、 对象

B、 属性

C、 方法

D、 数据类型

18、 在java中下列关于自动类型转换说法正确的是()

A、 基本数据类型和String相加结果一定是字符串型

B、 char类型和int类型相加结果一定是字符

C、 double类型可以自动转换为int

D、 char + int + double +"" 结果一定是double;

19、 关于类的描叙正确的是()(选择两项)

A、 在类中定义的变量称为类的成员变量,在别的类中可以直接使用

B、 局部变量的作用范围仅仅在定义它的方法内,或者是在定义它的控制流块中

C、 使用别的类的方法仅仅需要引用方法的名字即可

D、 一个类的方法使用该类的另一个方法时可以直接引用方法名

20、 下列关于字符串的描叙中错误的是()(选择两项)

A、 字符串是对象

B、 String对象存储字符串的效率比StringBuffer高

C、 可以使用StringBuffer sb="这里是字符串"声明并初始化StringBuffer对象sb

D、 String类提供了许多用来操作字符串的方法:连接,提取,查询等

21、 以下()代码,能够对数组正确初始化(或者是默认初始化)。

A、 int[] a;

B、 a = {1, 2, 3, 4, 5};

C、 int[] a = new int[5]{1, 2, 3, 4, 5};

D、 int[] a = new int[5];

22、 score是一个整数数组,有五个元素,已经正确初始化并赋值,仔细阅读下面代码,程序运行结果是()

temp = score[0];

for (int index = 1;index < 5;index++) {

if (score[index] < temp) { temp = score[index]; }

}

A. 求最大数

B. 求最小数

C. 找到数组最后一个元素

D. 编译出错

23、 下面关于数组的说法中,错误的是()(选择两项)

A、 在类中声明一个整数数组作为成员变量,如果没有给它赋值,数值元素值为空 B、 数组可以在内存空间连续存储任意一组数据

C、 数组必须先声明,然后才能使用

D、 数组本身是一个对象

24、 在Java中下面代码是()条语句

int i;i=123;

int j=0,k=0;

System.out.println(i+";"+";"+j+""+k);

A、 3

B、 4

C、 5

D、 6

25、 在Java中,关于构造方法,下列说法错误的是( )

A、 构造方法的名称必须与类名相同

B、 构造方法可以带参数

C、 构造方法不可以重载

D、 构造方法绝对不能有返回值

26、 执行下面代码结果()

for(int i=0;😉{

System.out.println("这是 "+i); break;

}

A、 语法错误,缺少表达式2和表达式3

B、 死循环

C、 程序什么都不输出

D、 输出:这是0

27、 下面代码输出结果是()。

int i=0,s=0; do{ if (i%2 = = 0 ){ i++; continue; } i++; s = s + i; } while (i 应用层拿数据速度) 在这里插入图片描述

OSI 的七层模型都有哪些? 应用层:网络服务与最终用户的一个接口。 表示层:数据的表示、安全、压缩。 会话层:建立、管理、终止会话。 传输层:定义传输数据的协议端口号,以及流控和差错校验。 网络层:进行逻辑地址寻址,实现不同网络之间的路径选择。 数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能。 物理层:建立、维护、断开物理连接。get 和 post 请求有哪些区别? GET在浏览器回退时是无害的,而POST会再次提交请求。 GET产生的URL地址可以被Bookmark,而POST不可以。 GET请求会被浏览器主动cache,而POST不会,除非手动设置。 GET请求只能进行url编码,而POST支持多种编码方式。 GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。 GET请求在URL中传送的参数是有长度限制的,而POST么有。 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。 GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。 GET参数通过URL传递,POST放在Request body中。如何实现跨域? 方式一:图片ping或script标签跨域

图片ping常用于跟踪用户点击页面或动态广告曝光次数。 script标签可以得到从其他来源数据,这也是JSONP依赖的根据。

方式二:JSONP跨域

JSONP(JSON with Padding)是数据格式JSON的一种“使用模式”,可以让网页从别的网域要数据。根据 XmlHttpRequest 对象受到同源策略的影响,而利用

缺点:

只能使用Get请求 不能注册success、error等事件监听函数,不能很容易的确定JSONP请求是否失败 JSONP是从其他域中加载代码执行,容易受到跨站请求伪造的攻击,其安全性无法确保 方式三:CORS

Cross-Origin Resource Sharing(CORS)跨域资源共享是一份浏览器技术的规范,提供了 Web 服务从不同域传来沙盒脚本的方法,以避开浏览器的同源策略,确保安全的跨域数据传输。现代浏览器使用CORS在API容器如XMLHttpRequest来减少HTTP请求的风险来源。与 JSONP 不同,CORS 除了 GET 要求方法以外也支持其他的 HTTP 要求。服务器一般需要增加如下响应头的一种或几种:

1 Access-Control-Allow-Origin: * 2 Access-Control-Allow-Methods: POST, GET, OPTIONS 3 Access-Control-Allow-Headers: X-PINGOTHER, Content-Type 4 Access-Control-Max-Age: 86400

跨域请求默认不会携带Cookie信息,如果需要携带,请配置下述参数:

1 "Access-Control-Allow-Credentials": true 2 // Ajax设置 3 "withCredentials": true

方式四:window.name+iframe

window.name通过在iframe(一般动态创建i)中加载跨域HTML文件来起作用。然后,HTML文件将传递给请求者的字符串内容赋值给window.name。然后,请求者可以检索window.name值作为响应。

iframe标签的跨域能力; window.name属性值在文档刷新后依旧存在的能力(且最大允许2M左右)。 每个iframe都有包裹它的window,而这个window是top window的子窗口。contentWindow属性返回元素的Window对象。你可以使用这个Window对象来访问iframe的文档及其内部DOM。

1 6 7 8 9 var iframe = document.createElement('iframe'); 10 iframe.style.display = 'none'; // 隐藏 11 12 var state = 0; // 防止页面无限刷新 13 iframe.onload = function() { 14 if(state === 1) { 15 console.log(JSON.parse(iframe.contentWindow.name)); 16 // 清除创建的iframe 17 iframe.contentWindow.document.write(''); 18 iframe.contentWindow.close(); 19 document.body.removeChild(iframe); 20 } else if(state === 0) { 21 state = 1; 22 // 加载完成,指向当前域,防止错误(proxy.html为空白页面) 23 // Blocked a frame with origin "http://localhost:10000" from accessing a cross-origin frame. 24 iframe.contentWindow.location = 'http://localhost:10000/proxy.html'; 25 } 26 }; 27 28 iframe.src = 'http://localhost:10001'; 29 document.body.appendChild(iframe); 30 31 32 33 34 ... 35 36 window.name = JSON.stringify({a: 1, b: 2}); 37 38

方式五:window.postMessage()

HTML5新特性,可以用来向其他所有的 window 对象发送消息。需要注意的是我们必须要保证所有的脚本执行完才发送 MessageEvent,如果在函数执行的过程中调用了它,就会让后面的函数超时无法执行。

下述代码实现了跨域存储localStorage

1 6 7 8 9 10 11 12 function main() { 13 LSsetItem('test', 'Test: ' + new Date()); 14 LSgetItem('test', function(value) { 15 console.log('value: ' + value); 16 }); 17 LSremoveItem('test'); 18 } 19 20 var callbacks = {}; 21 window.addEventListener('message', function(event) { 22 if (event.source === frames['myPostMessage']) { 23 console.log(event) 24 var data = /^#localStorage#(\d+)(null)?#([\S\s]*)/.exec(event.data); 25 if (data) { 26 if (callbacks[data[1]]) { 27 callbacks[data[1]](data[2] === 'null' ? null : data[3]); 28 } 29 delete callbacks[data[1]]; 30 } 31 } 32 }, false); 33 34 var domain = '*'; 35 // 增加 36 function LSsetItem(key, value) { 37 var obj = { 38 setItem: key, 39 value: value 40 }; 41 frames['myPostMessage'].postMessage(JSON.stringify(obj), domain); 42 } 43 // 获取 44 function LSgetItem(key, callback) { 45 var identifier = new Date().getTime(); 46 var obj = { 47 identifier: identifier, 48 getItem: key 49 }; 50 callbacks[identifier] = callback; 51 frames['myPostMessage'].postMessage(JSON.stringify(obj), domain); 52 } 53 // 删除 54 function LSremoveItem(key) { 55 var obj = { 56 removeItem: key 57 }; 58 frames['myPostMessage'].postMessage(JSON.stringify(obj), domain); 59 } 60 61 62 63 64 window.addEventListener('message', function(event) { 65 console.log('Receiver debugging', event); 66 if (event.origin == 'http://localhost:10000') { 67 var data = JSON.parse(event.data); 68 if ('setItem' in data) { 69 localStorage.setItem(data.setItem, data.value); 70 } else if ('getItem' in data) { 71 var gotItem = localStorage.getItem(data.getItem); 72 event.source.postMessage( 73 '#localStorage#' + data.identifier + 74 (gotItem === null ? 'null#' : '#' + gotItem), 75 event.origin 76 ); 77 } else if ('removeItem' in data) { 78 localStorage.removeItem(data.removeItem); 79 } 80 } 81 }, false); 82

注意Safari一下,会报错:

Blocked a frame with origin “http://localhost:10001” from accessing a frame with origin “http://localhost:10000“. Protocols, domains, and ports must match.

避免该错误,可以在Safari浏览器中勾选开发菜单==>停用跨域限制。或者只能使用服务器端转存的方式实现,因为Safari浏览器默认只支持CORS跨域请求。

方式六:修改document.domain跨子域

前提条件:这两个域名必须属于同一个基础域名!而且所用的协议,端口都要一致,否则无法利用document.domain进行跨域,所以只能跨子域

在根域范围内,允许把domain属性的值设置为它的上一级域。例如,在”aaa.xxx.com”域内,可以把domain设置为 “xxx.com” 但不能设置为 “xxx.org” 或者”com”。

现在存在两个域名aaa.xxx.com和bbb.xxx.com。在aaa下嵌入bbb的页面,由于其document.name不一致,无法在aaa下操作bbb的js。可以在aaa和bbb下通过js将document.name = ‘xxx.com’;设置一致,来达到互相访问的作用。

方式七:WebSocket

WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信,同时允许跨域通讯,是server push技术的一种很棒的实现。相关文章,请查看:WebSocket、WebSocket-SockJS

需要注意:WebSocket对象不支持DOM 2级事件侦听器,必须使用DOM 0级语法分别定义各个事件。

方式八:代理

同源策略是针对浏览器端进行的限制,可以通过服务器端来解决该问题

DomainA客户端(浏览器) ==> DomainA服务器 ==> DomainB服务器 ==> DomainA客户端(浏览器)

来源:blog.csdn.net/ligang2585116/article/details/73072868

87.说一下 JSONP 实现原理? jsonp 即 json+padding,动态创建script标签,利用script标签的src属性可以获取任何域下的js脚本,通过这个特性(也可以说漏洞),服务器端不在返货json格式,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。

九、设计模式 88. 说一下你熟悉的设计模式? 参考:常用的设计模式汇总,超详细!

简单工厂和抽象工厂有什么区别? 简单工厂模式:

这个模式本身很简单而且使用在业务较简单的情况下。一般用于小项目或者具体产品很少扩展的情况(这样工厂类才不用经常更改)。

它由三种角色组成:

工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,根据逻辑不同,产生具体的工厂产品。如例子中的Driver类。 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。如例中的Car接口。 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现,如例子中的Benz、Bmw类。 来用类图来清晰的表示下的它们之间的关系: ​在这里插入图片描述

抽象工厂模式:

先来认识下什么是产品族: 位于不同产品等级结构中,功能相关联的产品组成的家族。 在这里插入图片描述

图中的BmwCar和BenzCar就是两个产品树(产品层次结构);而如图所示的BenzSportsCar和BmwSportsCar就是一个产品族。他们都可以放到跑车家族中,因此功能有所关联。同理BmwBussinessCar和BenzBusinessCar也是一个产品族。

可以这么说,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。

而且使用抽象工厂模式还要满足一下条件:

系统中有多个产品族,而系统一次只可能消费其中一族产品 同属于同一个产品族的产品以其使用。 来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):

抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。 十、Spring / Spring MVC 90. 为什么要使用 spring? 1.简介

目的:解决企业应用开发的复杂性 功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能 范围:任何Java应用 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

2.轻量

从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。

3.控制反转

Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。

4.面向切面

Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

5.容器

Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。

6.框架

Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。

所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。

解释一下什么是 aop? AOP(Aspect-Oriented Programming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

而AOP技术则恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。

使用“横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。Aop 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。正如Avanade公司的高级方案构架师Adam Magee所说,AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。”

解释一下什么是 ioc? IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”。

1996年,Michael Mattson在一篇有关探讨面向对象框架的文章中,首先提出了IOC 这个概念。对于面向对象设计及编程的基本思想,前面我们已经讲了很多了,不再赘述,简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。

IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦。如下图:

在这里插入图片描述

大家看到了吧,由于引进了中间位置的“第三方”,也就是IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了,全部对象的控制权全部上缴给“第三方”IOC容器,所以,IOC容器成了整个系统的关键核心,它起到了一种类似“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用,如果没有这个“粘合剂”,对象与对象之间会彼此失去联系,这就是有人把IOC容器比喻成“粘合剂”的由来。

我们再来做个试验:把上图中间的IOC容器拿掉,然后再来看看这套系统:

我们现在看到的画面,就是我们要实现整个系统所需要完成的全部内容。这时候,A、B、C、D这4个对象之间已经没有了耦合关系,彼此毫无联系,这样的话,当你在实现A的时候,根本无须再去考虑B、C和D了,对象之间的依赖关系已经降低到了最低程度。所以,如果真能实现IOC容器,对于系统开发而言,这将是一件多么美好的事情,参与开发的每一成员只要实现自己的类就可以了,跟别人没有任何关系!

我们再来看看,控制反转(IOC)到底为什么要起这么个名字?我们来对比一下:

软件系统在没有引入IOC容器之前,如图1所示,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。

软件系统在引入IOC容器之后,这种情形就完全改变了,如图3所示,由于IOC容器的加入,对象A与对象B之间失去了直接联系,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。

通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。

spring 有哪些主要模块? Spring框架至今已集成了20多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。

在这里插入图片描述

更多信息:howtodoinjava.com/java-spring-framework-tutorials/

spring 常用的注入方式有哪些? Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:

构造方法注入 setter注入 基于注解的注入 95. spring 中的 bean 是线程安全的吗? Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。

spring 支持几种 bean 的作用域? 当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下5种作用域:

singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例 prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例 request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效 session:对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效 globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效 其中比较常用的是singleton和prototype两种作用域。对于singleton作用域的Bean,每次请求该Bean都将获得相同的实例。容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为;如果一个Bean被设置成prototype作用域,程序每次请求该id的Bean,Spring都会新建一个Bean实例,然后返回给程序。在这种情况下,Spring容器仅仅使用new 关键字创建Bean实例,一旦创建成功,容器不在跟踪实例,也不会维护Bean实例的状态。

如果不指定Bean的作用域,Spring默认使用singleton作用域。Java在创建Java实例时,需要进行内存申请;销毁实例时,需要完成垃圾回收,这些工作都会导致系统开销的增加。因此,prototype作用域Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成功,可以重复使用。因此,除非必要,否则尽量避免将Bean被设置成prototype作用域。

spring 自动装配 bean 有哪些方式? Spring容器负责创建应用程序中的bean同时通过ID来协调这些对象之间的关系。作为开发人员,我们需要告诉Spring要创建哪些bean并且如何将其装配到一起。

spring中bean装配有两种方式:

隐式的bean发现机制和自动装配 在java代码或者XML中进行显示配置 当然这些方式也可以配合使用。

spring 事务实现方式有哪些? 编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。 基于 TransactionProxyFactoryBean 的声明式事务管理 基于 @Transactional 的声明式事务管理 基于 Aspectj AOP 配置事务说一下 spring 的事务隔离? 事务隔离级别指的是一个事务对数据的修改与另一个并行的事务的隔离程度,当多个事务同时访问相同数据时,如果没有采取必要的隔离机制,就可能发生以下问题:

脏读:一个事务读到另一个事务未提交的更新数据。 幻读:例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样。 不可重复读:比方说在同一个事务中先后执行两条一模一样的select语句,期间在此次事务中没有执行过任何DDL语句,但先后得到的结果不一致,这就是不可重复读。 100. 说一下 spring mvc 运行流程? Spring MVC运行流程图:

Spring运行流程描述: 在这里插入图片描述

用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;

DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;

DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter;(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)

提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:

HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等 数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中 5. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;

根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;

ViewResolver 结合Model和View,来渲染视图;

将渲染结果返回给客户端。

spring mvc 有哪些组件? Spring MVC的核心组件:

DispatcherServlet:中央控制器,把请求给转发到具体的控制类 Controller:具体处理请求的控制器 HandlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略 ModelAndView:服务层返回的数据和视图层的封装类 ViewResolver:视图解析器,解析具体的视图 Interceptors :拦截器,负责拦截我们定义的请求然后做处理工作 102. @RequestMapping 的作用是什么? RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

RequestMapping注解有六个属性,下面我们把她分成三类进行说明。

value, method:

value:指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明); method:指定请求的method类型, GET、POST、PUT、DELETE等; consumes,produces

consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html; produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回; params,headers

params: 指定request中必须包含某些参数值是,才让该方法处理。 headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。

证书面貌

还不赶快来试试呢!🤭 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3