互联网大厂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 ...
随机推荐
- 七牛云图片存储---Java
一.新建存储空间 到七牛云官网注册一个账号 新建一个存储空间 到个人中心获取秘钥 二.新建Java项目 1.pom.xml配置 <dependency> <groupId>co ...
- html2canvas 生成电子合同书
首先给合同书父级加个ref 然后用html2canvas 插件 然后html2canvas 坑区来了,生成页面的时候,合同书是很长的.他有一部分是黑色的, 最开始从前辈们了解到是滚至顶部解决偏移.然后 ...
- 上下文管理器及with的相关总结
什么是上下文管理器 基本语法 with EXPR as VAR: BLOCK 概念 上下文表达式:with open('test.txt') as f: 上下文管理器:open('test.txt') ...
- 学习笔记32_EF查询优化
*如果有 var temp = from m in dbContext.Model1 where m.属性1 == value select m; foreach(var m1 in temp)//这 ...
- 「2019.7.22 考试」AC和WA0一步之遥
这卷子还是答的挺惨的. 第一题5min写完了,自认为AC(其实WA了80),第二题推了半天CRT的公式老出错结果发现是程序打错了.第三题打模拟150行结果数组没开够,开大就是0->60的转变.状 ...
- Apache配置反向代理、负载均衡和集群(mod_proxy方式)
Apache配置负载均衡和集群使用mod_jk的方式比较多,但是mod_jk已经停止更新,并且配置相对复杂.Apache2.2以后,提供了一种原生的方式配置负载均衡和集群,比mod_jk简单很多. 1 ...
- 数据结构--树链剖分准备之LCA
有关LCA的模板题 传送门 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和 ...
- 爬虫学习--常用的正则表达式 Day3
在做爬虫经常遇到需要用正则校验数据时候,往往是在网上去找很久,结果找来的还是不很符合要求.所以我最近把开发中常用的一些正则表达式整理了一下,给自己留个底,也给朋友们做个参考. 一.校验数字的表达式 1 ...
- 『题解』洛谷P2357 守墓人
Portal Portal1: Luogu Description 在一个荒凉的墓地上有一个令人尊敬的守墓人,他看守的墓地从来没有被盗过, 所以人们很放心的把自己的先人的墓安顿在他那守墓人能看好这片墓 ...
- acm经验(转)
先简单介绍一下自己: 高中在OI打过一段时间酱油,大一后暑假进入ACM集训队,到大三寒假,总共一年半的ACM生涯. 总共参加了四场比赛:区域赛一银(2013长春)一铜(2013杭州)一铁(2012金华 ...