1.什么是SpringBoot
- Spring Boot是Spring开源组织下的子项目,是Spring组件一站式解决方案,主要是简化了使用Spring的难度,简省了繁重的配置,提供了各种启动器,使开发者能快速上手
2.为什么要用SpringBoot
3.Spring Boot有哪些优点
- 1.容易上手,提升开发效率,为Spring开发提供一个更快、更简单的开发框架
- 2.开箱即用,远离繁琐的配置
- 3.提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等
- 4.SpringBoot总体就是使编码变简单、配置变简单、部署变简单、监控变简单等等
4.SpringBoot的缺点
- 1.依赖太多,一个spring booti项目就有很多Maven
- 2.缺少服务的注册和发现等解决方案
- 3.缺少监控集成方案,安全管理方案
- 4.将原有的spring项目转成springbooti项目,很困难,更适合新建的项目
- 5.集成度很高,对于了解底层不容易
5.Spring Boot的特征
(1)创建独立的Spring.应用程序
- Spring Boot可以jar包的形式进行独立的运行,使用:java -jar xx.jar就可以成功运行项目,或者在项目的主程序中运行main函数
(2)直接嵌入Tomcat,Jetty或Undertow(无需部署WAR包)
- Spring项目部署时需要我们在服务器上部署tomcat,然后把项目打成war包扔到tomcat里springboot项目不需要单独下载Tomcat等传统服务器,内嵌容器,使得我们可以执行运行项目的主程序main函数,并让项目的快速运行,另外,也降低对运行环境的基本要求,环境变量中有JDK即可。
(3)提供starter简化Maven配置
- Spring Boot提供了一系列的starter pom用来简化我们的Maven依赖,通过这些starter项目就能以Java Application的形式运行Spring Boot项目,而无需其他服务器配置
(4)尽可能自动配置Spring和3rd Party库
- Spring Boot提供Spring框架的最大自动化配置,大量使用自动配置,使得开发者对Spring的配置尽量减少Spring Boot更多的是采用Java Config的方式,对Spring进行配置
(5)提供生产就绪型功能,例如指标,运行状况检查和外部化配置
- Spring Boot提供了基于http、ssh、telnet对运行时的项目进行监控;我们可以引入spring-boot-start-actuator依赖,直接使用REST方式来获取进程的运行期性能参数,从而达到监控的目的,比较方便。但是Spring Boot只是个微框架,没有提供相应的服务发现与注册的配套功能,没有外围监控集成方案,没有外围安全管理方案,所以在微服务架构中,还需要Spring Cloud来配合一起使用。
(6)完全没有代码生成,也不需要XML配置
- Spring Boot的神奇的不是借助于代码生成来实现的,而是通过条件注解来实现的,这是Spring 4.x提供的新特性。Spring4.X提倡使用Java配置和注解配置组合,而Spring Boot不需要任何Xml配置即可实现Spring的所有配置。
6.SpringBoot与SpringCloud区别
- SpringBoot是快速开发的Spring框架,SpringCloud是完整的微服务框架,SpringCloud依赖于SpringBoot
7.如何快速构建一个SpringBoot项目
- 1.通过浏览器访问http://start.spring.io
- 2.通过Spring Tool Suite使用
- 3.通过Intellij IDEA使用
- 4.使用Spring Boot CLI使用
8.什么是yaml
- YAML是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比如果我们想要在配置文件中添加复杂的属性,YAML文件就更加结构化,而且更少混淆。可以看出YAML具有分层配置数据
9.SpringBoot支持配置文件的格式
- 1.properties
- java.xiaokaxiu.name=xiaoka。
- 2.yml
- java: xiaokaxiu: name:xiaoka
10.SpringBoot启动方式
- 1.main方法(开发调试阶段)
- 2.打包用命令或者放到容器中运行命令行java-jar的方式(现网)
- 3.mvn/gradle
- 在pom.xml文件所在的位置,输入mvn spring-boot:run
11.Spring Boot需要独立的容器运行
12.在Spring Boot里面,可以使用哪几种方式来加载配置
- 1.properties.文件
- 2.YAML文件
- 3.系统环境变量
- 4.命令行参数等等
13.SpringBoot配置属性加载的顺序
- 这个列表按照优先级排序,也就是说,任何在高优先级属性源里设置的属性都会覆盖低优先级的相同属性。
- 1.命令行参数
- 2.java:comp/env里的JNDl属性
- 3.JVM系统属性
- 4.操作系统环境变量
- 5.随机生成的带random.*前缀的属性
- (在设置其他属性时,可以引用它们,比如$(random.long))
- 6.应用程序以外的application.properties或者appliaction.yml文件
- 由jar包外向可jar包内进行寻找;优先加载带profile,6.jar包外部的application-{profile}.properties
- 或application.yml(带spring.profile)配置文件7.jar包内部的application-{profile}.properties
- 或application.yml(带spring.profile)配置文件再来加载不带profile的配置文件8.jar包外部的application.properties
- 或application.yml(不带spring.profile)配置文件9.jar包内部的application.properties
- 或application.yml(不带spring.profile)配置文件
- 7.打包在应用程序内的application.properties或者appliaction.yml文件
- 8.通过@PropertySource标注的属性源
- 9.默认属性
14.什么是SpringProfiles
- 一般来说我们从开发到生产,经过开发(dev)、测试(test)、上线(prod)。不同的时刻我们会用不同的配置。Spring Profiles允许用户根据配置文件(dev,test,prod等)来注册bean。它们可以让我们自己选择什么时候用什么配置。
15.不同的环境的配置文件
- 可以是application-{profile}.properties/yml,但默认是启动主配置文件application.properties,一般来说我们的不同环境配置如下:
- `application.properties:主配置文件
- `application-dev.properties`:开发环境配置文件
- `application-test.properties`:测试环境配置文件
- `application-prop-properties`:生产环境配置文件
16.如何激活某个环境的配置
- 比如我们激活开发环境。properties:
- spring.profiles.active=dev 命令行:java-jar zekun-v1.0.jar--spring.profiles.active=dev
17.application.properties和application.yml文件可放位置?优先级?
- 1.外置,在相对于应用程序运行目录的/config子目录里(-file:./config/)
- 2.外置,在应用程序运行的目录里(-file:./)
- 3.内置,在config包内(-classpath:/config/)
- 4.内置,在Classpath根目录(-classpath:/)
- 我们还可以通过spring.config.location来改变默认的配置文件位置项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties
- 优先级由高到底,高优先级的配置会覆盖低优先级的配置;SpringBoot会从这四个位置全部加载主配置文件;互补配置
18.SpringBoot如何修改端口号
- 1.yml中
- 2.properties
- 3.命令
- java -jar zekun.jar ——server.port=8888 或 java -Dserver.port=8888 -jar zekun.jar
19.[bootstrap.yml]和[application.yml]
- bootstrap.yml优先于application.yml
20.SpringBoot热部署方式
- TODO实现方式待注释
- 1.spring-boot-devtools
- 2.Spring Loaded
- 3.Jrebel
- 4.模版热部署
21.SpringBoot如何兼容Spring项目
- 在启动类加:@ImportResource(locations = {"classpath:spring.xml"})
22.获得Bean装配报告信息访问哪个端点
23.关闭应用程序访问哪个端点
- /shutdown 该端点默认是关闭的,如果开启,需要如下设置
- endpoints: shutdown: enabled:true
24.查看发布应用信息访问哪个端点
25.针对请求访问的几个组合注解
- 1.@PatchMapping负责部分更新,客户端提供要更新的那些字段(部分字段)
- 2.@PostMapping创建单个资源一般向 "资源集合" 型uri发起
- 3.@GetMapping查询
- 4.@PutMapping更新单个资源(全量),客户端提供完整的更新后的资源(可以理解为所有字段)
- 5.@DeleteMapping删除
26.开启SpringBoots特性的几种方式
- 1.继承spring-boot-starter-parent项目
- 2.导入spring-boot-dependencies项目依赖
27.SpringBoot中的starter
- 可以理解成对依赖的一种合成,starter会把一个或一套功能相关依赖都包含进来,避免了自己去依赖费事,还有各种包的冲突问题。大大的提升了开发效率。并且相关配置会有一个默认值,如果我们自己去配置,就会覆盖默认值。
28.SpringBoot Starter的工作原理
- 在sprinBoot启动时由@SpringBootApplication注解会自动去maven中读取每个starter中的spring.factories文件,该文件里配置了所有需要被创建为spring容器中的bean,并且进行自动配置把bean注入SpringContext中//(SpringContext是Spring的配置文件)
29.SpringBoot配置监控
- 引入spring-boot-starter-actuator依赖
org.springframework.boot
spring-boot-starter-actuator
30.SpringBoot集成Mybatis
mybatis-spring-boot-starter
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.1.1
31.SpringBoot启动类注解或核心注解?它是由哪些注解组成
- @SpringBootApplication
- @SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能
- 配置文件的路径是当前根目录(src/main/resources/application.yml等)
- @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项
- 例如:java如关闭数据源自动配置功能:@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})。
- TODO自动配置流程
- 该注解引入了AutoConfigurationlmportSelector,该类中的方法会扫描所有存在META-lNF/spring.factories的jar包
- @ComponentScan:Spring:组件扫描
32.SpringBoot的自动配置原理是什么
- 1.主要是Spring Boot的启动类上的核心注解SpringBootApplication注解主配置类,有了这个主配置类启动时就会为SpringBoot开启一个@EnableAutoConfiguration注解自动配置功能。
- 2.而这个注解也是一个派生注解,其中的关键功能由@Import提供,其导入的AutoConfigurationlmportSelector的selectlmports()方法通过SpringFactoriesLoader.loadFactoryNames()扫描所有具有META-lNF/spring.factories的jar包(从配置文件META-INF/Spring.factories加载可能用到的自动配置类)
- 3.去重,并将exclude和excludeName属性携带的类排除
- 4.过滤,将满足条件(@Conditional)的自动配置类返回
33.Async异步调用方法
- 在SpringBoot中使用异步调用是很简单的,只需要在方法上使用@Async注解即可实现方法的异步调用。注意:需要在启动类加入@EnableAsync使异步调用@Async注解生效
34.编写测试用例的注解
35.SpringBoots异常处理相关注解
- 1.@ControllerAdvice
- 2.@ExceptionHandler
- 控制器通知(@ControllerAdvice或@RestControllerAdvice),它将所有控制器作为一个切面,利用切面技术来实现。组合可以拦截所有控制器发生的异常,可以处理除"404"以外的运行异常
/**自定义业务异常*注意:如果继承的是Exception类,那么Spring的事务管理将会失效,
*只有继承RuntimeException类才使Spring的事务管理不会失效**/
public class BusinessException extends RuntimeException{
private String errorMessage; //异常信息
public BusinessException(String errorMessage){
super(errorMessage);
this.errorMessage=errorMessage;
}
public String getErrorMessage(){
return errorMessage;
}
public void setErrorMessage(String errorMessage){
this.errorMessage = errorMessage;
}}
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
/**全局异常处理器*/
@ControllerAdvice
public class BusinessExceptionHandler{
//日志对象
private Logger logger = LogManager.getLogger(BusinessExceptionHandler.class);
/**自定义业务异常处理*/
@ExceptionHandler(BusinessException.class)
public ModelAndView businessExceptionHandler(BusinessException ex){
//错误信息
String errorMessage = ex.getErrorMessage();
//记录异常日志
logger.error("[业务异常]" + errorMessage);
//返回错误页面
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("errorMessage",errorMessage);
modelAndView.setViewName("error.html");
return modelAndView;}}
/**获取博客信息*/
@RequestMapping("/bloglnfo")
public String bloglnfo(Date date,Modelmodel){
boolean isException = true;
if(isException){
throw new BusinessException("这是自定义异常信息");
}
model.addAttribute("date",date);
return "blog-info.html";
}
36.SpringBooti读取配置相关注解有
- 1.@PropertySource读取自定义的配置文件中定义的属性
使用方式:@PropertySource(alue={classpath:/指定配置文件名称})该注解加在类上
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@PropertySource(value={"classpath:/user.properties"})
public class User
@Value("${user.username}")
private String username; //csp1999
@Value("${user.password}")
private String password; //123456
@Value("S{user.age}")
private int age; //22
}
@Value("${user.username}")
private String userName;
引入配置文件的值时,只要直接将Environment类引入即可
@Autowired
private Environment environment;
@RequestMapping(value="/environment",method=RequestMethod.GET)
public StringenvironmentTest{
String value=environment.getRequiredProperty("user.username")
+""+environment.getRequiredProperty("user.sex")
+""+environment.getRequiredProperty("user.age");
System.out.println(value);return value;
}
- 4.@ConfigurationPropertiesi读取默认配置文件中定义的属性但是可以指定属性前缀
使用@ConfigurationProperties)注解来进行配置文件的注入时,需要定义一个配置类
@Data
@Configuration
@ConfigurationProperties(prefix="user")
public class PropertiesConfig{
private String userName;
private String sex;
private Integer age;
}
//prefix--指定配置项中的前缀注意:
1、使用@ConfigurationProperties的配置类中@Configuration注解不能少,因为@ConfigurationProperties在项目加载的时候并不能够将配置类作为bean添加到Springl的容器中。
2、如果不想在配置类中使用@Configuration注解,也可以用其他的形式,如在项目的启动类中添加@EnableConfigurationProperties(value={PropertiesConfig.class))一样可以达到bean注入的效果。
org.springframework.boot
spring-boot-configuration-processor
true
- 5.@EnableConfigurationProperties
@ConfigurationProperties和@EnableConfigurationProperties配合使用
@Data//@Component
// 未将DemoConfig1交给IOC管理@ConfigurationProperties(prefix="csp.user2")
public class DemoConfig1 {
private String username1;
private Stringpassword1;
}
@Service//或者@Configuration/@Componet/@Controller/@Repository只需要交给IOC管理即可@EnableConfigurationProperties({
DemoConfig1.class
})
public class TestService{
@Autowired
private DemoConfig1 demoConfig1;
@Autowired
private DemoConfig2 demoConfig2;
}
37.如何在Spring Boot启动的时候运行一些特定的代码·可以实现接口ApplicationRunner或者CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个run方法
- SpringBoot应用启动成功以后就会callRunners方法,方法中调用ApplicationRunner和CommandLineRunner接口的run方法,只在启动成功以后调用一次。所以,在这基础上就可以实现相当于开机自启的一个操作,具体执行的逻辑代码就看在应用启动后需要做什么事情了,比如初始化一些数据实现CommandLineRunner接口,重写run方法,方法参数是原始args参数实现ApplicationRunner接口,重写run方法,方法参数是ApplicationArguments,解析封装过后的args参数
38.SpringBoot1.x和2.x区别
- 配置变更JDK版本升级第三方类库升级响应式Spring编程支持HTTP/2支持配置属性绑定更多改进与加强
- 1.SpringBoot 2基于Spring5和JDK8,Spring 1x用的是低版本
- 2.配置变更,参数名等
- 3.SpringBoot 2相关的插件最低版本很多都比原来高
- 4.2x配置中的中文可以直接读取,不用转码
- 5.Actuator的变化
- 6.CacheManager的变化
39.SpringBoot支持哪些日志框架,推荐和默认的日志框架是哪个
- TODO日志框架集成
- Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果你使用Starters启动器Spring Boot将使用Logback作为默认日志框架,但是不管是那种日志框架他都支持将日志信息输出到控制台或者文件中
40.SpringBoot支持什么前端模板
- thymeleaf,freemarker,jsp,官方不推荐JSP会有限制
41.什么是JavaConfig
- Spring JavaConfig是Spring社区的产品,Spring 3.0引入了他,它提供了配置Spring IOC容器的纯Java方法。因此它有助于避免使用XML配置
42.使用JavaConfig的优点
- 1.面向对象的配置。由于配置被定义为JavaConfig中的类,因此用户可以充分利用Java中的面向对象功能。一个配置类可以继承另一个,重写它的@Bean方法等。
- 2.减少或消除XML配置。基于依赖注入原则的外化配置的好处已被证明。但是,许多开发人员不希望在XML和Java之间来回切换。JavaConfig为开发人员提供了一种纯Java方法来配置与XML配置概念相似的Spring容器。从技术角度来讲,只使用JavaConfig配置类来配置容器是可行的,但实际上很多人认为将JavaConfig与XML混合匹配是理想的。
- 3.类型安全和重构友好。JavaConfig提供了一种类型安全的方法来配置Spring容器。由于Java5.0对泛型的支持,现在可以按类型而不是按名称检索bean,不需要任何强制转换或基于字符串的查找。
43.常用的Java config
- 1.@Configuration:在类上打上写下此注解,表示这个类是配置类
- 2.@ComponentScan:在配置类上添加@ComponentScan注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的<context:component-scan>
- 3.@Bean:bean的注入:相当于以前的<bean id="objectMapper"class="org.codehaus.jackson.map.ObjectMapper"/>
- 4.@EnableWebMvc:相当于xml的<mvc:annotation-driven>
- 5.@ImportResource
- 6.@ImportResource:相当于xml的<import resource="applicationContext-cache.xml">