SpringBoot基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。
SpringBoot的特性:
1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
2)内嵌Tomcat或Jetty等Servlet容器;
3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
4)尽可能自动配置Spring容器;
5)提供准备好的特性,如指标、健康检查和外部化配置;
6)绝对没有代码生成,不需要XML配置
1.开启springboot特性
1)继承 spring-boot-starter-parent
2)导入 spring-boot-dependencies
2.bootstrap vs application
boostrap 被父ApplicationContext加载,加载顺序优先与application[使用ApplicationContext加载],boostrap中配置的信息无法被修改覆盖【常用于Springcloud配置中心,加解密秘钥等配置】,application中的配置信息可以被修改覆盖【用于项目的自动化配置】。
3.核心注解
@SpringBootApplication(启动相关) = @SpringBootConfiguration(@Configuration) + @EnableAutoConfiguration + @ComponentScan(可无 手动加载Bean)
@SpringBootConfiguration 配置加载注解
@EnableAutoConfiguration 自动化配置注解
@ComponentScan 扫描+加载Bean
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
}
4.自动化配置流程
@EnableAutoConfiguration
=> @Import({AutoConfigurationImportSelector.class})
=> AutoConfigurationImportSelector.selectImports
=> AutoConfigurationImportSelector.getAutoConfigurationEntry
=> AutoConfigurationImportSelector.getCandidateConfigurations
=> SpringFactoriesLoader.loadFactoryNames 扫描具有META-INF/spring.factories包
MybatisPlus spring.factories 示例
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration,\
com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration
5.容器配置
内置tomcat容器,Tomcat历史悠久的Appache重量级服务器,jetty、undertow新生代轻量级服务器。在负载不大的情况jetty优于undertow与tomcat,随着负载增大undertow与tomcat的稳定性强于jetty【吞吐量、成功率】。
5.1集成undertow
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 移除 默认Tomcat -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加 Undertow -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<!-- 在springboot2.x之后的版本需要补充依赖 -->
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-core</artifactId>
<version>2.0.16.Final</version>
</dependency>
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-servlet</artifactId>
<version>2.0.16.Final</version>
</dependency>
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-websockets-jsr</artifactId>
<version>2.0.16.Final</version>
</dependency>
server:
undertow:
# 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
# 不要设置过大,如果过大,启动项目会报错:打开文件数过多
io-threads: 4
# 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程
# 它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8
worker-threads: 20
# 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
# 每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可
buffer-size: 1024
# 每个区分配的buffer数量 , 所以pool的大小是buffer-size * buffers-per-region
# 是否分配的直接内存
direct-buffers: true
port: 8008
6.@Value注解使用
6.1 yml 配置文件
value:
integer: 1
long: 10000
float: 3.14
double: 3.14159
boolean: true
string: adcd
array: 1,2,3
list: 1,2,3
set: 1,2,3
map: {name:"zha", age:18}
6.2 Java 代码块
@Value("${value.integer}")
private Integer intValue;
@Value("${value.long}")
private Long longValue;
@Value("${value.float}")
private Float floatValue;
@Value("${value.double}")
private Double doubleValue;
@Value("${value.boolean}")
private Boolean booleanValue;
@Value("${value.string}")
private String stringValue;
@Value("#{'$value.array}'.split(',')}")
private String[] values;
@Value("#{'${value.list}'.split(',')}")
private List<String> valueList;
@Value("#{'${value.set}'.split(',')}")
private Set<String> valueSet;
@Value("#{${value.map}}")
private Map<String, Object> valueMap;