SpringBoot 开始学习
基础部分--自动配置原理
1.<!-- 继承父包 :版本仲裁-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath></relativePath>
</parent>
2.spring-boot-starter: springboot 场景启动器
Springboot将所有功能场景抽取出来,做成了一个个的starter(启动器)
要用什么功能就导入相应的场景启动器
spring-boot-starter-xxx是官方提供的starter,xxx-spring-boot-starter是第三方提供的starter
3.SpringBoot在启动时从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值
将这些值作为自动配置类导入到容器,自动配置类就生效,帮我们进行自动配置工作。
以前需要自己配置的东西,自动配置类
@Import({Registrar.class}) //实现包扫描导入组件
@Import({EnableAutoConfigurationImportSelector.class}) //实现导入自动配置类
自动配置类在spring-boot-starter-autoconfigure的jar包中,也可以自己写自动配置类
自动配置类必须在一定条件下生效
配置文件做如下配置:
debug=true
打印自动配置报告,这样就可以知道自动配置类生效
4.配置文件的加载路径及设置
application.properties或者application.yml可以修改默认的配置
SpringBoot默认加入很多的自动配置类组件,
其中这些组件的属性有的给了默认值,有的可以通过配置文件注入属性
理解pom.xml中 spring-boot-configuration-processor的作用《配置文件处理器》
我们在主配置文件编写的时候,文件名可以是 【application-{profile}.properties/yml】
application-dev.properties
//指定不同环境下使用哪个配置文件
spring.profiles.active=dev
加载配置文件的位置及顺序
file:./config/
file./
classpath:/config/
classpath:/
【优先级从高到低顺序,高优先级会覆盖低优先级的相同配置;互补配置(所有配置文件都会加载)】
也可以指定配置文件位置
server.servlet.context-path=/boot03
引入外部配置规则!
5.yaml的基本语法(配置文件的写法)
字面量,对象and Map, 集合and数组 的表示规则
########################################################################################################
6.配置文件值注入 (配置文件参数--》XXXProperties类对象)
@ConfigurationProperties(prefix="") 注解 Vs @Value("${}")
使用场景分析
如果说,我们只是在某个业务逻辑中获取一下配置文件的某一项值,使用@Value;
如果专门编写了一个javaBean和配置文件进行映射,我们直接使用@ConfigurationProperties
解读:@Value 可以直接从配置文件中获取值并将该值注入给使用了该注解的属性---属性级别(不可复杂类型)
获取配置文件中的值注入到该类的bean中
@ConfigurationProperties->读取配置文件转换为bean :将配置文件中的数据封装到bean中
eg:
@ConfigurationProperties(locations = "classpath:mail.properties", ignoreUnknownFields = false, prefix = "mail")
ConfigurationPropertiesBindingPostProcessor会对标注@ConfigurationProperties注解的Bean进行属性值的配置
如果一个配置类只配置@ConfigurationProperties注解,而没有使用@Component,
那么在IOC容器中是获取不到properties 配置文件转化的bean。
说白了 @EnableConfigurationProperties 相当于把使用 @ConfigurationProperties 的类进行了一次【注入】。
使用@Component或@EnableConfigurationProperties对于@ConfigurationProperties的效果是一样的!!!!
总结:
@EnableConfigurationProperties会向容器中注入ConfigurationPropertiesBindingPostProcessor
该处理器会对标注了@ConfigurationProperties注解的Bean进行属性值的配置并注入到容器
官方方式:(向bean中注入属性,先将全局配置文件中属性注入到特定bean中,将该bean注入到自动配置类,即可在方法调用时使用该bean中的属性,
即完成了从配置文件到组件的过程:此过程中可以通过Conditional来加各种条件)
自动配置类中配置某个对象所需的参数都封装在配置类的某个XXXproperties中,
通过在自动配置类上加@EnableConfigurationProperties(XXXproperties.class)
及在XXXproperties类上加@ConfigurationProperties(...) ,将配置文件中的属性值加入到对应的参数封装类里
自动配置类的构造器会自动从容器中找到该XXXproperties,注入到自动配置类
在后续的@Bean中就可以使用其中的参数构造组件加入容器
所有在配置文件中能配置的属性都是在xxxProperties类中封装着
【一旦这个配置类生效;这个配置类会给容器添加各种组件;这些组件的属性是从对应的properties中获取的,这些
类里面的每个属性又是和配置文件绑定的】
@Conditional
必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效
##############################################################################################################
7.Spring Boot中最重要的两个优势就是可以使用starter简化依赖配置和Spring的自动配置
8.自动配置永远是第二位的,一旦你配置自己的东西,那自动配置的就会被覆盖
9.springboot 内嵌tomcat及配置和优化 tomcat
10. WebMvcConfigurer 手动配置MVC相关的组件,实现该接口
容器中所有的WebMvcConfigurer都会一起起作用,我们的配置类也会被调用
配置类中添加@EnableWebMvc即可,所有的SpringMVC的自动配置都失效了
11.Spring Boot有四大神器,分别是auto-configuration、starters、cli、actuator
actuator是spring boot提供的对应用系统的自省和监控的集成功能,可以对应用系统进行配置查看、相关功能统计等
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
12.SpringBoot源码分析之环境和配置文件的加载
EnvironmentPostProcessor在Spring容器构造之前调用,在读取完yml配置文件之后得到环境信息之后的处理器
13 BeanDefinition的加载、解析、处理、注册主要涉及到了四个类。
①、XMLBeanDefinitionReader:主要是的任务是把XML文件加载到内存中以Document对象的形式存在。
②、DefaultBeanDefinitionDocumentReader:完成解析和处理的任务。最后将处理得到的BeanDefinitionHolder交给了BeanDefinitionReaderUtils进行注册。
③、BeanDefinitionReaderUtils:BeanDefinitionHolder有了,Bean工厂也有了,它就负责把BeanDefinitionHolder中的BeanDefinition和BeanName等取出来,然后注册到Bean工厂中。
④、DefaultListableBeanFactory(bean工厂):它有一个ConcurrentHashMap成员变量,以beanName为键,BeanDefinition为值保存注册的bean。
SpringBoot日志框架
springboot默认使用slf4j+logback
并且添加了很多桥接器,使得其他模块不同日志框架最后都整合到slf4j
如果要引入其他框架?
一定要把这个框架的日志实现的依赖移除掉,添加对应门面的桥接器
不推荐修改日志实现
springboot 可在配置文件中修改日志相关配置
logging.level.com.wdjr=trace
#不指定path就是当前目录下生成springboot.log
#logging.file=springboot.log
#当前磁盘下根路径创建spring文件中log文件夹,使用spring.log作为默认
logging.path=/spring/log
#控制台输出的日志格式 日期 + 线程号 + 靠左 级别 +全类名50字符限制+消息+换行
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
#指定文件中日志输出的格式
logging.pattern.file=xx
更推荐使用
logback-spring.xml 完全配置形式,并且由springboot
web开发
1.静态资源路径
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/",
"/";当前项目的根路径
在WebMvcConfigurer接口中有
void addResourceHandlers(ResourceHandlerRegistry registry):用于添加静态资源文件映射规则
2.模板引擎
将html和数据 结合到一起 输出组装处理好的新文件
SpringBoot推荐Thymeleaf;语法简单,功能强大
只要把HTML页面放到classpath:/templates/,thymeleaf就能自动渲染
MVC
1.springboot默认配置了哪些MVC组件
以下是SpringBoot对SpringMVC的默认
Spring Boot provides auto-configuration for Spring MVC that works well with most applications.
The auto-configuration adds the following features on top of Spring’s defaults:
Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.
自动配置了ViewResolver(视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发?重定向?))
ContentNegotiatingViewResolver 组合所有视图解析器
如何定制:我们可以自己给容器中添加一个视图解析器;自动将其整合进来
Support for serving static resources, including support for WebJars (see below).静态资源
Static index.html support.
Custom Favicon support (see below).
自动注册 了Converter , GenericConverter , Formatter beans.
Converter :类型转换 文本转为字面量
Formatter :格式化器 转换后格式转换
Support for HttpMessageConverters (see below).
HttpMessageConverters :转换HTTP转换和响应:User - json
Automatic registration of MessageCodesResolver (see below).
定义错误代码生成规则
Automatic use of a ConfigurableWebBindingInitializer bean
2.如何自定义MVC组件加入
WebMvcConfigurer接口
用于手动配置MVC相关的组件,实现该接口
容器中所有的WebMvcConfigurer都会同默认配置一起起作用
3.不适用springboot默认配置,完全自定义MVC组件
@EnableWebMvc
在实现了WebMvcConfigurer接口配置类上添加该注解,所有的SpringMVC的自动配置都失效了
4.异常处理
/**
* 异常处理器
*/
@ControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(XxxException.class)
public String handlerException(Exception e, HttpServletRequest request){
Map<String ,Object> map =new HashMap<>();
//传入自己的状态码
request.setAttribute("javax.servlet.error.status_code", 432);
map.put("code", "user not exist");
map.put("message", e.getMessage());
//转发到error
return "forward:/error";
}
ServletContainer
1. #通用的servlet容器配置
server.xxx
#tomcat的配置
server.tomcat.xxxx
2. 编写一个EmbeddedServletContainerCustomizer;嵌入式的Servlet容器的定制器;来修改Servlet的容器配置
3. 切换容器 仅仅需要修改pom文件的依赖就可以(只需exclusion tomcat,再添加其他容器如jetty)
4.可以使用springboot 切换外置服务器容器
SpringBoot帮助我们自动配置SpringMVC的时候,自动注册SpringMVC的前端控制器;DispatcherServlet;