SpringBoot 常见面试题
1,什么是springboot? springboot 有什么优点?
简介: Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。
优点:
- 简化配置
- 首先是他简化了 搭建 spring 环境的各种配置,使用 约定大于配置 的思想来帮助开发人员快速的搭建一个企业级的 spring 程序,因为开发人员只需要引入starters , spring boot 就可以自动依赖所有的相关依赖.简化了 maven 的配置.
- 独立运行
- Spring Boot而且内嵌了各种servlet容器,Tomcat、Jetty等,现在不再需要打成war包部署到容器中,Spring Boot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内。
- 自动配置
- Spring Boot能根据当前类路径下的类、jar包来自动配置bean,如添加一个spring-boot-starterweb启动器就能拥有web的功能,无需其他配置。
- 无代码生成和XML配置
- Spring Boot配置过程中无代码生成,也无需XML配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是Spring4.x的核心功能之一。
- 应用监控
- Spring Boot提供一系列端点可以监控服务及应用,做健康检测。
2, springBoot 的核心注解?
@SpringBootApplication
-
这是Spring主类上最最最核心的注解,用于 自动化配置文件,表示这是一个SpringBoot项目,用于开启 SpringBoot 的各项能力。
相当于
-
@SpringBootConfigration :
@Configuration
注解的变体,只是用来修饰Spring Boot的配置而已。@Configuration
: 用来代替applicationContext.xml 配置文件,所有这个配置文件里面能做到的事情都可以通过这个注解所在的类来进行注册。
-
@EnableAutoConfiguration:
- 允许 SpringBoot 自动配置注解,开启这个注解之后,SpringBoot就能根据当前类路径下的包或者类来配置Spring Bean。
- 例如: 当前路径下有MyBatis这个Jar包,MyBatisAutoConfiguration 注解就能根据相关参数来配置Mybatis的各个Spring Bean。
-
@ComponentScan
- Spring 3.1添加的一个注解,用来代替配置文件中的component-scan配置,开启组件扫描,自动扫描包路径下的
@Component
注解进行注册 bean实例放到context(容器)中。
- Spring 3.1添加的一个注解,用来代替配置文件中的component-scan配置,开启组件扫描,自动扫描包路径下的
-
-
@ResponseBody
@ResponseBody
标记的控制方法,会将方法返回值通过springboot默认的转换器进行转换,然后附加在响应体中,最后IO回写给调用方 :
@ResponseBody
若标记在控制类上,则相当于对该类中所有的控制方法全部标记该注解。
@ResponseBody
标记的控制方法不使用视图解析器,即不进行页面的跳转。
-
@RequestMapping
- 配置方法URL。
-
@RestController
@RestController
整合了@Controller
和@ResponseBody
两个注解- 这个注解 的作用就是:
- 会将方法返回值通过springboot默认的转换器进行转换,然后附加在响应体中,最后IO回写给调用方,并且不会进行页面的跳转
- 加入 spring 的管理
-
@RequestParam
- 控制方法允许直接使用
@RequestParam
标记的形参来接收请求参数
- 控制方法允许直接使用
-
@PathVariable
- 控制方法允许直接使用
@PathVariable
标记的形参来接收请求头中的路径参数。
- 控制方法允许直接使用
-
@RequestHeader
- 控制方法允许直接使用
@RequestHeader
标记的形参来接收请求头中的指定参数。
- 控制方法允许直接使用
-
@CookieValue
- 控制方法允许直接使用
@CookieValue
标记的形参来接收请求中的Cookie参数
- 控制方法允许直接使用
springBoot自动化配置原理?
结论:
@SpringBootApplication
等同于下面三个注解:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
其中
@EnableAutoConfiguration
是关键(启用自动配置),内部实际上就去加载
META-INF/spring.factories
文件的信息,然后筛选出以EnableAutoConfiguration
为key的数据,加载到IOC容器中,实现自动配置功能!
详解:
我们在搭建 springboot 环境的时候, 除了spring boot 的依赖之外, 就是在main 方法上面挂了一个
@SpringBootApplication
的注解,然后我们的springboot 程序就可以跑起来了.这个注解里面包含三个重要的注解:
@SpringBootConfiguration
:我们点进去以后可以发现底层是Configuration注解,说白了就是支持JavaConfig(配置类) 的方式来进行配置(使用Configuration配置类等同于XML文件)。@EnableAutoConfiguration
:开启自动配置功能(后文详解)@ComponentScan
:这个注解,学过Spring的同学应该对它不会陌生,就是扫描注解,默认是扫描当前类下的package。将@Controller/@Service/@Component/@Repository
等注解加载到IOC容器中。重点
EnableAutoConfiguration
我们知道SpringBoot可以帮我们减少很多的配置,也肯定听过“约定大于配置”这么一句话
那SpringBoot是怎么做的呢?其实靠的就是
@EnableAutoConfiguration
注解。简单来说,这个注解可以帮助我们自动载入应用程序所需要的所有默认配置。
这个注解点进去可以发现这两个注解:
@AutoConfigurationPackage
:自动配置包@Import
:给IOC容器导入组件点进
@AutoConfigurationPackage
里面发现还是@Import
进入到
@Import
里面查看发现最核心的代码:@Override public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { register(registry, new PackageImport(metadata).getPackageName()); }
在默认的情况下就是将:主配置类(
@SpringBootApplication
)的所在包及其子包里边的组件扫描到Spring容器中。也许你会问:这个不就是 ComponentScan的功能吗?
比如说,
你用了Spring Data JPA,可能会在实体类上写
@Entity
注解。这个@Entity
注解由@AutoConfigurationPackage
扫描并加载,而我们平时开发用的
@Controller/@Service/@Component/@Repository
这些注解是由ComponentScan
来扫描并加载的。他们的区别: 同样是扫描包 但是他们 扫描的对象是不一样的。
服务器运行Springboot 项目一般有哪些方式?
springboot项目运行有两种方式,一种是
jar
包(官方推荐),一种是war
包。jar包 : 相对简单,直接使用 springboot 内置的tomcat 服务器就可以运行
war包: 需要部署到单独的tomcat 服务器上.
SpringBoot 读取配置的三种方式?
@Value : 是比较常见的注入方式,功能强大但一般可读性较差。
Environment : 通过注入获取Environment对象,然后再获取定义在配置文件的属性值:
@Resource private Environment environment; public void getAttrByEnvironment() { String property = environment.getProperty(SPRING_BOOT_HELLO); System.out.println("2-1. 通过注入Environment获取值: " + property); }
使用
@ConfigurationProperties
注解映射到bean
中,定义一个User对象里面有name
和age
属性,在配置文件里使用spring.user
作为prefix
,为User
增加对应注解即可详情请点击 : https://cloud.tencent.com/developer/article/1343830
请谈谈对 SpringBoot 和 SpringCloud 的理解
保护SpringBoot 应用有哪些方法?
答案: https://cloud.tencent.com/developer/article/1461871
1、 在生产中使用HTTPS
2、 使用Snyk检查你的依赖关系
- 官网地址:https://app.snyk.io/org
在现在的开发中,不管是用什么语言,什么技术栈,我们都会用到很多的开源框架和包。从安全角度讲,这也变相的等于说我们信任陌生的开发者,信任其安全技术水平和相信他没有恶意。在关键业务系统中,仅凭信任肯定不靠谱的。Snky就是用来检查你的依赖包安全漏洞的工具,确保你放心引用各种开源依赖包到你的工程3、 升级到最新版本
4、 启用CSRF保护 (https://tech.meituan.com/2018/10/11/fe-security-csrf.html) (推荐看一下)
- 防护策略
------------------------------**什么是CSRF**------------------------------------- CSRF(Cross-site request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站&