1、Spring是什么?有什么优缺点?
Spring是一个分层的JavaSE/EE full-stack(一站式)轻量级开源框架.。Spring为不同的层都提供的企业级解决方案:
web层:spring mvc
service层:spring
dao层:JDBCTemplate、Spring data jpa(Java Persistence API)
Spring的核心思想是IOC(控制反转)和AOP(面向切面编程)优点:
①方便解耦,简化开发
②面向切面编程,可以更方便的对程序功能进行添加
③支持junit,可以通过注解的方式更简单的进行程序测试
④对JAVA EE开发中的一些API进行了封装,降低了应用难度
缺点:
框架中使用了大量的反射机制,反射机制很占内存。
2、为什么要有SpringBoot?它有什么优点?
为了简化开发过程,提高开发效率,降低内存占用量。
主要优点:独立运行,简化配置,自动配置,无代码生成和xml配置,无需部署war文件。
3、什么是Spring Boot Starters?
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。如你想使用Spring JPA访问数据库,只要加入spring-boot-starter-data-jpa启动器依赖就能使用了。
Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。
Spring Boot官方的启动器都是以spring-boot-starter-命名的,代表了一个特定的应用类型。
第三方的启动器不能以spring-boot开头命名,它们都被Spring Boot官方保留。一般一个第三方的应该这样命名,像mybatis的mybatis-spring-boot-starter。
4、SpringBoot支持哪些内嵌Servlet容器?
Spring Boot支持Tomcat、Jetty和Undertow三种Servlet容器嵌入到Web应用程序中,开发者使用starter即可方便嵌入,默认情况下,嵌入服务器的访问端口为8080。
5、如何在SpringBoot应用程序中使用Jetty而不是Tomcat?
Spring Boot启动程序通常使用Tomcat作为默认的嵌入式服务器。如果需要更改,可以排除Tomcat依赖项并改为包含Jetty
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
6、介绍一下@SpringBootApplication注解
这一注解位于启动类上,是SpringBoot的核心注解,该注解组合了三个注解:
@Configuration:实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能。
@ComponentScan:Spring组件扫描。
7、SpringBoot的自动配置是如何实现的?
SpringBoot的自动配置依赖三个注解:@EnableAutoConfiguration,@Configuration,@ConditionalOnClass
@EnableAutoConfiguration:开启自动配置,加载类路径以及所有jar包下MATE-INF/Spring.factories配置中映射的自动配置类,筛选有效的自动配置类,每一个自动配置类结合对应xxproperties.java,读取配置文件进行自动配置功能。
@Configuration:查找文件中带有该注解的类,对其进行自动注入。
@ConditionalOnClass:通过该注解,引用相应的包,配置相应的类。
8、开发RESTful Web服务常用的注解有哪些?
REST:表征状态转移,使用url表示资源,使用http动作操作资源
@RestController: 注解用于定义 RESTful web 服务,放在类上。
@RequestMapping :注解用于定义请求 URI 以访问 REST 端点。
@PathVariable 注解被用于定义自定义或动态的请求 URI,Path variable 被放在请求 URI 中的大括号内,如下所示:
public String query(@PathVariable("id") Integer StudentId){
......
}
@RequestParam 注解被用于从请求 URL 中读取请求参数。缺省情况下是必须的,也可以为请求参数设置默认值。
9、SpringBoot常用的两种配置文件
一种为.properties,一种为.yml,两种文件共存时,会默认使用peoperties文件
① .properties
app.user.name = javastack
② .yml
app:
user:
name: javastack
10、什么是YAML?YAML配置的优势在哪里
YAML是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML文件就更加结构化,而且更少混淆。它具有分层配置数据的特性,相同缩进的数据属于同一层。
通过key:value的方式进行内容存储。
11、SpringBoot常用的读取配置文件的方法有哪些?
可以通过@Value,@ConfigurationProperties,@PropertySource+@Value,@PropertySource+@ConfigurationProperties
@Value:通过@Value("${properties或yaml文件中的属性名}")方式来获取相应的属性值,放于类中对应的属性上。
@ConfigurationProperties:指定配置文件中属性的前缀或着后缀,@ConfigurationProperties(prefix = “xx”)。
上面两种都是默认读取application.properties或着application.yml文件中的属性配置。
@PropertySource+@Value:前一个注解用于读取指定的配置文件,@PropertySource(value = { “配置文件目录” }),@Value用于获取相应的属性值
@PropertySource+@ConfigurationProperties:与上面类似。
12、SpringBoot加载配置文件的优先级是什么?
分为4个优先级,优先级由高到低依次为:
–file:./config/
–file:./
–classpath:/config/
–classpath:/
所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容。
SpringBoot会从这四个位置全部加载主配置文件,如果高优先级中配置文件属性与低优先级配置文件不冲突的属性,则会共同存在—互补配置。
13、常用的Bean映射工具有哪些?
BeanUtils,BeanCopier,Orika。
BeanUtils:原理是先用 jdk 的 java.beans.Introspector类的getBeanInfo()方法获取对象的属性信息及属性get/set方法,接着使用反射(Method的invoke(Object obj, Object… args))方法进行赋值。
BeanCopier:cglib代理下使用的映射工具,直接使用ASM的MethodVisitor直接编写各属性的get/set方法生成class文件,然后进行执行。由于是直接生成字节码执行,所以BeanCopier的性能较采用反射的BeanUtils有较大提高。
Orika:底层采用了javassist类库生成Bean映射的字节码,之后直接加载执行生成的字节码文件,因此在速度上比使用反射进行赋值会快很多.
14、SpringBoot如何监控系统实际运行状况?
springboot 的 Actuator 提供了运行状态监控的功能,Actuator的监控数据可以通过REST、远程shell和JMX方式获得。
需要启动spring-boot-starter-actuator,访问的时候网址最后要加上“/actuator”。
15、SpringBoot如何做请求参数校验?
SpringBoot中提供了一个验证框架
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
springboot2.3.x版本以后需要手动添加。该框架提供了一系列的注解用于验证参数。
这些注解中有“massage”属性,当参数不符合要求时,用户得到的信息提示。在使用的时候,要在方法的参数前加上@Validated注解,这样之前定义的实体类参数校验规则才会生效。
16、如何使用SpringBoot实现全局异常处理?
通过@ControllerAdvice注解来实现全局异常处理。定义一个全局异常处理类,在类上加上该注解。该类中写对应异常的处理方法,方法上加上@ExceptionHandler(异常类名字.class)注解,用于标识异常类型对应的处理方法。
17、SpringBoot中如何实现定时任务?
实现定时任务有两种方法,一种简单,一种复杂。
第一种:通过@EnableScheduling和@Scheduled注解来实现。
@EnableScheduling:开启项目中的定时任务,和@SpringBootApplication放在一起
@Scheduled:配置定时任务,放于需要定时运行的方法上。该注解中有三种属性来表示定时的时间,如下
①fixedRate 表示任务执行之间的时间间隔,具体是指两次任务的开始时间间隔,即第二次任务开始时,第一次任务可能还没结束。
②fixedDelay 表示任务执行之间的时间间隔,具体是指本次任务结束到下次任务开始之间的时间间隔。
③initialDelay 表示首次任务启动的延迟时间。
④所有时间的单位都是毫秒。
同时该注解也支持cron表达式(详细书写方式百度)
第二种:通过添加Quartz依赖来实现。创建项目时添加:
也需要@EnableScheduling注解