面试宝典-【SpringBoot】

目录

1.说一下SpringBoot?

2.springboot的优点?

3.springboot如何创建bean对象?

4.说一下springboot中的条件装配?

5.如何xml配置导入到springboot中?

6.如何将配置文件和javaBean进行绑定?

7.springboot自动配置的原理?

8. springboot启动方式?

9.什么是yml?

10.Spring Boot 是否可以使用 XML 配置 ?

11.如何访问静态资源?

12.如何改变静态资源访问前缀?

13.静态资源配置原理?

14.请求映射的原理?

15.springboot可以接受的传参类型?

16.springboot 请求参数处理的原理?

17.SpringBoot热部署有哪些方式?

18. 什么是 Spring Profiles?

19.如何使用 Spring Boot 实现全局异常处理?

20.Spring Boot 中如何解决跨域问题 ?

21.spring-boot-starter-parent 有什么用 ? 

 22.SpringBoot启动过程?

23.SpringBoot启动原理?

24.SpringBoot如何实现打包?


1.说一下SpringBoot?

  • SpringBoot是整由Spring技术栈的一站式框架
  • SpringBoot是简化Spring技术栈的快速开发脚手架

2.springboot的优点?

  • 1.创建独立的spring应用
  • 2.内嵌web服务器
  • 3.自动配置spring以及第三方功能
  • 4.提供生产级别的监控、健康检查以及外部化配置
  • 5.无代码生成,无需编写xml

3.springboot如何创建bean对象?

使用@Configuration+@Bean注解(其中的一种与springmvc一样)

  • @Configuration:把类标识为配置类,等同于xml配置文件
  • @Bean:给容器中添加组件,以方法名作为组件的id返回类型就是组件的类型返回值就是组件在容器中的实例 

配置类里面使用@Bean标注在方法上给容器注册组件时,默认也是单实例

配置类本身也是组件。

4.说一下springboot中的条件装配?

  • 条件装配:满足@Conditional指定的条件,则进行组件注入 
  • 子注解(如@ConditionalOnClass@ConditionalOnBean)在Spring Boot的自动配置中起着关键作用。

5.如何xml配置导入到springboot中?

  • 使用@ImprotResource 注解引入外部的xml文件
@ImportResource("classpath:bean.xml")
@Configuration
public class MyConfig {
 
    @Bean
    public User user01() {
        return new User("张三", "123456");
    }
}

6.如何将配置文件和javaBean进行绑定?

  • 使用@ConfigurationProperties 注解进行绑定
    • 注意:只有在容器中的组件,才会拥有相关功能

7.springboot自动配置的原理?

@SpringBootApplication等价于:@SprignBootConfiguration+@EnableAutoConfiguration+@ComponentScan

  • @SprignBootConfiguration: 这个注解封装了@Configruation:标识为一个配置类,说明@SpringBootApplication标记的类是个配置类。 
  • @ComponentScan:扫描指定的包
  •  @EnableAutoConfiguration:包含了@AutoconfigurationPackage@Import({AutoConfigurationImportSelector.class})
    • @AutoconfigurationPackage注解里面含有@Import({Registrar.class},利用Registrar,将@SpringBootApplication标记的这个类所在包下的所有组件导入容器中。
    • @Import({AutoConfigurationImportSelector.class}):导入AutoConfigurationImportSelector这个类,
      • 1.这个类里面的selectImports方法利用getAutoConfigurationEntry(annotationMetadata)这个方法批量导入了组件。
      • 2.getAutoConfigurationEntry这个方法中调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有导入到容器中的组件
      • 3.利用工厂加载Map<String, List<String>> loadSpringFactories(ClassLoader classLoader:得到所有的组件
      • 4.loadSpringFactories会从META-INF/spring.factories位置来加载一个文件,默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件,spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories并且里面写死了131个配置类,springboot一启动就要给容器中加载所有配置类,但是会通过条件装配规则(满足@Conditional指定的条件,则进行组件注入)按需加载

总结:

  • SpringBoot先加载所有的自动配置类
  • 每个自动配置类按照条件进行生效,默认都会绑定配置文件默认的值
  • 生效的配置类就会给容器中装配很多组件 
  • 只要容器中有了这些组件,就相当于这些功能就有了。
  • 只要自己配置了,就以自己的优先
  • 定制化配置:1.用户直接自己@Bean替换底层的组件;2.用户去看这个组件是获取的配置文件什么值就去修改。 

8. springboot启动方式?

  • 1.运行带有main方法类:这是最常见的启动方式。直接运行项目的主启动类
  • 2.通过命令行使用java -jar的方式首先,将Spring Boot项目打包成一个可执行的JAR文件;然后,在命令行中使用java -jar命令来运行这个JAR文件
  • 3.通过spring-boot-maven-plugin或spring-boot-gradle-plugin的方式如果你使用Maven或Gradle作为你的构建工具,那么你可以通过配置相应的插件来启动你的Spring Boot应用

9.什么是yml?

YAML 在开发的这种语言时,YAML 的意思其实是: "Yet Another Markup Language" (仍是一种标记语言),是一种人类可读的数据序列化语言。

10.Spring Boot 是否可以使用 XML 配置 ?

  • Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过 @ImportResource 注解可以引入一个 XML 配置。

11.如何访问静态资源?

  • 1.只要静态资源放在类路径(resources)下: called , static , public , resources , META-INF/resources
  • 访问:当前根路径+静态资源名
  • 原理:静态资源拦截/**,请求进来,先去找Controller,看能不能处理;不能处理的所有请求又都交给静态资源处理器,静态资源找不到就报404

12.如何改变静态资源访问前缀?

  • 默认无前缀
  • 配置之后:当前项目+static-path-pattern前缀+资源文件
  • spring:
      mvc:
        static-path-pattern: /xz/**

13.静态资源配置原理?

  • 1.SpringBoot启动默认加载 xxxAutoConfiguration 类(自动配置类)
  • 2.SpringMVC功能的的大都数功能都集中在WebMvcAutoConfiguration类中, 根据条件ConditionalOnxxx注册类对象;WebMvcAutoConfiguration满足以下ConditionalOnxxx条件,类是生效的,并把其对象注册到容器中。
@AutoConfiguration(
    after = {DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class}
)
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
public class WebMvcAutoConfiguration {
    public static final String DEFAULT_PREFIX = "";
    public static final String DEFAULT_SUFFIX = "";
    public static final PathPatternParser pathPatternParser = new PathPatternParser();
    private static final String SERVLET_LOCATION = "/";

WebMvcAutoConfiguration生效给容器中配置了什么呢?

  @Configuration(
        proxyBeanMethods = false
    )
    @Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})
    @EnableConfigurationProperties({WebMvcProperties.class, WebProperties.class})
    @Order(0)
    public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer, ServletContextAware {
        private static final Log logger = LogFactory.getLog(WebMvcConfigurer.class);
        private final Resources resourceProperties;
        private final WebMvcProperties mvcProperties;
        private final ListableBeanFactory beanFactory;
        private final ObjectProvider<HttpMessageConverters> messageConvertersProvider;
        private final ObjectProvider<DispatcherServletPath> dispatcherServletPath;
        private final ObjectProvider<ServletRegistrationBean<?>> servletRegistrations;
        private final WebMvcAutoConfiguration.ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer;
        private ServletContext servletContext;
  • 配置文件的相关属性和xxx进行了绑定(@EnableConfigurationProperties中):
    • WebMvcProperties绑定spring.mvc
    • ResourceProperties绑定spring.resources
    • WebProperties绑定spring.web
  • 资源处理的默认规则:
 public void addResourceHandlers(ResourceHandlerRegistry registry) {
            if (!this.resourceProperties.isAddMappings()) {
                logger.debug("Default resource handling disabled");
            } else {
                this.addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
                this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
                    registration.addResourceLocations(this.resourceProperties.getStaticLocations());
                    if (this.servletContext != null) {
                        ServletContextResource resource = new ServletContextResource(this.servletContext, "/");
                        registration.addResourceLocations(new Resource[]{resource});
                    }

                });
            }
        }

通过配置add-mapping 禁用所有静态资源:

spring:
  web:
    resources:
      add-mappings: false

14.请求映射的原理?

  • 所有的请求映射都保存在了handlerMapping中,
  • 请求进来,尝试所有的handlerMapping,看是否有请求信息,
    • 如果有,则找到对应的handler;
    • 如果没有,则找下一个handlerMapping;
  • springboot自动配置类5中handlerMapping:
    • RequestMappingHandlerMapping:默认的,保存了所有handler(controller里面的映射)
    • WelcomePageHandlerMapping:SpringBoot自动配置欢迎页
    • BeanNameUrHandlerMapping
    • RouterFunctionMapping
    • SimpleUrHandlerMapping

15.springboot可以接受的传参类型?

  • 1.路径参数:使用@PathVariable注解URL路径中捕获参数。
  • 2.查询参数:使用@RequestParam注解查询字符串中捕获参数。
  • 3.请求体参数:使用@RequestBody注解请求体中捕获参数。
  • 4.表单参数:使用@ModelAttribute@RequestParam注解表单数据中捕获参数。
  • 5.请求头参数:使用@RequestHeader注解HTTP请求头中捕获参数。
  • 6.请求属性参数:使用@ModelAttribute@SessionAttributes注解会话或请求范围中捕获参数。

16.springboot 请求参数处理的原理?

  • handlerMaping中找到能处理请求的handler,为当前handler找到handlerAdapter适配器,在调用参数解析器解析handler
  • 支持4中handlerAdapter:
    • RequestMappingHandlerAdapter(默认)
    • HandlerFunctionAdapter
    • HttpRequestHandlerAdapter
    • SimpleControllerHandlerAdapter

17.SpringBoot热部署有哪些方式?

  • 热部署:就是可以不用重新运行SpringBoot项目可以实现操作后台代码自动更新到以运行的项目中

方式:

  • 1..常用-使用Spring Boot DevTools:
    • 配置方式:在POM文件中添加spring-boot-devtools的依赖,并设置optional为true,以防止将devtools依赖传递到其他模块中。
    • 在IDEA中,可以通过快捷键Ctrl+F9手动触发重启更新,或者开启运行时编译以实现自动重启更新。
  • 2.使用JRebel:JRebel是Java开发中最好的热部署工具之一,对Spring Boot提供了极佳的支持。(收费)
  • 3.使用Spring Loaded:Spring Loaded的方式与Debug模式类似,但不依赖于Debug模式启动。通过Spring Loaded库文件启动,可以在正常模式下进行实时热部署。

18. 什么是 Spring Profiles?

  • 1.问题:在项目的开发中,有些配置文件在开发、测试或者生产等不同环境中可能是不同的,例如数据库连接、redis的配置等等。那我们如何在不同环境中自动实现配置的切换呢?
  • 2.解决:Spring给我们提供了profiles机制来回切换配置文件

application-profile功能:

  • 1.默认配置文件 application.yaml;任何时候都会加载,激活指定的环境;
  • 2.指定环境配置文件 application-(dev).yaml
  • 3.激活指定环境:spring.profiles.active=dev
    • 配置文件激活
    • 命令行激活:打包后使用命令java -jar xxx.jar --spring.profiles.active=dev
  • 4.默认配置与环境配置同时生效 ,同名配置项,profile配置优先

19.如何使用 Spring Boot 实现全局异常处理?

  • 1.创建一个类实现继承指定的异常(运行时异常)
  • 2.自定义异常处理器,添加注解@ControllerAdvice接着判断当前异常是否属于自定义异常类

20.Spring Boot 中如何解决跨域问题 ?

通过实现WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题

@Configuration  
public class WebConfig implements WebMvcConfigurer {  

    @Override  
    public void addCorsMappings(CorsRegistry registry) {  
        registry.addMapping("/**") // 允许所有路径  
            .allowedOrigins("http://example.com") // 允许来自http://example.com的跨域请求  
            .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的HTTP方法  
            .allowedHeaders("*") // 允许任何头信息  
            .allowCredentials(true); // 允许携带凭证(如cookies, HTTP认证及客户端SSL证明等)  
    }  
}

21.spring-boot-starter-parent 有什么用 ? 

  • 1.依赖管理:只声明所需的依赖而无需指定版本号
  • 2.插件管理:使用 Spring Boot 推荐的 Maven 插件和配置,而无需在子模块中明确指定
  • 3.属性继承:通过继承 spring-boot-starter-parent,你可以继承其定义的 Maven 属性
  • 4.简化配置:可以大大简化 Maven 配置
  • 5.一致性:确保所有子模块使用相同版本的依赖和插件,减少潜在的版本冲突
  • 6.快速集成:当你开始一个新的 Spring Boot 项目时,只需将 spring-boot-starter-parent 添加为父 POM,然后添加所需的 starter 依赖,就可以快速集成 Spring Boot 提供的各种功能。

 22.SpringBoot启动过程?

  • 1.加载启动类:在当前工作目录下寻找带有@SpringBootApplication注解标识的类,并将这个类作为应用程序的入口点,如果找不到这样的主类,则会打印错误信息并退出
  • 2.加载配置文件:SpringBoot会自动扫描当前项目的resources目录,并加载其中的application.propertiesapplication.yml等配置文件
  • 3.初始化配置::通过类加载器,创建一些初始化配置对象。
  • 4.通知监听器:应用程序启动开始,创建环境对象environment,用于读取环境配置
  • 5.创建应用程序上下文:创建ApplicationContextbean工厂对象
  • 6.刷新上下文(启动核心):
    • 配置工厂对象
    • 注册并实例化bean工厂发布处理器
  • 7.发布事件
  • 8.打印日志和版本信息
  • 9.完成启动

23.SpringBoot启动原理?

  •  1.创建SpringBootApplication:保存启动类的信息,ClassUtils判断当前应用的类型是servlet,去spring.factories文件中找初始化引导器bootstrapper、ApplicationContextInitializer、ApplicationListener(应用监听器)
  • 2.运行SpringBootApplication:
    • 1.先创建一个stopWatch记录应用启动时间
    • 2.在创建引导上下文(context环境)createBootstrapContext(),获取到所有之前的bootstrapper挨个执行intitialize()来完成对引导器上下文环境设置
    • 3.接着让当前应用进入headless模式
    • 4.然后获取所有的运行时监听器RunListener
    • 5.保存命令行参数
    • 6.调用方法prepareEnvironment准备环境信息
    • 6.创建IOC容器createApplicationContext()
    • 7.准备IOC容器信息prepareContext()
    • 8.刷新IOC容器refreshContext()
    • 9.调用listeners.running()方法启动

24.SpringBoot如何实现打包?

  • 1.进入项目目录在控制台输入mvn clean package,clean是清空已存在的项目包,package进行打包
  • 2.点击左边选项栏中的Mavne,先点击clean在点击package
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会敲代码的小张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值