一、Spring Boot 基本认知
-
什么是springboot
Springboot是对Spring系列众多框架的整合,一种全新的编程规范,算是框架中的框架。它简化了Spring众多框架的配置,可以很简单的就创建一个你可以运行的独立的、生产级别的应用系统。
Springboot默认内置一个Tomcat ,不需要打war包,直接运行jar 即可运行。无需XML配置文件,springboot可以自动扫描包路径,转载并注入对象,并能做到根据 classpath 下jar包自动配置。 -
发展历史
SpringBoot是近几年才发展是来的,主要是能快速开发微服务,适应当下对分布式的需求。2014年springboot开始崛起,进入springboot1.x 时代,以下是springboot版本变迁的主要特点:
1.x xml时代
2.x 业务注解,基础配置用xml
3.x ,4.x java配置类
5.x 响应式 异步编程时代
二、Spring Boot 核心注解
我们很多人接触第一次SpringBoot会用IDEA创建一个springboot 的web项目,写个HelloWord 就可以直接运行了。没有SpringMVC那么多配置。这是怎么做到的???
@SpringBootApplication
在项目的启动类中,都有这个注解:@SpringBootApplication ,该注解是springboot的核心注解。按住Ctrl,选中@SpringBootApplication 进入SpringBootApplication.class ;有两个注解@SpringBootConfiguration和 @EnableAutoConfiguration,以下主要讲解着两个注解类。
-
@SpringBootConfiguration
springboot的配置类注解,按住 Ctrl进入分析,会有一个@Configuration注解接口,@Configuration 表示该类是"配置类" 。当类@Configuration注解时,表示该类是配置类。这样我们就不需要在配置文件中写配置,而是被class类文件代替。有@Configuration注解,该类自动加入spring容器,由容器统一托管。 -
@EnableAutoConfiguration
在springMVC项目中,你一定会看到springMVC配置文件:spring.xml ,mybatis.xml等;为什么springboot不需要类似的配置文件,就可以自己运行?
因为springboot可以自动配置,帮我们都自动配置好了,不需要我们自己手动配置,实现开箱即用的效果。这就是springboot的自动配置。
而 @EnableAutoConfiguration注解springboot实现自动配置。
例子:
1.@AutoConfigurationPackage 将自动将需要的包及子包纳入spring容器中
通过getPackageName()方法
2.AutoConfigurationImportSelector 自动引入第三方依赖(jar包, 配置)
//纳入到扫描器scan
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return NO_IMPORTS;
} else {
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
}
总结:
编写项目时,springMVC 需要手动在代码中对三方依赖进行配置,但是springboot可以自动进行配置
a. 自己写的代码,@SpringBootConfiguration会扫描配置 ,纳入Spring容器,实现自动配置。
b. 第三方依赖的jar或配置
@EnableAutoConfiguration 会自动配置 不需要自己写spring.xml ,mybatis.xml等配置文件 。
三、如何自动装配
HttpEncodingAutoConfiguration 类
@Configuration :是一个配置类,将此类纳入Spring容器
@EnableConfigurationProperties(HttpEncodingProperties.class) 通过HttpEncodingProperties编码设置成UTF-8(即可自动装配)
如何修改:HttpEncodingProperties
在application.propreties 中 spring.http.encoding.charset=utf-16
prefix + 属性名 ==》引出 配置文件来源:各人文件的prefix
配置文件执行的条件: @Conditional 条件
@ConditionalOnWebApplication 是web应用
@ConditionalOnClass(CharacterEncodingFilter.class) 项目中存在CharacterEncodingFilter该类
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
@Bean
@ConditionalOnMissingBean(CharacterEncodingFilter.class)
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
return filter;
}
将该方法配置 ,@Bean 纳入spring 容器中,使方法生效
总结: Configuration 有很多条件,@Conditional当这些条件都满足时,自动装配生效
可以通过yml properties 的文件修改, ‘prefix的值 + 属性名’ 修改配置