什么是SpringBoot?
SpringBoot是一个快速开发的框架,能过快速整合第三方框架,他是如何快速整合的呢?其实它根据的基本原理是Maven依赖关系,Maven的集成,完全采用注解化,简化XML配置,内嵌HTTP服务器(Tomcat,jetty),默认嵌入Tomcat,最终以Java应用程序进行执行。
SpringBoot原理:Maven依赖关系,Maven的继承,完全采用注解化,Spring3.0以后采用注解方式启动SpringMVC。
为什么要用SpringBoot?
以往的项目整合起来是比较繁琐复杂的,而且存在jar包冲突的问题,这时候SpringBoot应运而生了,SpringBoot也就是用来做这个的。
Springboot 有哪些优点?
- 快速创建独立运行的spring项目与主流框架集成
- 使用嵌入式的servlet容器,应用无需打包成war包
- starters自动依赖与版本控制
- 大量的自动配置,简化开发,也可修改默认值
- 准生产环境的运行应用监控
- 与云计算的天然集成
SpringBoot启动方式?
Springboot启动方式主要有三种。
- 运行带有main方法类
这种比较简单,直接在idea或者eclipse中执行项目中的启动类。 - 通过命令行 java -jar 的方式
将项目打包成jar包,用Java命令直接启动。 - 通过spring-boot-plugin的方式
如果需要正常使用该maven插件,需要我们在maven项目中增加以下插件配置:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
准备工作做好之后,我们需要进入项目的根目录,执行
mvn spring-boot:run
Spring Boot、Spring MVC 和 Spring 有什么区别?
1、Spring
Spring最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转。
当我们恰当的使用 DI 或者是 IOC 的时候,我们可以开发松耦合应用。松耦合应用的单元测试可以很容易的进行。
2、Spring MVC
Spring MVC 提供了一种分离式的方法来开发 Web 应用。通过运用像 DispatcherServelet,MoudlAndView 和 ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单。
3、SpringBoot
Spring 和 SpringMVC 的问题在于需要配置大量的参数。
Spring Boot 通过一个自动配置和启动的项来目解决这个问题。为了更快的构建产品就绪应用程序,Spring Boot 提供了一些非功能性特征。
springboot是约定大于配置,可以简化spring的配置流程;
springmvc是基于servlet的mvc框架,个人感觉少了model中的映射。
以前web应用要使用到tomat服务器启动,而springboot内置服务器容器,通过@SpringBootApplication中注解类中main函数启动即可。
什么是自动配置?
Spring 和 SpringMVC 的问题在于需要配置大量的参数。
我们否带来更多的智能?当一个 MVC JAR 添加到应用程序中的时候,我们能否自动配置一些 beans?
Spring 查看(CLASSPATH 上可用的框架)已存在的应用程序的配置。在此基础上,Spring Boot 提供了配置应用程序和框架所需要的基本配置。这就是自动配置。
怎么理解springboot的约定大于配置
百度意思:约定优于配置(convention over configuration),也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。
在SpringBoot中,约定大于配置可以从以下两个方面来理解:
- 开发人员仅需规定应用中不符合约定的部分
- 在没有规定配置的地方,采用默认配置,以力求最简配置为核心思想
总的来说,上面两条都遵循了推荐默认配置的思想。当存在特殊需求的时候,自定义配置即可。这样可以大大的减少配置工作,这就是所谓的“约定”。
什么是 Spring Boot Stater ?
启动器是一套方便的依赖描述符,它可以放在自己的程序中。你可以一站式的获取你所需要的 Spring 和相关技术,而不需要依赖描述符的通过示例代码搜索和复制黏贴的负载。
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库,只要加入
spring-boot-starter-data-jpa 启动器依赖就能使用了。
例如,如果你想使用 Sping 和 JPA 访问数据库,只需要你的项目包含
spring-boot-starter-data-jpa 依赖项,你就可以完美进行。
为什么我们需要 spring-boot-maven-plugin?
spring-boot-maven-plugin 提供了一些像 jar 一样打包或者运行应用程序的命令。
- spring-boot:run 运行你的 SpringBooty 应用程序。
- spring-boot:repackage 重新打包你的 jar 包或者是 war 包使其可执行
- spring-boot:start 和 spring-boot:stop 管理 Spring Boot 应用程序的生命周期(也可以说是为了集成测试)。
- spring-boot:build-info 生成执行器可以使用的构造信息。
springboot自动配置的原理
在spring程序main方法中 添加@SpringBootApplication或者@EnableAutoConfiguration
会自动去maven中读取每个starter中的spring.factories文件,该文件里配置了所有需要被创建spring容器中的bean
能否在 spring-boot-starter-web 中用 jetty 代替 tomcat?
在 spring-boot-starter-web 移除现有的依赖项,并把下面这些添加进去。
SpringBoot与SpringCloud 区别?
Spring Boot是一种快速开发技术实现,约定大于配置;Spring Cloud提供了微服务系统中一站式的解决方案,每个微服务方案都以Spring Boot为基础。
SpringBoot中用哪些注解?
- @SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让spring Boot扫描到Configuration类并把它加入到程序上下文。
- @Configuration 等同于spring的XML配置文件;使用Java代码可以检查类型安全。
- @EnableAutoConfiguration 开启自动配置。
- @ComponentScan 组件扫描,可自动发现和装配一些Bean。
- @Component可配合CommandLineRunner使用,在程序启动后执行一些基础任务。
- @RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直接填入HTTP响应体中,是REST风格的控制器。
- @Autowired自动导入。
- @PathVariable获取参数。
- @JsonBackReference解决嵌套外链问题。
- @RepositoryRestResourcepublic配合spring-boot-starter-data-rest使用。
@EnableAutoConfiguration作用?
一是收集所有spring.factories中EnableAutoConfiguration相关bean的类,初始化为一个相关的bean;
二是将得到的类注册到spring容器中,启动自动化配置。
核心注解@SpringBootApplication原理?
springboot底层实现自动配置的步骤:
- springboot应用启动
- @SpringBootApplication起作用
- @EnableAutoConfiguration 自动配置
- @AutoConfigurationPackage:这个组合注解主要是@Import(AutoConfigurationPackages.Registrar.class),它通过将Registrar类导入到容器中,而Registrar类作用是扫描主配置类同级目录以及子包,并将相应的组件导入到springboot创建管理的容器中
- @Import(AutoConfigurationImportSelector.class):它通过将AutoConfigurationImportSelector类导入到容器中,AutoConfigurationImportSelector类作用是通过selectImports方法实现将配置类信息交给SpringFactory加载器进行一系列的容器创建过程。
SpringBoot热部署使用什么?
使用spring提供的devtools
热部署原理是什么?
原理就是重启项目,但比手动重启快多了,其深层原理是使用了两个ClassLoder,一个ClassLoader加载哪些不会改变的类(第三方jar包),另一个ClassLoader加载会更改的类.称之为restart ClassLoader,这样在有代码更改的时候,原来的restart Classloader被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间(5秒以内)
热部署原理与热加载区别是什么?
部署方式
热部署在服务器运行时重新部署项目
热加载在运行时重新加载class
实现原理
热部署直接重新加载整个应用
热加载在运行时重新加载class
使用场景
热部署更多的是在生产环境使用
热加载则更多的实在开发环境使用
热加载几乎没有
安全性,直接修改Java虚拟机中的字节码文件,难以监控和控制
热加载有个通俗的名字就是开发者模式
你们项目中异常是如何处理?
SpringBoot的项目已经对有一定的异常处理了,但是对于我们开发者而言可能就不太合适了,因此我们需要对这些异常进行统一的捕获并处理。SpringBoot中有一个@ControllerAdvice的注解,使用该注解表示开启了全局异常的捕获,我们只需在自定义一个方法使用@ExceptionHandler注解然后定义捕获异常的类型即可对这些捕获的异常进行统一的处理。
SpringBoot如何实现异步执行?
1、在application启动类中,加上@EnableAsync注解,Spring Boot 会自动扫描异步任务。
2、创建AsyncTask 异步任务类,加上@Component 注解,然后在需要异步执行的方法前面加上@Async注解,这样Spring Boot容器扫描到相关异步方法之后,调用时就会将这些方法异步执行。
3、最后调用任务类里面的方法
SpringBoot多数据源拆分的思路?
在一个项目中多数据源如何划分:1.分包名(业务) 2.注解方式
SpringBoot多数据源事务如何管理?
这里需要使用jta-atomikos进行事务管理。
SpringBoot如何实现打包?
springboot的打包方式有很多种。有打成war的,有打成jar的,也有直接提交到github,通过jekins进行打包部署的。
SpringBoot性能如何优化?
- Tomcat覆盖默认配置
server:
tomcat:
max-connections: 2000
accept-count: 100
threads:
max: 800
min-spare: 100
max-http-header-size: 131072
- 优化线程池配置
@EnableAsync
@Configuration
public class AsyncConfig {
public static final int CPUNMU = Runtime.getRuntime().availableProcessors();
@Bean(name = "taskExecutor")
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(CPUNMU);
executor.setMaxPoolSize(CPUNMU * 25);
executor.setQueueCapacity(5000);
executor.setKeepAliveSeconds(60);
executor.setThreadNamePrefix("Async-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(60);
return executor;
}
}
- 增加数据库连接池
@Primary
@Bean(name = "dataSource")
public DataSource dsDataSource(Environment environment) throws IOException {
try{
SQLServerDataSource ds = new SQLServerDataSource();
HikariDataSource ds2 = new HikariDataSource();
ds2.setDataSource(ds);
ds2.setMaximumPoolSize(100);
ds2.setConnectionTimeout(1800000);
ds2.setPoolName("DataSource-");
ds2.setMinimumIdle(20);
} catch (Exception e) {
logger.error("Config error: {}", e.getMessage());
}
return ds2;
}
- 增加缓存(SpringBoot Cache)
// Constant info cache
private static Map<String, String> constantCache = new ConcurrentHashMap<>(1024 * 5);
// token cache
private static Map<String, TokenCache> tokenCache = new ConcurrentHashMap<>(1024 * 5);
- 优化索引
- 增加Pod数量
- 增加Ingress数量
- 升级数据库的DTU
- 第三方API采用多线程调用
创建
completedFuture
supplyAsync 无参有返回值
runAsync 无参无返回值
whenComplete
thenApply 有参有返回值
thenAccept 有参无返回值
thenRun 无参无返回值
Scheduled job 增加@Async指定线程池,避免获取不到线程等等
@Async("xxxThreadPool")
ExecutorService pool = new ThreadPoolExecutor(0, 4,
20L, TimeUnit.SECONDS,
new SynchronousQueue<>(), new ThreadPoolExecutor.CallerRunsPolicy());
long start = System.currentTimeMillis();
List<CompletableFuture> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
final int t = i;
System.out.println("---" + t);
list.add(CompletableFuture.supplyAsync(() -> {
System.out.println("A- " + t + " - " + Thread.currentThread().getName());
try {
Thread.sleep(3 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "A- " + t;
}, pool));
}
CompletableFuture<Void> all = CompletableFuture.allOf(list.toArray(new CompletableFuture[list.size()]));
try {
all.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
boolean done = all.isDone();
System.out.println("all done = " + done + " use:" + (System.currentTimeMillis() - start));
System.out.println(LocalDateTime.now());
- blob文件上传下载采用多线程
- 异步日志
<Loggers>
<AsyncLogger name="com.xx.Main" level="trace" additivity="false">
<appender-ref ref="RollingFile"/>
</AsyncLogger>
<AsyncLogger name="RollingFile2" level="trace" additivity="false">
<appender-ref ref="RollingFile2"/>
</AsyncLogger>
<Root level="debug">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
SpringBoot2.0新特性?
1、基于 Java 8,支持 Java 9
也就是说Spring Boot2.0的最低版本要求为JDK8,据了解国内大部分的互联网公司系统都还跑在JDK1.6/7上,因此想要升级到Spring Boot2.0的同学们注意啦,同时支持了Java9,也仅仅是支持而已。
2、响应式编程
使用 Spring WebFlux/WebFlux.fn提供响应式 Web 编程支持, Webflux 是一个全新的非堵塞的函数式 Reactive Web 框架,可以用来构建异步的、非堵塞的、事件驱动的服务,在伸缩性方面表现非常好,此功能来源于Spring5.0。
Spring Boot2.0也提供对响应式编程的自动化配置,如:Reactive Spring Data、Reactive Spring Security 等
3、HTTP/2支持
在Tomcat, Undertow 和 Jetty 中均已支持 HTTP/2
4、对Kotlin支持
引入对 Kotlin 1.2.x 的支持,并提供了一个 runApplication 函数,让你通过惯用的 Kotlin 来运行 Spring Boot 应用程序。
5、全新的执行器架构
全新的执行器架构,支持 Spring MVC, WebFlux 和 Jersey
6、支持 Quartz
Spring Boot1.0并没有提供对 Quartz 的支持,之前出现了各种集成方案,Spring Boot2.0给出了最简单的集成方式。
7、Security
大大的简化了安全自动配置
8、Metrics
Metrics 方面,Spring Boot 2引入了Micrometer,来统一metrics的规范,使得开发人员更好的理解和使用metrics的模块,而不需要关心对接的具体存储是什么。
9、监控方面
Spring Boot 2 增强了对 Micrometer 的集成。RabbitMQ、JVM 线程和垃圾收集指标会自动进行 instrument 监控,异步控制器(controller)也会自动添加到监控里。通过集成,还可以对 InfluxDB 服务器进行监控。
10、数据方面
db方面,默认引入了HikariCP,替代了之前的tomcat-pool作为底层的数据库连接池, 对比于tomcat-pool, HikariCP拥有更好的性能,总而言之就是提高了db的访问速度
JOOQ的支持
Redis方面, 默认引入了Lettuce, 替代了之前的jedis作为底层的redis链接方式
MongoDB\Hibernate优化
11、Thymeleaf 3
Spring Boot 2支持了Thymeleaf 3,Thymeleaf 3相对于Thymeleaf 2性能提升可不是一点点,因为2.0的性能确实不咋地,同时也使用了新的页面解析系统。
12、OAuth 2.0
同时也加入了 对于OAuth 2.0的支持, 使得开发人员更加友好的使用spring-security来完成权限模块的开发
13、依赖组件的更新
Jetty 9.4
Tomcat 8.5
Flyway 5
Hibernate 5.2
Gradle 3.4
Thymeleaf 3.0
SpringBoot执行流程?
(1)创建 Spring Application 实例,调用 run 方法,同时将启动入口类作 为参数传递进去,由此开始了 Spring Boot 内部相关核心组件以及配置的启动和加载;
(2)通过 Spring Factories Loader 加载 META-INF/spring.factories 文 件,获取并创建 SpringApplicationRunListener 对象;
(3)然后由 SpringApplicationRunListener 来发出 starting 消息;
(4)创建参数,并配置当前 SpringBoot 应用需要使用的 Environment 实 例;
(5)完成之后,依然由 SpringApplicationRunListener 来发出 environmentPrepared 消息;
(6)创建 Spring 的应用上下文实例:ApplicationContext,初始化该实例 并设置应用环境配置实例:Environment,同时加载相关的配置项;
(7)由 SpringApplicationRunListener 发出 contextPrepared 消息,告 知 SpringBoot 应用当前使用的 ApplicationContext 已准备完毕;
(8)将各种 Bean 组件装载入 Spring 的 IO 容器/应用上下文: ApplicationContext 中,继续由 SpringApplicationRunListener 来发出 contextLoaded 消息,告知 SpringBoot 应用当前使用的 ApplicationContext 已准备完毕;
(9)重新刷新 Refresh Spring 的应用上下文实例:ApplicationContext, 完成 IOC 容器可用的最后一步;
(10)由 SpringApplicationRunListener 发出 started 消息,完成最终的 程序的启动;
(11)由 SpringApplicationRunListener 发出 running 消息,告知程序已成功运行起来了。
SpringBoot底层实现原理?
-
maven
子父依赖关系,快速整合第三方框架 -
无配置文件
省略了web.xml,spring.xml,springmvc.xml.mybatis.xml。
spring3.0以上提供注解,springboot通过java语言编写springmvc配置初始化,包括访问路径,视图解析器,也初始化非springmvc配置文件 -
内置tomcat
通过java语言创建tomcat,读取class文件到内存,由tomcat执行
SpringBoot装配Bean的原理?
就是Spring装配bean的原理,springboot就是在spring框架的基础上进行封装的。
项目部署后设置https请求
1、利用域名购买证书,配置tomcat
参看博客:https://cloud.tencent.com/developer/article/1758114
2、使用jdk自带工具生成证书,配置tomcat
参看博客:https://www.cnblogs.com/huaixiaonian/p/14922450.html
3、springboot项目启用HTTPS协议
参看博客:https://blog.csdn.net/enterys/article/details/52034250
4、nginx配置https请求
参看博客1:https://blog.csdn.net/u012486840/article/details/120940761
参看博客2:https://blog.csdn.net/weixin_42822484/article/details/106683207