- 8.1 SpringBoot是什么?为什么我们选择使SpringBoot开发?(必会)
- 8.2 SpringBoot常用的starter有哪些(必会)
- 8.3 SpringBoot自动配置的原理(高薪常问)
- 8.4 SpringBoot如何添加【修改代码】自动重启功能(了解)
- 8.5什么是 Spring Data?(必会)
- 8.6 SpringBoot 的核心配置文有哪几个?它们的区别是什么?(了解)
- 8.7 SpringBoot 的配置文件有哪几种格式?它们有什么区别?(必会)
- 8.8 运行SpringBoot有哪几种方式?(必会)
- 8.9 如何在 SpringBoot 启动的时候运行一些特定的代码?(了解)
- 8.10 SpringBoot 有哪几种读取配置的方式?(了解)
- 8.11 SpringBoot支持哪些日志框架?推荐和默认的日志框架是哪个?(必会)
- 8.12 SpringBoot 实现热部署有哪几种方式?(必会)
- 8.13 你如何理解 SpringBoot 配置加载顺序?(了解)
- 8.14 SpringBoot 如何定义多套不同环境配置?(高薪常问)
- 8.15 SpringBoot 可以兼容老Spring项目吗,如何做?(了解)
8.1 SpringBoot是什么?为什么我们选择使SpringBoot开发?(必会)
Spring Boot 被称为搭建程序的脚手架。其最主要作用就是帮我们快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让我们关注与业务而非配置。
传统的Java语言开发一直被人认为是臃肿和麻烦的,主要原因是:复杂的配置和一个混乱的的依赖管理。而Spring Boot 简化了基于Spring的应用开发,只需要“run”就能创建一个独立的、生产级别的Spring应用。Spring Boot为Spring平台及第三方库提供开箱即用的设置(提供默认设置,存放默认配置的包就是启动器starter),这样我们就可以简单的开始。多数Spring Boot应用只需要很少的Spring配置。
8.2 SpringBoot常用的starter有哪些(必会)
1.spring-boot-starter-web (嵌入tomcat和web开发需要servlet与jsp支持)
2.spring-boot-starter-data-jpa (数据库支持)
3.spring-boot-starter-data-Redis (Redis数据库支持)
4.spring-boot-starter-data-solr (solr搜索应用框架支持)
5.mybatis-spring-boot-starter (第三方的mybatis集成starter)
8.3 SpringBoot自动配置的原理(高薪常问)
1.@EnableAutoConfiguration这个注释告诉SpringBoot“猜”你将如何想配置Spring,基于你已经添加jar依赖项。如果spring-boot-starter-web已经添加Tomcat和Spring MVC,这个注释自动将假设您正在开发一个web应用程序并添加相应的spring设置。会自动去maven中读取每个starter中的spring.factories文件 该文件里配置了所有需要被创建spring容器中的bean
2.使用@SpringBootApplication注解 可以解决根类或者配置类(我自己的说法,就是main所在类)头上注解过多的问题,一个@SpringBootApplic
ation相当于@Configuration,@EnableAutoConfiguration和@Component
Scan并具有他们的默认属性值。Springboot自动装配注解流程如下:
8.4 SpringBoot如何添加【修改代码】自动重启功能(了解)
添加开发者工具集=====spring-boot-devtools
8.5什么是 Spring Data?(必会)
SpringData是一个用于简化数据库访问,并支持云服务的开源框架。
主要目标是使得数据库的访问变得方便快捷,并支持map-reduce框架和云计算机数据服务。它支持基于关系型数据库的数据服务,如OracleRAC等。对于拥有海量数据的项目,可以用SpringData来简化项目的开发,就如Spring Framework对JDBC,ORM的支持一样,SpringData会让数据访问变得更加方便。
8.6 SpringBoot 的核心配置文有哪几个?它们的区别是什么?(了解)
SpringBoot 的核心配置文件是 application 和 bootstrap 配置文件。 application配置文件这个容易理解,主要用于 Spring boot 项目的自动化配置。
bootstrap配置文件有以下几个应用场景。
使用 SpringCloud Config 配置中心时SpringBoot,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息; 一些固定的不能被覆盖的属性; 一些加密/解密的场景;
8.7 SpringBoot 的配置文件有哪几种格式?它们有什么区别?(必会)
.properties 和 .yml,它们的区别主要是书写格式不同。
1).properties
app.user.name = javastack
2).yml
app:
user:
name: javastack
另外,.yml 格式不支持 @PropertySource 注解导入配置。
8.8 运行SpringBoot有哪几种方式?(必会)
1)打包用命令或者放到容器中运行
2)用 Maven/ Gradle 插件运行
3)直接执行main方法运行
8.9 如何在 SpringBoot 启动的时候运行一些特定的代码?(了解)
可以实现接口 ApplicationRunner 或者 CommandLineRunner,这两个 接口实现方式一样,它们都只提供了一个run 方法。具体实现如下:
第一种方法实现ApplicationRunner接口,代码如下:
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("##################ApplicationRunner###############");
}
}
第二种方法实现CommandLineRunner接口,代码如下:
@Component
public class MyCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("****************************CommandLineRunner*********************");
}
}
8.10 SpringBoot 有哪几种读取配置的方式?(了解)
Spring Boot获取文件总的来说有三种方式,分别是@Value注解,@ConfigurationProperties注解和Environment接口。这三种注解可以配合着@PropertySource来使用,@PropertySource主要是用来指定具体的配置文件。
@PropertySource解析
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Repeatable(PropertySources.class)public @interface PropertySource {
String name() default "";
String[] value();
boolean ignoreResourceNotFound() default false;
String encoding() default "";
Class<? extends PropertySourceFactory> factory() default PropertySourceFactory.class;
}
l encoding():指定编码,因为properties文件的编码默认是ios8859-1,读取出来是乱码。
l factory():自定义解析文件类型,因为该注解默认只会加载properties文件,如果想要指定yml等其他格式的文件需要自定义实现。
一、@Value注解读取文件
新建两个配置文件config.properties和configs.properties,分别写入如下内容:
zhbin.config.web-configs.name=Java旅途
zhbin.config.web-configs.age=22
zhbin.config.web-configs.name=Java旅途
zhbin.config.web-configs.age=18
新增一个类用来读取配置文件
@Configuration
@PropertySource(value = {“classpath:config.properties”},encoding=”gbk”)public class GetProperties {
@Value(“${zhbin.config.web-configs.name}”)
private String name;
@Value(“${zhbin.config.web-configs.age}”)
private String age;
public String getConfig() {
return name+”——-“+age;
}
}
如果想要读取yml文件,则我们需要重写DefaultPropertySourceFactory,让其加载yml文件,然后在注解@PropertySource上自定factory。代码如下:
public class YmlConfigFactory extends DefaultPropertySourceFactory {
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
String sourceName = name != null ? name : resource.getResource().getFilename();
if (!resource.getResource().exists()) {
return new PropertiesPropertySource(sourceName, new Properties());
} else if (sourceName.endsWith(“.yml”) || sourceName.endsWith(“.yaml”)) {
Properties propertiesFromYaml = loadYml(resource);
return new PropertiesPropertySource(sourceName, propertiesFromYaml);
} else {
return super.createPropertySource(name, resource);
}
}
private Properties loadYml(EncodedResource resource) throws IOException {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(resource.getResource());
factory.afterPropertiesSet();
return factory.getObject();
}
}
@PropertySource(value= {“classpath:config.properties”},encoding=”gbk”,factory = YmlConfigFactory.class)
二、Environment读取文件
配置文件我们继续用上面的两个,定义一个类去读取配置文件
@Configuration
@PropertySource(value = {“classpath:config.properties”},encoding=”gbk”)public class GetProperties {
@Autowired
Environment environment;
public String getEnvConfig(){
String name = environment.getProperty(“zhbin.config.web-configs.name”);
String age = environment.getProperty(“zhbin.config.web-configs.age”);
return name+”——-“+age;
}
}
三、@ConfigurationProperties读取配置文件
@ConfigurationProperties可以将配置文件直接映射成一个实体类,然后我们可以直接操作实体类来获取配置文件相关数据。
新建一个yml文件,当然properties文件也没问题,如下:
zhbin:
config:
web-configs:
name: Java旅途
age: 20
新建实体类用来映射该配置:
@Component
@ConfigurationProperties(prefix = “zhbin.config”)@Datapublic class StudentYml {
// webConfigs务必与配置文件相对应,写为驼峰命名方式
private WebConfigs webConfigs = new WebConfigs();
@Data
public static class WebConfigs {
private String name;
private String age;
}
}
l prefix = “zhbin.config”用来指定配置文件前缀
如果需要获取list集合,则做以下修改即可。
zhbin:
config:
web-configs:
- name: Java旅途
age: 20
- name: Java旅途2
age: 202
@Component
@ConfigurationProperties(prefix = “zhbin.config”)@Datapublic class StudentYml {
private List
@Data
public static class WebConfigs {
private String name;
private String age;
}
}
l 添加日志依赖
假如maven依赖中添加了spring-boot-starter-logging:
l 级别控制
所有支持的日志记录系统都可以在Spring环境中设置记录级别(例如在application.properties中)
格式为:’logging.level. = LEVEL’
logging.level:日志级别控制前缀,为包名或Logger名
LEVEL:选项TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
举例:
logging.level.com.dudu=DEBUG:com.dudu包下所有class以DEBUG级别输出
logging.level.root=WARN:root日志以WARN级别输出
l 自定义日志配置
由于日志服务一般都在ApplicationContext创建前就初始化了,它并不是必须通过Spring的配置文件控制。因此通过系统属性和传统的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。
根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载:
Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
Log4j2:log4j2-spring.xml, log4j2.xml
JDK (Java Util Logging):logging.properties
Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,spring boot可以为它添加一些spring boot特有的配置项(下面会提到)。
8.11 SpringBoot支持哪些日志框架?推荐和默认的日志框架是哪个?(必会)
Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback。每种Logger都可以通过配置使用控制台或者文件输出日志内容。
l 默认日志Logback
SLF4J——Simple Logging Facade For Java,它是一个针对于各类Java日志框架的统一Facade抽象。Java日志框架众多——常用的有java.util.logging, log4j, logback,commons-logging, Spring框架使用的是Jakarta Commons Logging API (JCL)。而SLF4J定义了统一的日志抽象接口,而真正的日志实现则是在运行时决定的——它提供了各类日志框架的binding。
Logback是log4j框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持SLF4J。
默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台。在运行应用程序和其他例子时,你应该已经看到很多INFO级别的日志了。
8.12 SpringBoot 实现热部署有哪几种方式?(必会)
1、模板热部署
在SpringBoot中,模板引擎的页面默认是开启缓存的,如果修改了页面的内容,则刷新页面是得不到修改后的页面的,因此我们可以在application.properties中关闭模版引擎的缓存,如下:
Thymeleaf的配置:
spring.thymeleaf.cache=false
FreeMarker的配置:
spring.freemarker.cache=false
Groovy的配置:
spring.groovy.template.cache=false
Velocity的配置:
spring.velocity.cache=false
2、使用调试模式Debug实现热部署
此种方式为最简单最快速的一种热部署方式,运行系统时使用Debug模式,无需装任何插件即可,但是无发对配置文件,方法名称改变,增加类及方法进行热部署,使用范围有限。
3、spring-boot-devtools
在Spring Boot 项目中添加 spring-boot-devtools依赖即可实现页面和代码的热部署。如下:
此种方式的特点是作用范围广,系统的任何变动包括配置文件修改、方法名称变化都能覆盖,但是后遗症也非常明显,它是采用文件变化后重启的策略来实现了,主要是节省了我们手动点击重启的时间,提高了实效性,在体验上回稍差。
spring-boot-devtools 默认关闭了模版缓存,如果使用这种方式不用单独配置关闭模版缓存。
4、Spring Loaded
此种方式与Debug模式类似,适用范围有限,但是不依赖于Debug模式启动,通过Spring Loaded库文件启动,即可在正常模式下进行实时热部署。此种需要在 run confrgration 中进行配置。
5、JRebel
Jrebel是Java开发最好的热部署工具,对Spring Boot 提供了极佳的支持,JRebel为收费软件,试用期14天。可直接通过插件安装。
8.13 你如何理解 SpringBoot 配置加载顺序?(了解)
在 SpringBoot 里面,可以使用以下几种方式来加载配置。
1)properties文件;
2)YAML文件;
3)系统环境变量;
4)命令行参数; 等等……
我们可以在 Spring Beans 里面直接使用这些配置文件中加载的值,如:
1、使用 @Value 注解直接注入对应的值,这能获取到 Spring 中 Environment 的值;
2、使用 @ConfigurationProperties 注解把对应的值绑定到一个对象;
3、直接获取注入 Environment 进行获取;
8.14 SpringBoot 如何定义多套不同环境配置?(高薪常问)
一般情况下,多套不同环境(development、test、production)配置,我们基于Spring Boot的Profiles来实现。
profile配置方式有两种:
·多profile文件方式:提供多个配置文件,每个代表一种环境。
·application-dev.properties/yml 开发环境
·application-test.properties/yml 测试环境
·application-pro.properties/yml 生产环境
·yml多文档方式:在yml中使用 --- 分隔不同配置
profile激活三种方式:
·配置文件: 再配置文件中配置:spring.profiles.active=dev
·虚拟机参数:在VM options 指定:-Dspring.profiles.active=dev
·命令行参数:java –jar xxx.jar --spring.profiles.active=dev
但是考虑到一个问题,生产环境的配置文件的安全性,显然我们不能,也不应该把生产环境的配置文件放到项目仓库Git中,进行管理。一般我们将生产环境的配置文件放到生产环境的服务器中,以固定命令执行启动:
java -jar myboot.jar --spring.config.location=/xx/yy/xx/application-prod.properties。或者,使用Jenkins在执行打包,配置上maven profile功能,使用服务器的配置文件。最后一种方式,使用配置中心管理配置文件;
8.15 SpringBoot 可以兼容老Spring项目吗,如何做?(了解)
可以兼容,使用 @ImportResource 注解导入老Spring 项目配置文件。