springboot学习与使用(二)

1、整合mybatis-plus

2、springboot自动配置原理

SpringBoot 虽然抛弃了 XML 但未做到 零配置,它体现出了一种 约定优于配置,也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。 一般情况下,默认的配置足够满足日常开发所需。但在特殊情况下,我们往往需要用到自定义属性配置、自定义文件配置、多环境配置、外部命令引导等一系列功能。不用担心,这些 SpringBoot 都替我们考虑好了,我们只需要遵循它的规则配置即可。

2.1、springboot配置文件

初识 SpringBoot 时,我们就知道 SpringBoot 有一个全局配置文件:application.propertiesapplication.yml
我们所需的各种配置信息都可以在此配置文件中进行配置,最常配置的比如:server.port、 logging.level.* 等等,然而我们实际用到的往往只是很少的一部分,这些属性都可以在官方文档中查找到,但是开发人员比较喜欢记忆一些常用的配置,或者使用idea提供的功能进行一些相关的配置。

在这里插入图片描述

2.2、工作原理剖析

SpringBoot 关于自动配置的源码都在spring-boot-autoconfigure-x.x.x.x.jar包中。

在这里插入图片描述

自动配置原理的相关描述,官方文档没有提及。不过我们不难猜出,SpringBoot 的启动类上有一个 @SpringBootApplication 注解,这个注解是 SpringBoot 项目必不可少的注解,那么自动配置原理一定和这个注解脱不了干系。

在这里插入图片描述

@SpringBootApplication 是一个复合注解或者说是派生注解,在 @SpringBootApplication 里面有一个注解 @EnableAutoconfiguration ,翻译过来的意思就是 开启自动配置 ,其定义如下:

在这里插入图片描述

@EnableAutoconfiguration 这个注解也是一个派生注解,其中的关键功能由 @lmport 提供,其导入的 AutoConfigurationlmportSelectorselectImports() 方法通过 SpringFactoriesLoader.loadFactoryNames() 扫描 META-INF/spring.factories 的配置文件。spring-boot-autoconfigure-x.x.x.x.jar包里面就有一个这样的 spring.factories 文件。

在这里插入图片描述

这个 spring.factories 文件也是多组的key=value的形式,其中一个key是 EnableAutoConfiguration 类的全类名,而它的value是一个 xxxxAutoconfiguration 的类名的列表,这些类名以逗号分隔,如下图所示:

在这里插入图片描述

这个 @EnableAutoConfiguration 注解通过 @SpringBootApplication 被间接的标记在了Spring Boot的启动类上。在 SpringApplication.run(…) 的内部就会执行 selectImports() 方法,找到所有javaConfig自动配置类的全限定名对应的class,然后将所有自动配置类加载到Spring容器中。

2.3、自动配置生效原理

每一个xxxAutoConfiguration自动配置类都是在某些条件之下才会生效的,这些条件的限制在 SpringBoot 中以注解的形式体现,常见的条件注解有如下几项:

  • @ConditionalOnBean:当容器里有指定的bean的条件下。
    • @ConditionalOnMissingBean:当容器里不存在指定bean的条件下
  • @ConditionalOnClass:当类路径下有指定类的条件下。
    • @ConditionalOnMissingClass:当类路径下不存在指定类的条件下。
  • @ConditionalOnProperty:指定的属性是否有指定的值,比如:
    @ConditionalOnProperties(prefix="xxx.xxx,value=“enable”,matchIfMissing=true) 代表当xxx.xxx为enable时条件的布尔值为true,如果没有设置的情况下也为true。

ServletWebServerFactoryAutoConfiguration 配置类为例,解释一下全局配置文件中的属性如何生效,比如:server.port = 8081,是如何生效的(如果不配置的话,也会有默认值的,这个默认值来自于 org.apache.catalina.startup.Tomcat)。

在这里插入图片描述
在这个类上,我们可以看到一个非常熟悉的注解:@ConfigurationProperties,它的作用就是从配置文件中绑定属性到对应的bean上,而 @EnableConfigurationProperties 负责导入这个已经绑定了属性的bean到spring容器中(见上面截图)。那么所有其他的和这个类相关的属性都可以在全局配置文件中定义,也就是说,真正“限制”我们可以在全局配置文件中配置哪些属性的类就是这些xxxProperties类,它与配置文件中定义的 prefix 关键字开头的一组属性是唯一对应的。
至此,我们大致可以了解。在全局配置的属性,如:server.port 等,通过==@ConfigurationProperties== 注解,绑定到对应的xxxProperties配置实体类上封装为一个bean,然后再通过 @EnableConfigurationProperties 注解导入到Spring容器中。
而诸多的 xxxAutoconfiguration 自动配置类,就是Spring容器的JavaConfig(俗称Java配置形式),作用就是为Spring容器导入bean,而所有导入的bean所需要的属性都通过 xxxProperties 的bean来获得。

Spring制动配置原理简述:

SpringBoot 启动的时候类上有一个注解 @SpringBootApplication,程序通过SpringApplication.run()将本类的字节码传递到这个类中,从而通过反射机制加载这个注解。 @SpringBootApplication是一个派生注解,点进去可以看到 @EnableAutoConfiguration 这个注解,此注解就是开启自动配置的,通过这个注解可以找到 @lmprot 这个导入注解,从而找到 META-INF/spring.factories 配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以 AutoConfiguration 结尾来命名的,它实际上就是一个 JavaConfig 形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而 xxxProperties类是通过 @ConfigurationProperties 注解与全局配置文件中对应的属性进行绑定的,这样就完成了一个自动配置功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值