互联网大厂Java面试题集—Spring boot常见面试题(二)
Spring Boot的核心功能与使用优点?
核心功能:
1)Spring Boot项目为独立运行的spring项目,java -jar xx.jar
即可运行。
2)内嵌servlet容器(可以选择内嵌: tomcat,jetty等服务器)。
3)提供了starter的pom配置简化了maven的配置。
4)自动配置spring容器中的bean。当不满足实际开发场景,可自定义bean的自动化配置。
5)准生产的应用监控(基于:ssh
,http
,telnet
对服务器运行的项目进行监控)。
6)Spring Boot无需做出xml配置,也不是通过代码生成来实现(通过条件注解)。
使用优点:
1)快速搭建项目,与主流框架集成无需配置集成。内嵌服务容器,具有应用监控,开发部署方便,后期与云计算平台集成方便(docket)。
2)使用JavaConfig有助于避免使用XML。
3)避免大量的Maven导入和各种版本冲突。
4)没有单独的Web服务器需要。这意味着你不再需要启动Tomcat
,Glassfish
或其他任何东西。
5)需要更少的配置因为没有web.xml文件。只需添加用@Configuration注释的类,然后添加用@Bean注释的方法,Spring将自动加载对象并像以前一样对其进行管理。您甚至可以将@Autowired添加到bean方法中,以使 Spring 自动装入需要的依赖关系中。
6)基于环境的配置使用这些属性,您可以将您正在使用的环境传递到应用程序:-Dspring.profiles.active = {enviornment}
。在加载主应用程序属性文件后,Spring将在(application{environment}.properties
)中加载后续的应用程序属性文件。
什么是Spring Boot项目中的自动配置与手动配置?如果需要手动配置该如何实现?.
1. 自动配置: Spring Boot项目默认支持很多框架的集成,添加组件即可。只需要: 针对application.properties
做出自动配置的属性重写即可完成,默认开启。关注微信公众号“Java精选”(w_z90110)。
举例:
Spring Boot采用自动配置集成freemarker
模板引擎,前提: 构建spring boot项目。
1)引入模板组件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
2)编写Controller和freemarker模板,位于resources/templates
2. 手动配置: 手动自定义web组件,代替Spring Boot项目默认支持的组件与配置。
举例:
采用手动配置参数,集成freemarker模板引擎.
1)前提: spring-boot-starter-web
引入;
2)编写过程类似于springMVC;
3)额外的SpringMVC的容器配置:
默认基于spring boot的基本默认配置即可(需要修改: 位于application.properties
)。需要手动编写类似于spring容器可以:
@Configuration
Public class MVCConfiguration extends WebMvcConfigurerAdapter{
//视图解析器默认地址为: /resources , /static , /templates, /public,/META
@Bean
public InternalResourceViewResolver defaultResolver(){
InternalResourceViewResolver resourceViewResolver = new InternalResourceViewResolver();
resourceViewResolver.setPrefix("classpath:/templates/");
resourceViewResolver.setSuffix(".html");
return resourceViewResolver;
}
//解析视图时,默认从以上地址中依次寻找视图资源加载,如果自定义例如Freemarker模板视图解析器的资源地址,那么:
@Bean
public FreeMarkerViewResolver defaultResolver(){
FreeMarkerViewResolver freeMarkerViewResolver = new FreeMarkerViewResolver();
// freeMarkerViewResolver.setPrefix("classpath:/views/");
freeMarkerViewResolver.setSuffix(".html");
freeMarkerViewResolver.setContentType("text/html;charset=utf-8");
return freeMarkerViewResolver;
}
@Bean
public FreeMarkerConfigurer freeMarkerConfigurer(){
FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
configurer.setTemplateLoaderPaths("classpath:/views/");
configurer.setDefaultEncoding("utf-8");
return configurer;
}
//如果不设置静态资源目录,默认: classpath: /static/ , classpath: /public/ , classpath: /resources/ , classpath: /META-INF/resources/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/image/**").addResourceLocations("classpath:/static/image/");
registry.addResourceHandler("/css/**").addResourceLocations("classpath:/static/css/");
registry.addResourceHandler("/js/**").addResourceLocations("classpath:/static/js/");
}
}
以上手动配置总结: 如果想要完全自定义,接管spring boot中的所有web配置,可以:
@Configuration: 创建mvc适配器子类的对象并绑定至spring容器中。
@EnableWebMvc: 扫描spring容器中的mvc适配器子类对象。
Public class MVCConfiguration extends WebMvcConfigurerAdapter{ 重写方法即可. }
如何使用Maven来构建一个Spring Boot程序?
就像引入其他库一样,我们可以在Maven工程中加入Spring Boot依赖。然而,最好是从spring-boot-starter-parent
项目中继承以及声明依赖到Spring Boot starters
。这样做可以使我们的项目可以重用Spring Boot的默认配置。
继承spring-boot-starter-parent
项目依赖很简 –我们只需要在pom.xml中定义一个parent节点:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
</parent>
我们可以在Maven central中央仓库中找到spring-boot-starter-parent的最新版本。
使用starter父项目依赖很方便,但是有时候不是可行的。关注微信公众号“Java精选”(w_z90110)。如果我们公司都要求项目继承标准 POM,我们就不能依赖Spring Boot starter
了。
这种情况,我们可以通过对POM元素的依赖管理来处理:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
最后可以添加Spring Boot starter
中一些依赖,之后就可以启动项目了。
Spring Boot中如何禁用某些自动配置特性?
1)禁用某些自动配置特性使用@EnableAutoConfiguration
注解的exclude属性来指明。例如,下面的代码段是使DataSourceAutoConfiguration
无效:
// other annotations
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
public class MyConfiguration { }
2)使用@SpringBootApplication
注解,将@EnableAutoConfiguration
作为元注解的项来启用自动化配置,使用相同名字的属性来禁用自动化配置:
// other annotations
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class MyConfiguration { }
3)使用spring.autoconfigure.exclude环境属性来禁用自动化配置。
application.properties中的这项配置内容增加如下:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
如何将Spring Boot web应用程序部署为JAR或WAR文件?
通常,将web应用程序打包成WAR文件,然后将它部署到另外的服务器上。这样做使得我们能够在相同的服务器上处理多个项目。当CPU和内存有限的情况下,这是一种最好的方法来节省资源。然而,事情发生了转变。现在的计算机硬件相比起来已经比较廉价,并且现在的注意力大多转移到服务器配置上。部署中对服务器配置的一个细小的失误都会导致无可预料的灾难发生。
Spring通过提供插件来解决这个问题,也就是spring-boot-maven-plugin
来打包web应用程序到一个额外的 JAR 文件当中。为了引入这个插件,只需要在pom.xml
中添加一个plugin属性:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
有了这个插件,可以在执行package步骤后得到一个JAR包。这个JAR包包含所需的所有依赖以及一个嵌入的服务器。因此,无需担心去配置一个额外的服务器了。可以通过运行一个普通的JAR包来启动应用程序。
需要注意的是,为了打包成JAR文件,pom.xml
中的packgaing
属性必须定义为jar:
<packaging>jar</packaging>
如果不定义这个元素默认值也是jar。
如果想构建一个WAR文件,将packaging
元素修改为war:
<packaging>war</packaging>
并且需要将容器依赖从打包文件中移除:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
执行Maven的package步骤之后,我们得到一个可部署的WAR文件。
如何使用Spring Boot实现分页和排序?
使用Spring Boot实现分页非常简单。使用Spring Data-JPA
可以实现将可分页的传递给存储库方法。
Spring Boot中的监视器是什么?如何监视所有Spring Boot微服务?
Spring boot actuator
是spring启动框架中的重要功能之一。Spring Boot监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为HTTP URL访问的REST端点来检查状态。
Spring Boot 提供监视器端点以监控各个微服务的度量。这些端点对于获取有关应用程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运行很有帮助。但是,使用监视器的一个主要缺点或困难是必须单独打开应用程序的知识点以了解其状态或健康状况。想象一下涉及50个应用程序的微服务,管理员将不得不击中所有50个应用程序的执行终端。为了帮助我们处理这种情况,可以集成开源项目,它建立在Spring Boot Actuator之上,它提供了一个Web UI,使我们能够可视化多个应用程序的度量。
Spring Boot的Actuator是做什么的?
本质上,Actuator
通过启用production-ready
功能使得Spring Boot
应用程序变得更有生命力。这些功能允许我们对生产环境中的应用程序进行监视和管理。
集成Spring Boot Actuator到项目中需要做的只是将spring-boot-starter-actuator starter引入到POM.xml文件当中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Spring Boot Actuaor
可以使用HTTP或者JMX endpoints
来浏览操作信息。大多数应用程序都是用HTTP,作为endpoint的标识以及使用/actuator前缀作为 URL路径。
这里有一些常用的内置endpoints Actuator:
Spring Boot项目web开发时如何集成web组件:servlet.filter.listener
?
自定义servlet(实现或继承HttpServlet
),filter(实现或继承Filter
),listener(实现或继承ServletContextListener
)。
1)将以下组件直接提供在main()启动类中,用于加载:
@Bean
public ServletRegistrationBean servletRegistrationBean() {
return new ServletRegistrationBean(new CustomServlet(), "/custom");
}
@Bean
public FilterRegistrationBean filterRegistrationBean() {
return new FilterRegistrationBean(new CustomFilter(), servletRegistrationBean());
}
@Bean
public ServletListenerRegistrationBean<CustomListener> servletListenerRegistrationBean() {
return new ServletListenerRegistrationBean<CustomListener>(new CustomListener());
}
2)启动类实现ServletContextInitializer,重写onStartup():
@SpringBootApplication
public class SpringBootDemo102Application implements ServletContextInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.addServlet("customServlet", new CustomServlet()).addMapping("/custom");
servletContext.addFilter("customFilter", new CustomFilter())
.addMappingForServletNames(EnumSet.of(DispatcherType.REQUEST), true, "customServlet");
servletContext.addListener(new CustomListener());
}
}
3)启动类开启扫描: @ServletComponentScan
工具组件采用注解进行加载:
@WebFilter(filterName = "customFilter", urlPatterns = "/*")
@WebListener
@WebServlet(name = "customServlet", urlPatterns = "/custom")
Spring Boot中的application.properties配置文件是什么,有哪些配置?
application.properties
为Spring Boot
项目中的一个系统自带的全局属性配置文件,提供默认属性重写的作用。可包含重写系统tomcat
,spring
,springmvc
,mybatis
等诸多默认配置属性。列举部分如下:
#全局配置文件: 重写视图解析器的资源地址
#页面默认前缀目录
spring.mvc.view.prefix=/WEB-INF/jsp/ #响应页面默认后缀
spring.mvc.view.suffix=.jsp #静态资源目录配置,
spring.mvc.static-path-pattern=/static/** #默认支持的日志记录:
#logging.config=classpath:logback.xml 加载单独的日志配置文件
logging.file=d:/test/log.log
logging.level.org.springframework.web=DEBUG #tomcat服务器的配置:
server.port=8081
server.servlet.context-path=/yoodb #提供jdbc的基本配置:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/yoodb01?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=org.apache.commons.dbcp.BasicDataSource #提供mybatis的属性配置: 扫描
mybatis.mapper-locations=classpath:mapper/*_mapper.xml
如何在Spring Boot中添加通用的JS代码?
在源文件夹下创建一个名为static的文件夹。之后把静态的内容放在这里面。
例如,yoodb.js的路径是resources\static\js\yoodb.js
,可以参考它在jsp中的使用方法:
错误:HAL browser gives me unauthorized error - Full authenticaition is required to access this resource.
,该如何来修复这个错误呢?
两种方式:
1)关闭安全验证,打开application.properties
文件增加内容如下:
management.security.enabled:FALSE
2)在日志中搜索密码并传递至请求头中
Spring和Spring Boot有什么不同?
Spring框架提供多种特性使得web应用开发变得更简便,包括依赖注入、数据绑定、切面编程、数据存取等。
但随着时间推移,Spring生态变得越来越复杂了,并且应用程序所必须的配置文件也令人觉得可怕。这就是Spirng Boot派上用场的地方了–它使得Spring的配置变得更轻而易举。
实际上,Spring是unopinionated
(予以配置项多,倾向性弱) 的,Spring Boot在平台和库的做法中更opinionated,使得我们更容易上手。
简单总结两条Spring Boot带来的好处:
1)根据classpath中的artifacts的自动化配置应用程序;
2)提供非功能性特性例如安全和健康检查给到生产环境中的应用程序。
转载自:https://blog.yoodb.com/yoodb/article/detail/1549
互联网大厂Java面试题集—Spring boot常见面试题(二)的更多相关文章
- 互联网大厂Java面试题集—Spring boot面试题(一)
Spring Boot 需要独立的容器运行吗? 可以不需要,内置了 Tomcat/ Jetty 等容器.通过pom.xml中导入依赖: <!--spring-boot-starter-web:代 ...
- spring cloud 常见面试题 来理解微服
为什么要谈 这些理论知识呢 理论知识 = 面试时候的谈资 !!! 你只有 进去公司 才有资格 去做一个码农 ok 话不多说 经历如此漫长的互联网发展 以本人的拙见 软件开发 粗略的 分为 ...
- (Java基础--Spring阶段)常见面试题题目及解析整理(2021.03.12)
题目整理 Java基础进阶阶段 基础概念类 1.JDK1.8新特性? 2.面向对象和面向过程的区别? 3.什么是值传递和引用传递? 4.什么是不可变对象? 5.讲讲类的实例化顺序? 6.java 创建 ...
- 关于Spring的常见面试题
1.Spring是什么? Spring是一个轻量级的IoC和AOP容器框架.是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求.常见的配置方 ...
- java容器源码分析及常见面试题笔记
概览 容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表. List Arraylist: Object数组 ...
- 死磕Spring之AOP篇 - Spring AOP常见面试题
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...
- Spring AOP常见面试题
一.AOP是什么? 与OOP对比,面向切面,传统的OOP开发中的代码逻辑是至上而下的过程中会长生一些横切性问题,这些横切性的问题和我们的主业务逻辑关系不会散落在代码的各个地方,造成难以维护,AOP的编 ...
- Java Spring Boot VS .NetCore (二)实现一个过滤器Filter
Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...
- 【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.欢迎 Sta ...
随机推荐
- 是true还是false呢?
古来圣贤皆寂寞 惟有[努]者留其名 ---[努]原文:饮 先总结一个小知识点:0.null.NaN.undefined."" 转成布尔值为false 其他则一律返回true 1.首 ...
- python自带的IDLE编译器,听说大神都用这个(附python下载安装教程)
python这两年这么火,学的人越来越多,小伙伴们都用什么编译器了? 今天教大家安装python并熟悉python自带的编译器IDLE. 第一步,进入python官网https://www.pytho ...
- deepin扬声器/耳机没有声音解决方案
昨天准备在deepin系统下看视频学习一下Linux,结果登入deepin系统后发现不论是外放还是插耳机竟然都没有声音,这种情况以前也出现过,只不过没有在意,后来就自己又好了,今天这次可真是让我决定要 ...
- C++学习笔记5_智能指针
1. 一般的指针int main(void){ int *p=new int; *p=20; delete p; return 0;}智能指针能自动回收#include<memory> 记 ...
- MIT线性代数:10.4个基本子空间
- [考试反思]0810NOIP模拟测试16:黎明
好吧,你尽力啦.我不说什么啦 []200 []180 [6]170 [7]160 [11]150 [12]140 还好,和前面的差距不大.虽说没有原来最好的那段时间考得那么好,但貌似还可以接受. 这次 ...
- MySQL 语句执行过程详解
MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 My ...
- python学习之【第三篇】:Python中的字符串及其所具有的方法
1.前言 字符串str是Python中最常用的数据类型.我们可以使用单引号''或双引号""包裹一段字符来创建字符串. 2.字符串创建 str1 = 'hello world' st ...
- Java实现不遍历数组求和
package com.jts.t1; /** * 不遍历数组求和 * 方法省略异常检查 */ public class Demo1 { public static void main(String[ ...
- Kickstart Round H 2019 Problem B. Diagonal Puzzle
有史以来打得最差的一次kickstart竟然发生在winter camp出结果前的最后一次ks = = 感觉自己的winter camp要凉了 究其原因,无非自己太眼高手低,好好做B, C的小数据,也 ...