SpringBoot相关面试题

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

文章目录

请谈一下你对 对 SpringBoot 的理解SpringBoot 有哪些优点

SpringBoot 主要用来简化 Spring 开发过程

  • 它不是一个全新的 MVC 框架自动配置了 Spring 框架和第三方类库
  • 它的核心思想"约定大于配置"
  • SpringBoot 内置 Servlet 容器如 Tomcat、Jetty 或者 Undertow(不需要部署 war 包)
  • 提供了"starter"依赖(maven 依赖)来简化构建配置
  • 提供了准生产级功能如监控、健康检查和一些额外的配置
  • 完全没有代码生成和 XML 配置
  • 为微服务 SpringCloud 奠定了基础使得微服务的构建变得简单

请谈一下 SpringBoot 的自动配置原理

SpringBoot 借助 Spring 提供的 java config 方式将 Bean 加载到容器中
在 SpringBoot 的启动类上有个@SpringBootApplication 注解这个注解由@SpringBootConfiguration、@EnableAutoConfiguration 和@ComponentScan 组成
SpringBoot 利用@EnableAutoConfiguration 注解引入的 AutoConfigurationImportSelector 类在这个类中使
用 SpringFactoriesLoader 类
将 classpath 下所有 jar 包中的 META-INF/spring.factories 文件中所有符合自动配置条件的类型进行加载
最后通过反射的方式利用 java config 方式将 bean 加载 spring 的 ioc 容器中完成自动配置

你在项目中 SpringBoot 配置文件用的什么格式的

在项目中目前使用 yaml 文件格式(.yml 结尾)
紧着可能会问为什么用这种格式这个时候直接回答 YAML 的优点

  • YAML 是一个类似 XML、JSON 的标记性语言YAML 强调以数据为中心
  • 容易阅读
  • 可用于不同程序间的数据交换
  • 适合描述程序所使用的数据结构特别是脚本语言
  • 丰富的表达能力与可扩展性
  • 易于使用

YAML 语法要求
大小写敏感
使用缩进表示层级关系
缩进时不允许使用 Tab 键只允许使用空格
缩进的空格数目不重要只要相同层级的元素左侧对齐即可

请说一下 SpringBoot 和 和 spring MVC 的区别

Spring MVC 是建立在 Servlet 基础之上的一个 MVC 框架主要解决 WEB 开发的问题
由于在使用 Spring MVC 开发 WEB 应用过程中的配置非常复杂如 XML 配置或者 JavaConfig 方式处理起来比较繁琐
Spring boot 为了简化开发者的使用采用约定大于配置的思想简化了 spring MVC 的配置流程
Spring Boot 内嵌了 Servlet 容器很容易创建一个独立运行、准生产级别的 Spring 项目。

SpringBoot 如何处理跨域

在使用 SpringBoot 的情况下可以使用下面几种方式处理跨域请求

  1. 实现 WebMvcConfigurer 接口的 addCorsMappings()方法
    但是使用此方法后再使用自定义拦截器时处理跨域就会失效。
    原因是当请求到达时会先进入拦截器中而不是进入 Mapping 映射中所以响应头信息中并没有配置的跨域信息浏览器
    就会报跨域异常

  2. 使用 Spring web 自带的 CorsFilter 处理

  3. 使用自定义的过滤器或者拦截器实现但是这个过滤器或者拦截器一定要配置所有过滤器或者拦截器的最前面

方式一实现 WebMvcConfigurer 接口的 addCorsMappings()方法 – 不推荐


public void addCorsMappings(CorsRegistry registry) {
	registry.addMapping("/**") // 配置可以被跨域的路径可以任意配置可以具体到直接请求路径。
	.allowedOrigins("*") // 允许所有的请求域名访问我们的跨域资源可以固定单个或者多个内容
	.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") // 允许何种请求方法访问该跨域资源服务器
	.allowCredentials(true) // 是否允许用户发送、处理 cookie
	.allowedHeaders("*") // 允许所有的请求 header 访问可以自定义设置任意请求头信息
	.maxAge(3600); // 预检请求的有效期单位为秒。有效期内不会重复发dHeader("Access-Control-Max-Age", "3600");
}

方式二使用 spring-web 提供的 CorsFilt

@Configuration
public class CorsConfig {
	private CorsConfiguration addcorsConfig() {
		CorsConfiguration corsConfiguration = new CorsConfiguration();
		List<String> list = new ArrayList<>();
		list.add("*");
		corsConfiguration.setAllowedOrigins(list);
		corsConfiguration.addAllowedOrigin("*");
		corsConfiguration.addAllowedHeader("*");
		corsConfiguration.addAllowedMethod("*");
		corsConfiguration.setAllowCredentials(true);
		corsConfiguration.setMaxAge(3600L);
		return corsConfiguration;
	}
	@Bean
	public CorsFilter corsFilter() {
		UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
		source.registerCorsConfiguration("/**", addcorsConfig());
		return new CorsFilter(source);
	}
}

方案三自定义过滤器或者拦截器要注意这个拦截器一定要放在所有的拦截器的第一个位置
过滤器方式


public class CrossDomainFilter implements Filter {
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
		HttpServletResponse httpResponse = (HttpServletResponse) response;
		httpResponse.setHeader("Access-Control-Allow-Origin", "*");
		httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
		httpResponse.setHeader("Access-Control-Max-Age", "3600");
		httpResponse.addHeader("Access-Control-Allow-Headers",
		"Accept, Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified,
		Cache-Control, Expires, Content-Type, X-E4M-With");
		httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
		chain.doFilter(request, httpResponse);
	}
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {
		if (request.getHeader(HttpHeaders.ORIGIN) != null) {
			response.addHeader("Access-Control-Allow-Origin", "*");
			response.addHeader("Access-Control-Allow-Credentials", "true");
			response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT, HEAD");
			response.addHeader("Access-Control-Allow-Headers", "Content-Type");
			response.addHeader("Access-Control-Max-Age", "3600");
		}
		return true;
	}

Spring Boot是如何启动Tomcat的

  1. ⾸先SpringBoot在启动时会先创建⼀个Spring容器
  2. 在创建Spring容器过程中会利⽤@ConditionalOnClass技术来判断当前classpath中是否存在
    Tomcat依赖如果存在则会⽣成⼀个启动Tomcat的Bean
  3. Spring容器创建完之后就会获取启动Tomcat的Bean并创建Tomcat对象并绑定端⼝等然后
    启动Tomcat
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring