目录
依赖管理机制
1.每个SpringBoot项目都有一个父项目spring-boot-starter-parent,而parent的父项目是spring-boot-dependencies,其中已经把所有常见的jar的依赖版本都声明好了
2.自定义版本号,在导入依赖的时候声明版本,比如第三方jar包需要自行声明版本
常用注解
组件注册
@Configuration、@SpringBootConfiguration、@Bean、@Controller、@Service、@Component、@Repository、@Import
1.@Configuration编写一个配置类
2.在配置类中自定义方法注册组件,配合@Bean
3.或使用@Import导入第三方组件
//@Import(User.class) //组件名称默认是全类名
@Configuration //这是一个配置类,配置类本身也是容器中的组件
public class AppConfig {
@Bean //组件在容器中的名称默认是方法名,可以通过修改注解的值,修改组件的名称
public User userBean() {
return new User();
}
}
条件注解
@ConditionalOnXXX
@ConditionalOnClass:类路径中存在这个类,触发指定行为
@ConditionalOnMissingClass:类路径中不存在这个类,触发指定行为
@ConditionalOnBean:容器中存在这个组件,触发指定行为
@ConditionalOnMissingBean:容器中不存在这个组件,触发指定行为
@Configuration
public class AppConfig {
@Bean
public User userBean() {
return new User();
}
@Bean
@ConditionalOnClass(name = "com.zzyy.demo.entity.User")
public Cat catBean() {
return new Cat();
}
// @ConditionalOnBean(value=组件类型, name=组件名字)
// 判断容器中是否有这个类型的组件,并且名字是指定的值
@Bean
@ConditionalOnBean(value = User.class)
public Cat catBean2() {
return new Cat();
}
}
属性绑定
@ConfigurationProperties:声明组件的属性和配置文件中哪些前缀项进行绑定
@EnableConfigurationProperties:快速注册组件,默认会把组件放到容器中
userobj.name=mary
userobj.age=18
@Component
@ConfigurationProperties(prefix = "userobj")
public class User {
private String name;
private Integer age;
}
自动配置机制
默认包扫描路径
1.@SpringBootApplication标注的类就是主程序类,SpringBoot默认只会扫描主程序类所在的包及其子包
2.自定义扫描路径
@SpringBootApplication(scanBasePackages = "com.zzyy")
@ComponentScan("com.zzyy")
自动配置原理
1.每个starter场景启动器都引入了一个spring-boot-starter核心场景启动器
2.spring-boot-starter核心场景启动器引入了spring-boot-autoconfigure包
3.spring-boot-autoconfigure里面包含了所有场景的所有配置
4.springboot默认扫描不到spring-boot-autoconfigure包下所有的配置类
5.@SpringBootApplication由三个注解组成@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
6.@EnableAutoConfiguration是springboot开启自动配置的核心,它由@Import({AutoConfigurationImportSelector.class})批量给容器中导入组件
7.SpringBoot 3.2.6启动会默认加载152个配置类,这152个配置类来自于spring-boot-autoconfigure包下META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件指定的
8.虽然导入了152个自动配置类,但并不是都生效,每一个自动配置类都有@ConditionalOnXXX条件注解,按需导入组件
9.XXXAutoConfiguration自动配置类使用@Bean给容器中放入一堆组件,每个自动配置类可能都使用@EnableConfigurationProperties把配置文件中指定前缀的属性值封装到XXXProperties属性类中
10.每个组件都是通过XXXProperties属性类获取核心属性值,而XXXProperties属性类又和配置文件进行绑定的,最终的效果是只要导入starter场景启动器,修改配置文件就能进行开发
日志
1.每个starter场景启动器都引入了一个spring-boot-starter核心场景启动器
2.spring-boot-starter核心场景启动器引入了spring-boot-starter-logging包,SpringBoot默认使用 logback + slf4j 作为底层日志
3.日志是使用监听器机制配置好的,因为日志是系统一启动就要用的,XXXAutoConfiguration自动配置类是系统启动之后用的
4.日志所有的配置也都可以通过修改配置文件实现,以logging开始的所有配置
日志级别
1.ALL(所有日志) > TRACE(追踪框架详细流程日志) > DEBUG(开发调试日志) > INFO(关键日志信息) > WARN(警告日志) > ERROR(业务错误日志) > FATAL(致命错误日志) > OFF(关闭所有日志)
2.SpringBoot默认日志级别是INFO
日志输出
# 如果logging.file.path和logging.file.name都配置,那么以logging.file.name为准,
# 相当于logging.file.path没有任何作用,如果都不配置,那么就只在控制台输出
# 指定日志文件的路径,日志名默认为spring.log
logging.file.path=E:\\java
# 指定日志文件名
# 1.只写文件名,日志默认生成到当前项目所在目录下
# 2.路径+文件名,日志生成到指定路径下
logging.file.name=demo-01.log
日志文件归档和切割
归档:每天的日志单独存到一个文档中
切割:每个文件大小超过10MB切割成另外一个文件
# 即使以下配置不写,也会生效对应默认值
# 日志文件归档,默认归档文件名格式${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
# 存档前,每个日志文件的最大大小,默认10MB
logging.logback.rollingpolicy.max-file-size=10MB
# 日志文件保存最大天数,默认7天
logging.logback.rollingpolicy.max-history=7
Web开发
给容器中放了WebMvcConfigurer组件,所有的功能最终会和配置文件进行绑定
1.SpringMVC的配置项:spring.mvc.xxx
2.Web场景通用配置项:spring.web.xxx
3.文件上传的配置项:spring.servlet.multipart.xxx
4.服务器的配置项:server.xxx
静态资源访问规则
静态资源访问规则都在WebMvcAutoConfiguration自动配置类中定义
1.访问 /webjars/** 的所有路径,就在 classpath:/META-INF/resources/webjars/ 目录下找资源
2.访问 /** 的所有路径,就在 classpath:/META-INF/resources/、classpath:/resources/、classpath:/static/、classpath:/public/ 这四个目录下找资源
3.静态资源默认都设置了缓存规则,所有缓存的配置都在spring.web配置项下
欢迎页和Favicon
1.欢迎页在静态资源目录下找index.html,没有就在templates下找index模板页
2.Favicon在静态资源目录下找favicon.ico
缓存配置
# 开启静态资源映射规则,默认是true开启
spring.web.resources.add-mappings=true
# 设置缓存
# 浏览器第一次请求服务器,服务器告诉浏览器此资源缓存7200秒
# 7200秒内此资源的访问不用发给服务器,直接在缓存中获取
spring.web.resources.cache.cachecontrol.max-age=7200
自定义静态资源
配置文件实现
# 自定义静态资源目录,默认classpath:/META-INF/resources/, classpath:/resources/, classpath:/static/, classpath:/public/
spring.web.resources.static-locations=classpath:/a/, classpath:/b/
# 自定义webjars路径前缀,默认/webjars/**
spring.mvc.webjars-path-pattern=/wj/**
# 静态资源访问路径前缀,默认/**
spring.mvc.static-path-pattern=/static/**
代码实现
方法一
// 这是一个配置类,只要给容器中放一个WebMvcConfigurer组件,就能实现自定义
@Configuration
public class MyConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 保留以前的默认配置,同时添加自己的配置
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/a/", "classpath:/b/")
.setCacheControl(CacheControl.maxAge(7200, TimeUnit.SECONDS));
}
}
方法二
// 这是一个配置类,只要给容器中放一个WebMvcConfigurer组件,就能实现自定义
@Configuration
public class MyConfig {
@Bean
public WebMvcConfigurer webMvcConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/a/", "classpath:/b/")
.setCacheControl(CacheControl.maxAge(7200, TimeUnit.SECONDS));
}
};
}
}
为什么在容器中放一个WebMvcConfigurer组件就能实现自定义?
1.WebMvcAutoConfiguration自动配置类里有一个EnableWebMvcConfiguration,而EnableWebMvcConfiguration继承于DelegatingWebMvcConfiguration
2.DelegatingWebMvcConfiguration利用@Autowired把容器中所有的WebMvcConfigurer组件注入进来
路径匹配规则
1.默认的路径匹配规则是path_pattern_parser,path_pattern_parser中 ** 多段匹配的支持仅允许在路径末尾使用
2.如果路径中间需要有 **,表示任意数量的目录,那么就要配置路径匹配规则为ant_path_matcher
# 路径匹配规则,ant风格
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
内容协商
1.基于请求头的内容协商(默认开启),客户端向服务器发送请求,携带Accept(application/json、text/xml)请求头,服务器根据客户端请求头期望的数据类型动态返回
2.基于请求参数的内容协商(需要开启参数匹配设置),发送get请求/getUser?format=json返回json格式,/getUser?format=xml返回xml格式
# 开启基于请求参数的内容协商,默认是false
spring.mvc.contentnegotiation.favor-parameter=true
# 默认参数名是format
spring.mvc.contentnegotiation.parameter-name=type
禁用SpringMVC的所有配置
SpringBoot默认配置好了SpringMVC的所有常用特性,如果需要禁用SpringMVC的所有配置及默认配置,仅需要编写一个WebMvcConfigurer配置类,并标注@EnableWebMvc注解
1.@EnableWebMvc使用@Import({DelegatingWebMvcConfiguration.class})给容器中导入了DelegatingWebMvcConfiguration组件,而DelegatingWebMvcConfiguration继承了WebMvcConfigurationSupport
2.WebMvcAutoConfiguration有一个核心的条件注解@ConditionalOnMissingBean({WebMvcConfigurationSupport.class}),容器中没有WebMvcConfigurationSupport才生效
3.@EnableWebMvc导入了WebMvcConfigurationSupport导致WebMvcAutoConfiguration失效,禁用了默认行为
WebMvcConfigurer接口
总结
以上主要介绍了SpringBoot3常用注解、自动配置原理、日志机制以及Web开发相关知识。想学习SpringBoot3更多实战实用技巧的小伙伴,请关注后期发布的文章,认真看完一定能让你有所收获。