一.简介
1.spring boot
spring boot 用来简化spring应用开发,约定大于配置
javaEE开发的一站式框架
2.微服务
微服务是一种架构风格,一个应用应该是一组小型服务,可以通过HTTP的方式进行互通
每个功能元素最终都是可独立替换和独立升级的软件单元
二.helloworld
1.引入相关依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--这个插件,可将应用打成jar包,方便部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</dependency>
</dependencies>
(生成的jar包中携带了嵌入式的tomcat服务器,不需要我们在环境中部署tomcat。直接运行jar包即可)
2.编写启动类
@SpringBootApplication
public class HelloWorldMainApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldMainApplication.class,args);
}
}
3.探究
(1)他的真正父项目是spring-boot-dependencies。它是版本仲裁中心,以后我们的依赖默认不需要写版本(仲裁中心有的)
(2)spring-boot-starter:spring-boot场景启动器,springboot将所有功能场景抽取出来,做成一个个staters(启动器),只要在项目中引入这些stater相关场景的所有依赖都会导入进来
(3)①@springBootApplication:指明某个类是主配置类,springboot就会应用这个类的main方法来启动springboot应用。进入该注解中,会发现其它注解:
②@SpringBootConfiguration:springboot的配置类(内部其实就是@configuration注解)
③@EnableAutoConfiguration:组合注解,开启自动配置功能
1) --->@AutoConfigurationPackage--->@Import({Registrar.class}) :将主配置类所在的包下面的组件扫描到spring容器
2)--->@Import({EnableAutoConfigurationImportSelector.class}):导入哪些组件选择器,将需要的组件以全类名方式返回
会给容器中导入非常多的自动配置类(XXAutoConfiguration):给容器导入这个场景需要的所有组件,并配置好这些组件(96个)--->loadFactoryNames(factoryClass,classLoader)从类路径的META-INF/spring.factories中获取EnableAutoConfiguration指定的值
4.使用spring Initializer快速创建spring boot项目
(1)resources文件夹目录结构:
①static:保存所有的静态资源;js css images
②templates:保存所有的模板页面(默认jar包使用嵌入式tomcat,默认不支持jsp页面)freemarker,thymeleaf
③application.properties:springboot应用的配置文件,可以修改一些默认配置
三. springboot配置
1.springboot使用一个全局配置文件:application.properties/yml
2.YAML:标记语言,以前的配置文件大多xx.xml.YAML以数据为中心,比json,xml等更适合做配置文件(xml浪费大量数据在标签上)
3.YAML语法:(1)使用缩进表示层级关系(2)缩进不许使用Tab键,只允许使用空格,空格数目不重要,同级左侧对齐即可(3)大小写敏感(4)key:(空格)value
4.YAML支持的三种数据结构:(1)对象:键值对的集合(2)数组:一组按次序排列的值(3)字面量:单个的,不可再分的值(数字,字符串,布尔)
5.(1)对象和map的写法
方式一:在下一行写对象属性和值的关系
friends:
lastName: kaka
age: 18
方式二:行内写法
friends: {lastName: kaka,age: 20}
(2)数组
方式一:用-值表示数组中的一个元素
pets:
- cat
- dog
- pig
方式二:行内写法
pets: [cat,dog,pig]
6.从配置文件中获取值:
<!--配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
(idea默认utf编码,properties ascii进行编码,通过setting设置是否转成ascii码勾选)
(1)@configurationProperties(prefix = “”):将本类所有属性和配置文件相关配置绑定,支持松散语法绑定
默认从全局配置文件中获取值。
(2)@values():不支持松散语法绑定。不支持复杂类型封装(map,list等)
(3)@propertiesSource(value = {“classpath:person.properties”}):加载指定路径配置文件
(4)@ImportResource(locations = {"classpath:beans.xml"}):导入spring配置文件
7.配置文件优先级:
根目录下config/xx.(根目录和src同级)
根目录下XX.
类路径下:config/xx.
类路径下:XX
(优先级由高到低)高优先级覆盖低优先级
四. 自动配置原理
1. springBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration:利用@Import({EnableAutoConfigurationImportSelector.class})给容器中导入一些组件。
2.EnableAutoConfigurationImportSelector的父类AutoConfigurationImportSelector调用selectImports()方法。方法中的内容:
(1)获取所有自动配置类
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
其中调用下面的方法扫描所有jar包类路径下 META-INF/spring.factories。把扫描到文件的内容包装成properties对象。从properties中获取到EnableAutoConfigurtion.class(类名)对应的值(这些值就是自动配置类名),然后把它们添加在容器中
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
3.以HttpEncodingAutoConfiguration这个自动配置类为例讲解自动配置
(1)根据当前不同条件判断,决定这个配置类是否生效
//表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件
@Configuration
//将配置文件中配置的值和类HttpEncodingProperties绑定起来,并把HttpEncodingProperties加入ioc容器
@EnableConfigurationProperties({HttpEncodingProperties.class})
//spring底层@Condition注解,如果满足指定条件,整个配置类里面的配置就会生效(此处为判断当前应用是否为web应用,如果是,当前配置类生效)
@ConditionalOnWebApplication
//判断当前项目有没有CharacterEncodingFilter这个类
@ConditionalOnClass({CharacterEncodingFilter.class})
//判断是否存在某个配置
@ConditionalOnProperty(
prefix = "spring.http.encoding",
value = {"enabled"},
matchIfMissing = true
)
public class HttpEncodingAutoConfiguration {
private final HttpEncodingProperties properties;
public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
this.properties = properties;
}
}
五. 日志框架
1.常见日志框架
2.志框springBoot使用日志
springBoot(slf4j+logback): Spring(commons-logging)、Hibernate(jboss-logging)、MyBatis、xxxx
统一日志记录,即使是别的框架和我一起统一使用slf4j进行输出?
如何让系统中所有的日志都统一到slf4j;
(1)、将系统中其他日志框架先排除出去;
(2)、用中间包来替换原有的日志框架;
(3)、我们导入slf4j其他的实现 ;
3. 总结
(1)springBoot底层使用slf4j+logback的方式进行日志记录
(2)springBoot通过中间包(类名都一致,但内部的实现编程了SLF4J)把其它日志都替换成了slf4j
4.日志的配置
//指定日志级别 trace debug info warn error(默认info级别)
logging.level.com.kaka=trace
//指定位置生成日志目录
logging.path=G:/springboot.log
//指定文件中日志的输出格式
logging.pattern.file=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} -%ms%n
//指定控制台日志输出格式
logging.pattern.condole=
六. springboot对静态资源的映射规则
1. webjars:以jar包的方式引入静态资源;
(1)、所有 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找资源;
(2)、”/**” 访问当前项目的任何资源,都去(静态资源的文件夹)找映射
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
"/":当前项目的根路径
(3)、欢迎页; 静态资源文件夹下的所有index.html页面;被”/**”映射;==
localhost:8080/ 找index页面
(4)、所有的 **/favicon.ico 都是在静态资源文件下找;==