Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day9】 —— SpringBoot1

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

12、@Bean

相当于XML中的,放在方法的上面,而不是类,意思是产生一个bean,并交给spring管理。

13、@AutoWired

byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。

当加上(required=false)时,就算找不到bean也不报错。

14、@RequestMapping

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

追问2:@RequestMapping注解的属性有哪些?分别都是干什么用的?

RequestMapping接口源码解析

RequestMapping接口的源码如下,里面定义了八个属性(Spring4.3.8)。

注:SpringMVC在4.1版本对RequestMapping属性做了相应调整,去掉了path属性。

@Target({ElementType.METHOD, ElementType.TYPE}) // 可以在方法和类的声明中使用

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Mapping

public @interface RequestMapping {

String name() default “”;// 指定映射的名称

@AliasFor(“path”)

String[] value() default {}; // 指定请求路径的地址

@AliasFor(“value”)

String[] path() default {}; // 指定请求路径的地址

// 指定请求的方式,是一个RequsetMethod数组,可以配置多个方法

RequestMethod[] method() default {};

// 指定参数的类型

String[] params() default {};

// 指定请求头内容

String[] headers() default {};

// 指定数据请求的格式

String[] consumes() default {};

// 指定返回的内容类型

String[] produces() default {};

}

  • 如上源码所示,在@Target中有两个属性,分别为 ElementType.METHOD 和 ElementType.TYPE ,也就是说@RequestMapping 可以在方法和类的声明中使用

  • 可以看到注解中的属性除了 name() 返回的字符串,其它的方法均返回数组,也就是可以定义多个属性值,例如 value() 和 path() 都可以同时定义多个字符串值来接收多个URL请求

RequestMapping属性介绍

1、name

此处name属性,相当于方法的注释,使方法更易理解

@RequestMapping(value = “login”,name = “用户登录”)

@ResponseBody

public String login() {

return “success”;

}

官方文档说:它能让你非常方便的在JSP页面上使用它,形如这样子可以直接通过静态页面调用:

<%@ taglib uri=“http://www.springframework.org/tags” prefix=“s” %>

Get Address

2、value

@Controller

@RequestMapping(“user”) //此处如果不省略,则为@RequestMapping(value=“user”)

public class UserController {

@RequestMapping(“login”)

@ResponseBody

public String login() {

return “success”;

}

}

指定请求的实际地址,指定的地址可以是URI 模板模式(Template Pattern);

由于value属性是@RequestMapping注释的默认属性,因此如果只有唯一的属性,则可以省略该属性名,如果有超过一个属性,则必须写上value属性名称。即如下两个标注含义一样

@RequestMapping(value=“login”)

@RequestMapping(“login”)

value属性支持通配符匹配:

@RequestMapping(value=“login/*”);

即:http://localhost:8080/login/1或者http://localhost:8080/login/hahaha都能够正常访问该接口

此处通过URL:http://localhost:8080/user/login进行访问,将由login()方法进行处理

3、path

与value同义,path(value)(path 和 value 互相引用,参见RequestMapping接口源码)

path属性,和1中的value属性使用一致,两者都是用来作为映射使用的。

@RequestMapping(value=“login”)、@RequestMapping(path=“login”),这两种情况都能对login()方法进行访问

path属性支持通配符匹配:

@RequestMapping(path=“login/*”);

即:http://localhost:8080/login/1或者http://localhost:8080/login/abc都能够正常访问

4、method

指定请求类型, 如GET、POST、PUT、DELETE等;

@RequestMapping(value = “login”,method = RequestMethod.GET)

@ResponseBody

public String login() {

return “success”;

}

以上方法表示,该方法只支持GET请求。

此处也可以为

@RequestMapping(value = “login”,method = {RequestMethod.GET,RequestMethod.POST})

说明该方法可以同时支持GET和POST请求。

如果没有method属性,则说明该方法支持全部的HTTP请求。

5、params

该属性指定,请求中必须包含params属性规定的参数时,才能执行该请求

@RequestMapping(value = “login”,params = “flag”)

@ResponseBody

public String login() {

return “success”;

}

以上方法,说明请求中必须包含flag参数才能执行该请求,flag参数值不做要求

  • http://localhost:8080/login?flag=xxx // 正常访问

  • http://localhost:8080/login // 无法访问

@RequestMapping(value = “login”,params = “flag=true”)

@ResponseBody

public String login() {

return “success”;

}

以上方法,说明请求中必须包含flag参数,而且参数值必须为true才能执行该请求

  • http://localhost:8080/login?flag=true // 正常访问

  • http://localhost:8080/login?flag=false // 无法访问

  • http://localhost:8080/login // 无法访问

6、headers

  • 用于HTTP协义交互的信息被称为HTTP报文,客户端发送的HTTP报文被称为请求报文,服务器发回给客户端的HTTP报文称为响应报文,报文由报文头部和报文体组成。

  • 请求头部(Request Headers):请求头包含许多有关客户端环境和请求正文的信息,例如浏览器支持的语言、请求的服务器地址、客户端的操作系统等。

  • 响应头部(Rsponse Headers):响应头也包含许多有用的信息,包括服务器类型、日期、响应内容的类型及编码,响应内容的长度等等。

该属性指定,请求中必须包含某些指定的header值,才能够让该方法处理请求

如Chrome浏览器:

可以通过点击F12(进入开发者模式)---->Network---->Name中点击网页---->右侧查看Headers即可,下边是我电脑中的一个请求头部示例:

Request Headers

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8

Accept-Encoding:gzip, deflate, sdch

Accept-Language:zh-CN,zh;q=0.8

Cache-Control:max-age=0

Connection:keep-alive

Cookie:JSESSIONID=210075B5E521CWE3CDE938076295A57A

Host:localhost:8080

Upgrade-Insecure-Requests:1

User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93

// 表示只接收本机发来的请求

@RequestMapping(path = “/login”, headers=“Referer=http://localhost:8080”)

public String login() {

return “success”;

}

以上方法 ,必须满足请求的header中包含了指定的"Referer"请求头和值为"http://localhost:8080"时,才能执行该请求

7、consumes

指定处理请求的提交内容类型(Content-Type),例如:application/json、text/html时,才能够让该方法处理请求

@RequestMapping(value = “login”,consumes = “application/json”)

@ResponseBody

public String login() {

return “success”;

}

8、produces

指定返回的内容类型,返回的内容类型必须是request请求头(Accept)中所包含的类型

@RequestMapping(value = “login”,produces = “application/json”)

@ResponseBody

public String login() {

return “success”;

}

此外,produces属性还可以指定返回值的编码

@RequestMapping(value = “login”,produces = “application/json,charset=utf-8”)

如上,则指明返回utf-8编码


在这里插入图片描述

课间休息,又来秀一下来自咱们群里同学的搬砖工地,坐标:上海


面试题2:SpringBoot 打成的 jar 包和普通的 jar 包有什么区别

=======================================================================================================

正经回答:


Spring Boot 中默认打包成的 jar 叫做可执行 jar,这种jar包可以通过可以通过命令(java -jar xxx.jar)来运行的,但这种jar包不能被其他项目所依赖,因为它和普通 jar 的结构不同,即使被依赖了也不能直接使用其中的类。

在这里插入图片描述

普通的jar包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot 打包成的可执行 jar 解压后,在 \BOOT-INF\classes 目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在 pom.xml 文件中增加配置,将 Spring Boot 项目打包成两个 jar ,一个可执行,一个可引用。

在这里插入图片描述

深入追问:


追问1:如何让SpringBoot打的jar包可依赖?

在pom文件中增加以下配置:

org.springframework.boot

spring-boot-maven-plugin

repackage

exec

maven-compiler-plugin

1.8

1.8

  • 如下图,一次性打包生成两个jar,其中XXX.jar可被其它工程依赖,XXX-exec.jar可执行。

在这里插入图片描述


在这里插入图片描述

今天没有群里老铁们投稿插图,难受~


面试题3:CORS跨域问题是怎么引起的呢?

====================================================================================

正经回答:


Springboot跨域问题,是当前主流web开发人员都绕不开的难题。但我们首先要明确以下几点

  • 跨域只存在于浏览器端,不存在于安卓/ios/Node.js/python/ java等其它环境
  • 跨域请求能发出去,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了。
  • 之所以会跨域,是因为受到了同源策略的限制,同源策略要求源相同才能正常进行通信,即协议、域名、端口号都完全一致。

浏览器出于安全的考虑,使用 XMLHttpRequest对象发起 HTTP请求时必须遵守同源策略,否则就是跨域的HTTP请求,默认情况下是被禁止的。换句话说,浏览器安全的基石是同源策略。

同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。

在这里插入图片描述

报错内容:

Access to XMLHttpRequest at ‘http://192.168.1.1:8080/app/easypoi/importExcelFile’

from origin ‘http://localhost:8080’ has been blocked by CORS policy:

No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

什么是CORS?

CORS是一个W3C标准,全称是”跨域资源共享”(Cross-origin resource sharing),允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

它通过服务器增加一个特殊的Header[Access-Control-Allow-Origin]来告诉客户端跨域的限制,如果浏览器支持CORS、并且判断Origin通过的话,就会允许XMLHttpRequest发起跨域请求。

CORS Header

  • Access-Control-Allow-Origin: http://www.xxx.com

  • Access-Control-Max-Age:86400

  • Access-Control-Allow-Methods:GET, POST, OPTIONS, PUT, DELETE

  • Access-Control-Allow-Headers: content-type

  • Access-Control-Allow-Credentials: true

含义解释:

| CORS Header属性 | 解释 |

| — | — |

| Access-Control-Allow-Origin | 允许http://www.xxx.com域(自行设置,这里只做示例)发起跨域请求 |

| Access-Control-Max-Age | 设置在86400秒不需要再发送预校验请求 |

| Access-Control-Allow-Methods | 设置允许跨域请求的方法 |

| Access-Control-Allow-Headers | 允许跨域请求包含content-type |

| Access-Control-Allow-Credentials | 设置允许Cookie |

深入追问:


追问1:处理过Springboot的CORS跨域问题么?怎么解决的?

方法一、直接采用SpringBoot的注解@CrossOrigin(也支持SpringMVC)

简单粗暴的方式,Controller层在需要跨域的类或者方法上加上该注解即可

/**

  • Created with IDEA

  • @Author Chensj

  • @Date 2020/5/8 10:28

  • @Description xxxx控制层

  • @Version 1.0

*/

@RestController

@CrossOrigin

@RequestMapping(“/situation”)

public class SituationController extends PublicUtilController {

@Autowired

private SituationService situationService;

// log日志信息

private static Logger LOGGER = Logger.getLogger(SituationController.class);

}

但每个Controller都得加,太麻烦了,怎么办呢,加在Controller公共父类(PublicUtilController)中,所有Controller继承即可。

/**

  • Created with IDEA

  • @Author Chensj

  • @Date 2020/5/6 10:01

  • @Description

  • @Version 1.0

*/

@CrossOrigin

public class PublicUtilController {

《MySql面试专题》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySql性能优化的21个最佳实践》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySQL高级知识笔记》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关注我,点赞本文给更多有需要的人

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
)]

[外链图片转存中…(img-e1fLbWzi-1713547518083)]

《MySQL高级知识笔记》

[外链图片转存中…(img-zpCeKWED-1713547518083)]

[外链图片转存中…(img-yH2rTOIu-1713547518084)]

[外链图片转存中…(img-YuzTiA0s-1713547518084)]

[外链图片转存中…(img-qw6htxDg-1713547518084)]

[外链图片转存中…(img-9IJoNgFa-1713547518084)]

[外链图片转存中…(img-22bFOAb8-1713547518085)]

[外链图片转存中…(img-LSXKfD70-1713547518085)]

[外链图片转存中…(img-ncArsn8T-1713547518085)]

[外链图片转存中…(img-nEXPdadl-1713547518086)]

[外链图片转存中…(img-kLwXwQOD-1713547518086)]

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

[外链图片转存中…(img-NSn8C26S-1713547518086)]

关注我,点赞本文给更多有需要的人

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-DSYohMIX-1713547518087)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值