Spring Boot 学习笔记
微服务架构
如何创建一个 Spring boot
- 可以直接在官网配置好后下载压缩包解压项目
- 直接使用IDEA创建Springboot项目 (开发常用)
目录解析
pom.xml
- spring-boot-dependencies: 核心依赖在父工程中!
- 我们在写或者引入一些Springboot依赖的时候, 不需要指定版本,就因为有这些版本仓库
- 比如 spring-boot-starter-web 他会帮我们自动导入web环境所有的依赖
- springboot会将所有的功能场景,都变成一个个的启动器
主程序
@SpringBootApplication
public class Springboot01Application {
public static void main(String[] args) {
//将springboot应用启动
SpringApplication.run(Springboot01Application.class, args);
}
}
application.yaml
配置文件,可配置端口号等信息 及 配置对象
server:
port: 80
person:
name: lyc
age: 21
happy: false
brith: 2020/03/06
maps: {k1: v1,k2: v2}
lists:
- code
- movie
- music
dog:
name: 旺财
age: 3
这样配好后即可在Person类上添加注解
//告诉springboot 本类去注入 配置文件中写好了属性的对象
@ConfigurationProperties(prefix = "person")
@Component
在程序中获取对象时则无需再赋值 或 用@Value赋值
/**。 classpath:/META-INF/resources,classpath:/resources,classpath:/static/,classpath:/public/
自动配置分析
以HttpEncodingAutoConfiguration为例
HttpEncodingAutoConfiguration.java
@Configuration(proxyBeanMethods = false) //表示这是一个配置类像以前的配置文件,可以给容器中添加组组件 proxyBeanMethods 代表其他类能否访问这个类下的@bean类
@EnableConfigurationProperties(HttpProperties.class)//启用指定类的ConfigurationProperties功能,并且把HttpProperties加入到容器中,下面有参构造就可以读取到HttpProperties对象
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
//满足 当前这个应用是web应用 的条件时 , 才会让这个当前这个类生效
@ConditionalOnClass(CharacterEncodingFilter.class)
//满足 当前项目有CharacterEncodingFilter这个类(Springmvc中的乱码的过滤器) 的条件时 , 才会让这个当前这个类生效
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
//满足 配置文件中存在spring.http.encoding.enabled这个配置 或者 前者判断不存在(好像有点矛盾,反正这个类一定会生效的意思) 的条件时 , 才会让这个当前这个类生效
//即使不配置spring.http.encoding.enabled,也默认生效
HttpProperties.java
@ConfigurationProperties(prefix = "spring.http") //从配置文件获取指定的值进行绑定
public class HttpProperties {
//HTTP encoding properties.
private final Encoding encoding = new Encoding();
public static class Encoding {
/*可以通过配置文件中的
spring:
http:
encoding:
charset:
的值来获取, 同样下的force、forceRequest、forceRequest、forceResponse······也是如此
*/
public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
private Charset charset = DEFAULT_CHARSET;
private Boolean force;
private Boolean forceRequest;
private Boolean forceResponse;
private Map<Locale, Charset> mapping;
public Charset getCharset() {
return this.charset;
}
public void setCharset(Charset charset) {
this.charset = charset;
}
}
当HttpEncodingAutoConfiguration上的注解条件满足 生效后, 回来再看这个类
HttpEncodingAutoConfiguration.java
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(HttpProperties.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
//他已经和springboot的配置文件映射了
private final HttpProperties.Encoding properties;
//只有一个有参构造的情况下,参数值就会从容器中拿
public HttpEncodingAutoConfiguration(HttpProperties properties) {
this.properties = properties.getEncoding();
}
@Bean //给容器中增加一个组件 这个组件的某些值需要从properties中获取
@ConditionalOnMissingBean
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
public LocaleCharsetMappingsCustomizer localeCharsetMappingsCustomizer() {
return new LocaleCharsetMappingsCustomizer(this.properties);
}
根据当前不同的条件判断,决定这个配置类是否生效?
一但这个配置类生效 ;这个配置类就会给容器中添加各种组件;这些组件的属性是从对应的properties类中获取
的,这些类里面的每一个属性又是和配置文件绑定的;
总结
springboot启动的时候会去加载所有包下的MATE_INF/spring.factories里的自动配置类XXXAutoConfiguration,这个自动配置类的@Configuration表示这是一个java配置类 ,可以和@Bean共同使用向容器中注入组件,而这些组件需要一些配置信息 然后这个自动配置类通过注解@EnableConfigurationProperties(XXX.Properties.class)对应一个Properties的配置文件 拿到配置信息,而配置文件又可以通过注解@ConfigurationProperties(prefix=“xxx.xx”)绑定yml配置文件里的前缀.一般使用默认配置,想修改的话在application.yml配置文件中修改对应属性。