SpringBoot3自动配置原理+Web开发

在这里插入图片描述

依赖管理机制


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更多实战实用技巧的小伙伴,请关注后期发布的文章,认真看完一定能让你有所收获。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值