Springboot框架面试点
Springboot框架一.什么是SpringbootSpringboot是一款基于Spring框架开发的轻量级、约定大于配置的快速开发框架它的核心目标是简化Spring应用搭建、开发、部署和运维的流程。它封装了大量Spring的底层细节通过自动配置、起步依赖Starter 引入相关的依赖包等机制让开发者无须手动编写繁琐的XML配置和大量的java配置就能单独搭建一个可单独运行的Spring应用它内置了tomcat默认web容器也可以选择其他的二.Springboot的核心优势有哪些1.开箱即用无需手动配置spring核心组件引入对应的starter依赖spring-boot-starter-web,框架会自动完成核心组件的初始化和配置框架快速搭建2.约定大于配置框架内置了大量的默认配置如默认加载resource下面的application.yml或者properties文件默认扫描规则默认使用tomcat3.内置嵌入式容器内置tomcat的web容器也可以使用jetty、undertow等web容器不需要手动部署外部容器打包直接执行“java -jar xxx.jar ”运行如果后台运行需要使用nohup命令。4.起步依赖将一些常用的功能依赖一起整合为一个Starter开发这只需要引入一个Stater不用手动管理版本依赖和依赖冲突。5.简化运维监控内置了actuator可快速实现应用健康检查指标监控日志管理和spring cloud的无缝衔接。6.基于注解驱动使用大量注解无需配置大量xml不同点Springbootspring依赖管理Starter整合依赖自动版本管理减少依赖冲突需要手动引入依赖需要手动管理依赖冲突配置管理注解自动配置需要少量自定义配置无需XML以XML配置为主需要编写大量的配置如事务bean的初始化事务MVC部署容器内置tomcat默认容器可打jar包命令直接运行兼容war包需要打war包部署到外部的web容器开发效率开箱即用快速搭建开发效率高项目搭建配置时间长依赖版本管理繁琐开发周期长启动方式需要依赖外部容器或者手动启动ApplicationContext直接通过main方法启动内置容器启动初始化上下文运维成本内置Actuator一键实现健康检查监控需要手动开发运维功能没有内置监控组件微服务适配与Spring Cloud无缝适配需要整合第三方组件三、spring和springboot对比总结1.springboot不是对spring的替代是对spring框架的增强和封装核心是通过预定大于配置和自动配置简化spring的开发2.核心优势在于提高开发效率简化配置和运维以及适配微服务架构3.与spring的核心差异在于配置方式依赖管理不是方式本质是通过封装减少开发者的重复工作让开发者关注业务实现。四、Springboot的核心注解有哪些作用是什么1.springboot最核心注解SpringBootApplicationSpringBootApplication本质是组合注解SpringBootConfiguration EnableAutoConfiguration ComponentScan 注解说明SpringBootConfiguration管理配置的注解EnableAutoConfiguration开启自动配置的注解ComponentScan包扫描的配置源码//// Source code recreated from a .class file by IntelliJ IDEA// (powered by FernFlower decompiler)//package org.springframework.boot.autoconfigure;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;import org.springframework.beans.factory.support.BeanNameGenerator;import org.springframework.boot.SpringBootConfiguration;import org.springframework.boot.context.TypeExcludeFilter;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.FilterType;import org.springframework.context.annotation.ComponentScan.Filter;import org.springframework.core.annotation.AliasFor;Target({ElementType.TYPE})Retention(RetentionPolicy.RUNTIME)DocumentedInheritedSpringBootConfigurationEnableAutoConfigurationComponentScan(excludeFilters {Filter(type FilterType.CUSTOM,classes {TypeExcludeFilter.class}), Filter(type FilterType.CUSTOM,classes {AutoConfigurationExcludeFilter.class})})public interface SpringBootApplication {AliasFor(annotation EnableAutoConfiguration.class)Class?[] exclude() default {};AliasFor(annotation EnableAutoConfiguration.class)String[] excludeName() default {};AliasFor(annotation ComponentScan.class,attribute basePackages)String[] scanBasePackages() default {};AliasFor(annotation ComponentScan.class,attribute basePackageClasses)Class?[] scanBasePackageClasses() default {};AliasFor(annotation ComponentScan.class,attribute nameGenerator)Class? extends BeanNameGenerator nameGenerator() default BeanNameGenerator.class;AliasFor(annotation Configuration.class)boolean proxyBeanMethods() default true;}2.常用核心组件a.Web开发核心组件注解RestController(ControllerResponesBody),标识当前类是Restful风格的控制器直接将结果转为一个JSON返回给前端Controller标识类为Spring MVC的控制器处理HTTPResponseBody将方法返回值直接转换JSON/XML等格式响应给客户端RequestMaping以及衍生的注解 GetMapping处理GET请求PostMapping处理POST请求PutMapping处理PUT请求DeleteMapping处理DELETE请求b.配置和bean管理注解Configuration 标识类为配置类替代传统的XML配置Bean标注在方法上将方法返回值注册为Spring容器的bean默认名称为方法名Autowired: 可标注在属性、构造方法 、setter方法上Value:读取配文件的值ConfigurationProperties 配置文件的值绑定到java对象中c.条件注解Conditional满足条件才会注册到bean容器中五、Springboot的自动装配原理Springboot的自动配置本质基于约定大于配置通过路径扫描自动配置条件化配置1.大量的自动配置类spring-boot-autoconfiguration包中xxxAutoConfiguration类有web的、 缓 存的数据源的如WebMvcAutoConfiguration,DataSourceAutoConfiguration2.使用EnableAutoConfiguration注解激活启动注解SpringBootApplication内置了启动的 时候会自动触发自动配置流程。3.加载resource/META-INFO/spring/org.springframework.boot.autoconfiguration.imports(老 的版本可以查看官方文档)下面的列出的所有内置自动配置类全限定名会通过Loader加载到容器中4.过滤条件化配置 如注解Conditional注解5.用户配置的优先级高于自动配置自动装配的核心原理图解如下六、SpringBoot Stater机制是什么机制是约定大于配置的核心思想一站式整合包七、SpringBoot中的Bean加载顺序如何控制有几种方式Spring容器默认加载Bean的顺序不固定。SpringBoot提供了多种方式来控制Bean的加载优先顺序。1.依赖关系驱动2.使用DependsOn注解3.实现Order接口或者Order注解 数字越小优先级越高Order可用于类方法但是仅对BeanPostProcessor,CommandLineRuner等扩展点生效对普通的 Component注解Bean加载不生效Order接口和注解差不多可以动态返回优先级。八、SpringBoot如何实现全局异常处理ControllerAdvice/RestControllerAdvice/ExceptionHander参考样例1.统一响应结构public class ResultT {private Integer code;private String message;private T data;// 省略构造、getter/setter、静态成功/失败方法public static T ResultT success(T data) {ResultT result new Result();result.setCode(200);result.setMessage(success);result.setData(data);return result;}public static T ResultT error(Integer code, String message) {ResultT result new Result();result.setCode(code);result.setMessage(message);return result;}}2.自定义业务异常类public class BusinessException extends RuntimeException {private Integer code;public BusinessException(String message) {super(message);this.code 500;}public BusinessException(Integer code, String message) {super(message);this.code code;}// getter}3.全局异常处理器import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.validation.BindException;import org.springframework.validation.FieldError;import org.springframework.web.bind.MethodArgumentNotValidException;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.validation.ConstraintViolation;import javax.validation.ConstraintViolationException;import java.util.stream.Collectors;RestControllerAdvicepublic class GlobalExceptionHandler {private static final Logger log LoggerFactory.getLogger(GlobalExceptionHandler.class);/*** 处理自定义业务异常*/ExceptionHandler(BusinessException.class)public ResultVoid handleBusinessException(BusinessException e) {log.warn(业务异常: {}, e.getMessage());return Result.error(e.getCode(), e.getMessage());}/*** 处理参数校验异常Valid 注解的实体*/ExceptionHandler(MethodArgumentNotValidException.class)public ResultVoid handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {String message e.getBindingResult().getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.joining(; ));log.warn(参数校验失败: {}, message);return Result.error(400, message);}/*** 处理普通参数校验异常RequestParam 等直接校验*/ExceptionHandler(ConstraintViolationException.class)public ResultVoid handleConstraintViolationException(ConstraintViolationException e) {String message e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(; ));log.warn(参数校验失败: {}, message);return Result.error(400, message);}/*** 处理绑定异常比如表单数据绑定到对象失败*/ExceptionHandler(BindException.class)public ResultVoid handleBindException(BindException e) {String message e.getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.joining(; ));log.warn(参数绑定异常: {}, message);return Result.error(400, message);}/*** 兜底处理所有未捕获的异常*/ExceptionHandler(Exception.class)public ResultVoid handleException(Exception e) {log.error(系统异常: , e);return Result.error(500, 服务器内部错误请稍后重试);}}4.在 Controller 中使用RestControllerRequestMapping(/user)public class UserController {PostMapping(/add)public ResultString addUser(Valid RequestBody UserAddDto dto) {// 业务逻辑return Result.success(添加成功);}}