##java面试题大全
点赞、收藏、加关注
·
·
java基础面试题
- ##java面试题大全
- 1、什么是 Spring Boot
- 2、SpringBoot 与 SpringCloud 区别
- 3、SpringBoot 有哪些优点
- 4、SpringBoot 的核心注解是哪个?由哪几个注解组成的
- 5、SpringBoot 支持哪些日志框架?推荐和默认的日志框架是哪个?
- 6、SpringBoot Starter 的工作原理,自动配置的原理
- 7、运行 SpringBoot 有哪几种方式
- 8、开启 SpringBoot 特性有哪几种方式
- 9、SpringBoot 事务的使用?事务失效怎么解决
- 10、Async 异步调用方法
- 11、如何在 Spring Boot 启动的时候运行一些特定的代码
- 12、Spring Boot 配置加载顺序
- 13、什么是 YAML?YAML 优点
- 14、Spring Boot 是否可以使用 XML 配置
- 15、什么是 Spring Profiles
- 16、Spring Boot 中如何解决跨域问题
- 17、如何使用 Spring Boot 实现全局异常处理
- 18、常用的 starter maven 依赖项
- 19、spring-boot-starter-parent 有什么用
- 20、项目中常见的注解
1、什么是 Spring Boot
SpringBoot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,使开发者能快速上手
2、SpringBoot 与 SpringCloud 区别
- SpringBoot 专注于快速方便的开发单个服务;Spring Cloud 关注的是多个服务之间的协调管理
- SpringBoot 可以离开 SpringCloud 独立开发项目,但 SpringCloud 不能够离开 SpringBoot,SpringCloud 依赖于 SpringCloud
3、SpringBoot 有哪些优点
- 可快速构建独立的 Spring 应用
- 大量的自动配置,简化开发,方便集成第三方
- 无需 XML 配置,减少冗余代码 ,开箱即用
- 直接嵌入Tomcat、Jetty 和 Undertow 服务器:无须部署 WAR 文件
- 通过依赖启动器简化构建配置:无须准备各种独立的 JAR 文件,只需在构建项目时根据开发场景需求选择对应的依赖启动器 “starter”
- 提供生产就绪功能:SpringBoot 提供了一些用于生产环境运行时的特性,例如指标、监控检查和外部化配置
4、SpringBoot 的核心注解是哪个?由哪几个注解组成的
核心注解是启动类上面的注解:@SpringBootApplication,主要组合包含了以下 3 个注解:
- @SpringBootConfiguration:组合了 @Configuration 注解,提到 @Configuration 就要提到它的搭档 @Bean,使用这两个注解就可以创建一个简单的 Spring 配置类,可以用来替代相应的 XML 配置文件
- @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项, 例如:关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
- @ComponentScan:会自动扫描指定包下的全部标有 @Component 的类,并注册成 Bean,当然包括 @Component 下的子注解 @Service,@Repository,@Controller
5、SpringBoot 支持哪些日志框架?推荐和默认的日志框架是哪个?
- SpringBoot 支持 Java Util Logging,Log4j2,Logback 作为日志框架
- 如果使用 Starters 启动器,SpringBoot 将使用 Logback 作为默认日志框架
- 推荐的日志框架是 Log4j2
6、SpringBoot Starter 的工作原理,自动配置的原理
启动类上 @SpringBootApplication 注解整合了 @EnableAutoConfiguration 注解,该注解上有 @Import({AutoConfigurationImportSelector.class}) 注解,所以会读取 AutoConfigurationImportSelector 类,该类重写了 String[] selectImports 方法,最终会读取每个 starter 下面的 resources/META-INF/spring.factories 文件和 resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(高版本) 文件,然后根据 @Conditional 注解的条件,进行自动配置并将 Bean 注入 Spring Context
拓展(自定义starter):创建autoConfigure模块,提供自动配置功能;创建一个自动配置类,添加上@autoconfigration;在该类中使用@Bean来创建需要自动注入的Bean;并自定义resources/META-INF/spring.factories,里面写入@autoconfigration注解类的全类名,main方法等无用的删除。创建starter模块,只需要在该模块引入autoConfigure的模块和autoConfigure的模块所需要的全部依赖,只需要一个pom文件
7、运行 SpringBoot 有哪几种方式
- 直接执行 main 方法运行
- 打包用命令或者放到容器中运行
- 用 Maven/ Gradle 插件运行
8、开启 SpringBoot 特性有哪几种方式
- 继承 spring-boot-starter-parent 项目
- 导入 spring-boot-dependencies 项目依赖
9、SpringBoot 事务的使用?事务失效怎么解决
使用:
- 启动类加上 @EnableTransactionManagement 注解,开启事务支持(默认是开启的)
- 在使用事务的 public(只有public 支持事务)方法(或者类,相当于该类的所有 public 方法都使用)加上 @Transactional 注解
失效解决:
大部分循环依赖spring自己就可以解决,spring有一个DefaultSingletonBeanRegistry对象,单实例对象注册器。里面有三个Map集合,也叫三级缓存,一级缓存存储完成单实例化的对象,二级缓存存储未完成实例化的对象(防止出现多例),三级缓存用来存储创建该对象的工厂(用来解决代理对象的问题)。但是构造方法注入产生循环依赖就需要自己手动解决,在形参前添加@Lazy注解延迟加载就可以解决
10、Async 异步调用方法
- 在启动类加入 @EnableAsync 使异步调用 @Async 注解生效
- 在方法上使用 @Async 注解即可实现方法的异步
11、如何在 Spring Boot 启动的时候运行一些特定的代码
- 实现接口 ApplicationRunner 或者 CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个 run 方法
- 使用 @PostConstruct 注解来在 Spring Bean 初始化后执行特定的代码。当一个 Bean 被实例化并且所有的属性被设置之后,带有 @PostConstruct 注解的方法将会被调用
12、Spring Boot 配置加载顺序
- bootstrap.yml:这些配置通常用于 Spring Cloud 等外部配置的加载
- bootstrap.properties
- application.yml
- application.properties
- 外部属性文件:通过 spring.config.location 属性来指定外部属性文件的位置
- 命令行参数
- 配置服务器:如 Nacos 配置中心
13、什么是 YAML?YAML 优点
- YAML 是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果想要在配置文件中添加复杂的属性,YAML 文件采用分层配置数据,更加结构化
- 优缺点:配置有序、简洁明了。相比 properties 配置文件,YAML 有一个缺点,就是不支持 @PropertySource 注解导入自定义的 YAML 配置
14、Spring Boot 是否可以使用 XML 配置
Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过 @ImportResource 注解可以引入一个 XML 配置
15、什么是 Spring Profiles
在项目的开发中,有些配置文件在开发、测试或者生产等不同环境中可能是不同的,例如数据库连接、redis 的配置等等。Spring 提供了 profiles 机制实现切换配置文件的功能。Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean,使用 spring.profiles.active 来指定哪个配置文件生效,值是 application-{profileName}.yml
16、Spring Boot 中如何解决跨域问题
原因: 由于浏览器的同源策略
使用 JSONP 解决:
通过 script 标签的 src 属性进行跨域请求,如果服务端要响应内容则首先读取请求参数 callback 的值,callback 是一个回调函数的名称,服务端读取 callback 的值后将响应内容通过调用 callback 函数的方式告诉请求方。如:<script src="http://跨域地址?callback=fun"></script>
,响应结果就是 fun(result)。只可以发送 GET 请求
添加响应头解决:
服务端在响应头添加 Access-Control-Allow-Origin: *
后端编码解决:
- 使用 Spring 提供的 CorsFilter 来实现:在配置类重注入这个 Bean 对象,为其设置允许跨域的地址
- 通过实现 WebMvcConfigurer 接口然后重写 addCorsMappings 方法解决跨域问题,在参数 registry 上设置允许跨域的地址
通过 nginx 代理跨域:
由于服务端之间没有跨域,浏览器通过 nginx 去访问跨域地址
17、如何使用 Spring Boot 实现全局异常处理
全局异常处理可以用两个注解来实现:@ControllerAdvice + @ExceptionHandler
@Slf4j
@ControllerAdvice
public class GlobalExceptionAdvice {
@ExceptionHandler({Exception.class})//捕获的全局异常类型
@ResponseBody
public Object handleException(HttpServletRequest request, Exception e) throws Exception {
log.error(e.getMessage(), e);
// 如果某个自定义异常有@ResponseStatus注解,就继续抛出
if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {
throw e;
}
HashMap<String, Object> map = new HashMap<>();
map.put("message", "全局异常处理" + e.getMessage());
return map;
}
}
18、常用的 starter maven 依赖项
- spring-boot-starter-web:嵌入 Tomcat 和 web 开发需要 servlet 与 jsp 支持
- spring-boot-starter-data-redis:Redis 数据库支持
- mybatis-spring-boot-starter:第三方的 Mybatis 集成 starter
- spring-boot-starter-security:用于构建基于Spring Security的安全应用程序
- spring-boot-starter-test:用于构建基于 JUnit 和 Spring Test 的测试应用程序
19、spring-boot-starter-parent 有什么用
- 默认配置管理:spring-boot-starter-parent 定义了许多默认的插件配置和依赖管理,包括 Maven 插件、编译器插件、资源插件等。这些默认配置可以帮助开发者避免重复配置,并且符合 Spring Boot 的最佳实践
- 版本管理:spring-boot-starter-parent 中定义了许多 Spring Boot 和 Spring Framework 的版本信息,包括依赖库的版本、插件的版本等。这样一来,当使用 spring-boot-starter-parent 作为父项目时,就不需要显式地指定这些版本信息,简化了项目的管理和维护
- 插件管理:spring-boot-starter-parent 中定义了许多常用的 Maven 插件,包括编译插件、打包插件、测试插件等。这些插件的默认配置可以帮助开发者快速构建和管理项目
20、项目中常见的注解
Spring:
SpringMVC:
SpringBoot: