SpringBoot 常见面试题

1、Spring Boot 最大的优点是什么?

        Spring Boot 的最大的优点是“约定大于配置“。约定大于配置是一个简单的概念。系统,类库,框架,假定其合理的默认值,而非要求提供不必要的配置。在大部分情况下,使用框架提供的默认值会让项目运行的更快。并且大量的减少了配置文件的使用。

什么是约定大于配置?

  1. 就是在开发中,如果有些值你没有配置的话,那程序会取一个默认值,换句话说,能取默认值的配置,就不需要配置了,这个默认值就是约定。
  2. 约定可以减少很多配置

优点:

  • 独立运行的spring项目:Spring Boot可以以jar包形式直接运行,如java-jar xxxjar优点是:节省服务器资源
  • 内嵌servlet 容器:Spring Boot 可以选择内嵌Tomcat,Jetty,这样我们无须以war包形式部署项目。
  • 提供starter 简化Maven 配置:在Spring Boot 项目中为我们提供了很多的spring-boot-starter-xxx的项目(我们把这个依赖可以称之为起步依赖),我们导入指定的这些项目的坐标,就会自动导入和该模块相关的依赖包:例如我们后期再使用Spring Boot 进行web开发我们就需要导入spring-boot-starter-web这个项目的依赖,导入这个依赖以后!那么Spring Boot就会自动导入web开发所需要的其他的依赖包
  • 自动配置 Spring: Spring Boot 会根据在类路径中的jar包,类,为jar包里的类自动配置Bean,这样会极大减少我们要使用的配置。当然Spring Boot只考虑了大部分开发场景,并不是所有的场景,如果在实际的开发中我们需要自动配置Bean,而Spring Boot不能满足,则可以自定义自动配置。
  • 准生产的应用监控:Spring Boot 提供基于http,sh,telnet对运行时的项目进行监控
  • 无代码生成和xml配置:Spring Boot大量使用spring4.x提供的注解新特性来实现无代码生成和xml 配置。spring4.x提倡使用Java配置和注解配置组合,而Spring Boot不需要任何xml配置即可实现Spring的所有配置。

在springboot中,只要导入了web-stater,spring mvc、json、spring核心容器等web场景需要的所有依赖都会导入,并控制好版本
spring boot的理念就是约定大于配置,在spring boot中提供了一套默认配置,不需要手动去写xml配置文件,只有默认配置不能满足我们的需求时,才会去修改配置。

2、Spring Boot 常用注解有哪些?

1、@SpringBootApplication

这个注解是Spring Boot最核心的注解,用在 Spring Boot的主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。实际上这个注解是@Configuration,@EnableAutoConfiguration,@ComponentScan三个注解的组合。由于这些注解一般都是一起使用,所以Spring Boot提供了一个统一的注解@SpringBootApplication。

2、@EnableAutoConfiguration

允许 Spring Boot 自动配置注解,开启这个注解之后,Spring Boot 就能根据当前类路径下的包或者类来配置 Spring Bean。

如:当前类路径下有 Mybatis 这个 JAR 包,MybatisAutoConfiguration 注解就能根据相关参数来配置 Mybatis 的各个 Spring Bean。

@EnableAutoConfiguration实现的关键在于引入了AutoConfigurationImportSelector,其核心逻辑为selectImports方法,逻辑大致如下:

 ● 从配置文件META-INF/spring.factories加载所有可能用到的自动配置类;

 ● 去重,并将exclude和excludeName属性携带的类排除;

 ● 过滤,将满足条件(@Conditional)的自动配置类返回;

3、@Configuration

用于定义配置类,指出该类是 Bean 配置的信息源,相当于传统的xml配置文件,一般加在主类上。如果有些第三方库需要用到xml文件,建议仍然通过@Configuration类作为项目的配置主类——可以使用@ImportResource注解加载xml配置文件。

4、@ComponentScan

组件扫描。让Spring Boot扫描到Configuration类并把它加入到程序上下文。

@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中。

5、@RestController

用于标注控制层组件,表示这是个控制器bean,并且是将函数的返回值直接填入HTTP响应体中,是REST风格的控制器;它是@Controller和@ResponseBody的合集。

6、@ResponseBody

表示该方法的返回结果直接写入HTTP response body中

一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。

7、@Component

泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

8、@RequestMapping

RequestMapping是一个用来处理请求地址映射的注解;提供路由信息,负责URL到Controller中的具体函数的映射,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

9、@RequestParam

用在方法的参数前面

3、Spring Boot 的自动配置是如何实现的?

Spring Boot 项目的启动注解是:@SpringBootApplication,它由三个注解组成的:

@Configuration

@ComponentScan

@EnableAutoConfiguration

其中 @EnableAutoConfiguration 是实现自动配置的入口,该注解又通过 @Import 注解导入了AutoConfigurationImportSelector,在该类中加载 META-INF/spring.factories 的配置信息。然后筛选出以 EnableAutoConfiguration 为 key 的数据,加载到 IOC 容器中,实现自动配置功能!

4、Spring Boot 如何设置支持跨域请求?

跨域问题的产生:

现代浏览器出于安全的考虑, HTTP 请求时必须遵守同源策略,否则就是跨域的 HTTP 请求,默认情况下是被禁止的,IP(域名)不同、或者端口不同、协议不同(比如 HTTP、HTTPS)都会造成跨域问题

一般前端的解决方案有:

使用 JSONP 来支持跨域的请求,JSONP 实现跨域请求的原理简单的说,就是动态创建

你可能感兴趣的:(Java常见面试题,java)