spring-boot-starter自动配置的理解​

11 篇文章 0 订阅
11 篇文章 1 订阅

spring boot相比spring之所以简化很多就是因为spring boot搭建一个项目的时候可以引入多个starter,这样就可以直接使用不需要过多的各种配置。spring官方提供了不少starter,而我们自己也可以自定义starter,为了能够区分,从命名上进行了规范。官方的starter名称为:spring-boot-starter-xxx,而自定义的为xxx-spring-boot-starter。

spring boot能够帮助我们简化开发主要就是基于它提供的起步依赖和自动配置。

起步依赖其实就是我们在maven里面写的依赖坐标,这样可以简化将具备某种功能的坐标打包一起导入。

自动配置是spring boot的核心重点,spring-boot-starter这个东西本质就是spring boot的自动配置。自动配置,就是无须手动配置xml,自动配置并管理bean,可以简化开发过程。自动配置有如下几个关键的步骤:

基于Java代码的Bean配置

自动配置条件依赖

Bean参数获取

Bean的发现

Bean的加载

下面来通过我们常用的一个starter例子mybatis-spring-boot-starter来讲述以下自动配置的实现过程。

基于Java代码的Bean配置

当我们通过maven导入mybatis-spring-boot-starter这个jar的坐标后,可以看到这个jar下面包括了很多相关的jar,如图:

我们可以点开mybatis-spring-boot-autoconfigure 这个jar包 ,可以从这个包名autoconfigure看出这个包是自动配置的意思,见名知意我们想要探究的自动配置原理就在这个包下面。我们照下图点开里面的MybatisAutoConfiguration 这个自动配置类:

我们从类中截取关键的代码来看看:

可以看出,这个类里有很多注解,确实自动配置的实现原理基本就是靠这些注解来展开的。

@Configuration和**@Bean**这两个注解一起使用就可以创建一个基于java代码的配置类,可以用来替代传统的xml配置文件。

@Configuration 表明这个类是一个配置类,这个注解的类可以看作是能生产让Spring IoC容器管理的Bean实例的工厂,也就是这个类里可以实例化对象并放在spring容器里,替代的就是以往的xml配置文件。

@Bean 注解的含义是方法返回的对象可以被注册到spring容器中,也就是会实例化一个对象放在spring容器里面 。

所以上图的MybatisAutoConfiguration这个类,自动帮我们生成了SqlSessionFactory和SqlSessionTemplate这些Mybatis的重要实例并交给spring容器管理,从而完成bean的自动注册。

自动配置条件依赖

MybatisAutoConfiguration这个类中使用的注解可以看出,不光有**@Configuration@Bean**这两个注解,还有其他的注解,而这些注解就是要完成自动配置的依赖条件。

这两个注解的含义就是要完成Mybatis的自动配置,需要在类路径中存在SqlSessionFactory.class、SqlSessionFactoryBean.class这两个类,同时需要存在DataSource这个bean也就是DataSource这个对象需要注入进去且这个bean完成自动注册。

下面列举一些常见的条件依赖注解:

注解

功能说明

@ConditionalOnBean

仅在当前上下文中(spring容器)存在某个bean时,才会实例化这个Bean

@ConditionalOnClass

某个class位于类路径上,才会实例化这个Bean

@ConditionalOnExpression

当表达式为true的时候,才会实例化这个Bean

@ConditionalOnMissingBean

仅在当前上下文中(spring容器)不存在某个bean时,才会实例化这个Bean

@ConditionalOnMissingClass

某个class在类路径上不存在的时候,才会实例化这个Bean

@ConditionalOnNotWebApplication

不是web应用时才会实例化这个Bean

@AutoConfigureAfter

在某个bean完成自动配置后实例化这个bean

@AutoConfigureBefore

在某个bean完成自动配置前实例化这个bean

Bean参数获取

在项目中我们的mybatis通过spring boot完成自动配置是需要我们在在配置文件中提供数据源相关的配置参数,例如数据库驱动、连接url、数据库用户名、密码等等。下面就来看看spring boot是如何读取yml或者properites配置文件的的属性来创建数据源对象的。

我们导入mybatis-spring-boot-starter这个jar包时也会同步导入一个spring-boot-autoconfigure包,点开这个包下的jdbc文件夹中有一个一个自动配置类DataSourceAutoConfiguration,如图:

这个自动配置类中加了**@EnableConfigurationProperties**注解,这个注解的含义就是启用配置属性,就是启用括号里面的类中的属性,我们点开括号中的类:

可以看到这个类上加入了**@ConfigurationProperties注解,这个注解的作用就是把yml或者properties配置文件中的配置参数信息封装到@ConfigurationProperties注解标注的bean(即DataSourceProperties**)的相应属性上。

@****EnableConfigurationProperties注解的实际作用就是使**@ConfigurationProperties**注解生效。

Bean的发现

spring boot默认扫描启动类所在的包下的主类与子类的所有组件,但并没有包括依赖包也就是各种starter中的类,下面就来看看starter中的bean都是如何被发现的。

我们所创建的Spring Boot项目启动类中一般会加上**@SpringBootApplication**注解,我们就从这个注解点进去看看bean被发现的步骤:

点进去后可以看到如上三个重要注解:

@SpringBootConfiguration:作用就相当于**@Configuration**注解,被注解的类将成为一个bean配置类,表明其实启动类本质也是一个配置类。

@ComponentScan:作用就是自动扫描并加载符合条件的组件,但是不会扫描我们所加入的starter依赖包,最终将这些bean加载到spring容器中。

@EnableAutoConfiguration :含义就是启用自动配置,有了这个注解就可以自动将依赖中的bean创建出来。

所以我们要想知道bean是如何被发现的**@EnableAutoConfiguration**这个注解很重要,继续点进这个注解:

@****EnableAutoConfiguration注解引入了**@Import这个注解,这个注解为导入需要自动配置的组件,后面跟了一个EnableAutoConfigurationImportSelector** 这个类,我们点进去看看:

EnableAutoConfigurationImportSelector继承了AutoConfigurationImportSelector类也就是个选择器类,继续跟踪AutoConfigurationImportSelector类源码:

项目启动的时候我们spring boot框架会自动调用上图这个方法getCandidateConfigurations意思为获取候选配置项也就是从我们引入的jar包中去获取一些配置,而这个方法中又调用了SpringFactoriesLoader类的loadFactoryNames方法,继续跟踪源码:

我们可以看到SpringFactoriesLoaderloadFactoryNames静态方法可以从我们所有引入的jar包中读取META-INF/spring.factories文件,而自动配置的类的位置路径就在这个文件中进行配置:

spring.factories文件内容如下:

这样Spring Boot就可以通过读取META-INF/spring.factories文件找到MybatisAutoConfiguration这个配置类的加载位置从而加载到MybatisAutoConfiguration这个配置类了,然后从配置类中发现bean。

Bean的加载

就是通过spring boot将一个普通类实例化然后交给Spring容器管理,通常有以下方法:

在Spring Boot应用中要让一个普通类交给Spring容器管理,通常有以下方法:

1、使用 @Configuration与@Bean 注解

2、使用@Controller @Service @Repository @Component 注解标注该类并且启用@ComponentScan自动扫描

3、使用@Import 方法

其中Spring Boot实现自动配置使用的是@Import注解这种方式,上面我们也讲解过AutoConfigurationImportSelector类的selectImports方法返回一组从META-INF/spring.factories文件中读取的bean的全类名,这样Spring Boot就可以加载到这些Bean并完成实例的创建工作。

总结

我们可以将自动配置的关键几步以及相应的注解总结如下:

1、@Configuration与@Bean:基于Java代码的bean配置

2、@Conditional:设置自动配置条件依赖

3、@EnableConfigurationProperties与@ConfigurationProperties:读取配置文件转换为bean

4、@EnableAutoConfiguration与@Import:实现bean发现与加载

以上就是本次对spring boot自动配置starter完整过程的探究,后面会通过自定义starter来进一步巩固对自动配置starter的理解和应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值