1. 问题,为什么要用spring boot?和ssm工程对比有什么优势?
有的人熟悉ssm框架,有的人则直接是从spring boot开始学习工程的;
- ssm框架的核心就是IOC,就是bean工厂;
- 工程的搭建过程:
- 加入相关的jar包;
- 配置web.xml,加载spring和spring mvc;
- 配置数据库链接,配置spring事务;
- 配置加载配置文件的读取,开启注解;
- 配置日志文件等等;
这其中的难点,不是一点点啊: - 包依赖:不知道加载哪个包,版本号对应不上…
- bean的配置;
- spring boot把包的依赖关系便的简单了,也不用自己生产bean,只需要在pom.xml文件中引入相关依赖就可以了;
- 0 xml配置;
这些东西都是spring boot中的starter帮我们做了
2. Starter帮我们做了两件事情
- 引入相关的jar包;
- 自动完成bean配置;
问题来了,它是怎么实现的呢?
3. 以mybatis为例,我们找找实现过程:
- 首先,添加mybatis-spring-boot-starter依赖:
- 打开External Libraries文件,找到跟mybatis相关的包,是的,只要添加一个依赖,就会带来全家桶:
- 打开这个autoconfigure类:
这里面有配置数据源的注解,有添加MyabtisProperties的注解[这个注解里面的属性就是我们在application.yml文件里的myabtis的配置参数],
- 这里有个问题,在MybatisAutoConfiguration类中并没有定义数据源,那么这个数据源是怎么来的?是根据它上面的@AutoConfigureAfter(DataSourceAutoConfiguration.class)注解来的,点击进去之后发现这个注解是在org.springframework.boot.autoconfigure包中,是spring boot帮我们完成的:
那么有一个问题,如果数据源没有配置,mybatis还能不能配置?
如果强制配置了mybatis,没有配置数据源,就会报错,那怎么办呢?
所以说mybatis包和spring boot的依赖包还是有依赖关系的;例如一些第三方jar包,如果我们没有引用,那就不能被实例化,这很神奇,是怎么做到的呢?其实,就是下面的条件依赖注解,只有满足了这些条件依赖注解要求,才会产生bean,否则不会生效;
这就涉及到了自动配置中的条件依赖注解[也就是说满足条件了这个配置类才能生效],这些注解都是spring boot才有的,spring没有,例如:
- @ConditionalOnClass:有类的时候才配置
- @ConditionalOnMissingClass:缺少类的条件才配置
- @ConditionalOnBean:有bean的条件才配置
- @ConditionalOnMissingBean:缺少bean的条件下才配置,可以参考:https://blog.youkuaiyun.com/xcy1193068639/article/details/81517456
- ConditionalOnProperty
- ConditionalOnResource
- ConditionalOnWebApplication
- ConditionalOnNotWebApplication
- ConditionalOnExpression
还有指定顺序的条件依赖: - @AutoConfigureAfter:在xxx加载之后之后才配置
- @AutoConfigureBefore:在xxx加载之前就需要配置
- @AutoConfigureOrder:定义加载顺序
下面是例子[图片中第一句话:有DataSource的Bean实例的条件下才配置,第二句话,将类字改成Bean实例,更好理解点]:
- 问题:这些bean配置需要的参数是如何规定并获取的?上图:MybatisProperties文件:
- @EnableConfigurationProperties:使用 @ConfigurationProperties 注解的类生效,因此会在MybatisProperties.class类上看到@ConfigurationProperties注解,这个注解是指定配置类的,下面我们再说一下数据源的配置,我们用的DataSourceAutoConfiguration是在spring boot的autoconfigure里面,再例如kafka的自动配置,如下;
在DataSourceAutoConfiguration上我们又发现了这货:
继续点开,终于找到了一个很熟悉的名字:spring.datasource,下面有用户名,密码等:
到这里,我们就知道了,怎么从mybatis里面找哪些参数可以配置了
3. 下一个问题:application.yml文件中点点儿,参数就自动出来了,idea是怎么找出来的?怎么实现的?而且小括号里还有提示?很神奇!!
话不多说,直接上图说话!
有一个实现过程,就是当我们把mybatis的依赖添加进来的时候,idea就去找@ConfigurationProperties注解,然后扫描里面的参数,当你用的时候就提示出来,但是!这种方式很耗资源,idea肯定不是这么实现的;
其实,是在这个地方,spring-configuration-metadata.json,元数据信息,这里面就是所有的配置文件信息,idea其实就是找到这个文件,读取的这个文件他,然后提示给我们的,这个文件不是手动输入的,是自动生成的,如果需要自动生成,需要引入一个spring boot的依赖,下一个文章中有相关信息:
4. 问题:这些bean是怎么被spring boot加载进去的?我们只要引入了mybatis依赖,这些信息就会被加载,挺好玩的?怎么实现的?
- 我们用@SpringBootApplication来扫描,详细过程如下:
- spring-boot的bean加载过程:
如果是我们自己写的程序,我们会在XXX Application.java中添加@SpringBootApplication注解,这个注解是复合注解,里面包含了其他很多注解,默认这个注解会扫描XXX Application.java**下的所有包以及子包[这是一个递归扫描],找到里面的@Component,其实@Repository,@Service,@RestController,@Controller都包含了@Component
那么问题来了,刚才我们添加的mybatis依赖,包没有在XXX Application.java下面呀?那么他的规则是什么呢?如下,
这里需要我们了解一个知识点:SPI,学习Dubbo,一个易于扩展的框架;