前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一起玩转微服务(12)——揭密starter

一起玩转微服务(12)——揭密starter

作者头像
cloudskyme
发布2020-06-28 10:55:17
4710
发布2020-06-28 10:55:17
举报
文章被收录于专栏:cloudskymecloudskyme

介绍

Spring Boot的starter主要用来简化依赖用的,对于企业级开发中的与第三方的集成,可以通过一段简单的配置来完成,这样开发人员无需再对包依赖的问题头疼。Spring Boot为我们提供了简化企业级开发的绝大多数场景的starter pom,只需要指定需要配置的starter,Spring Boot会自动为我们提供配置好的bean。

通常流程

通常我们要搭建一个基于Spring的Web应用,我们需要做以下一些工作:

pom文件中引入相关jar包,包括spring、springmvc、redis、mybaits、log4j、mysql-connector-java 等等相关jar …

配置web.xml,Listener配置、Filter配置、Servlet配置、log4j配置、error配置 …

配置数据库连接、配置spring事务

配置视图解析器

开启注解、自动扫描功能

配置完成后部署tomcat、启动调试

……

花在搭建一个初始项目,可能一个小时就过去了或者半天就过了,但是用了SpringBoot之后一切都会变得非常便捷。

常用的starter

Spring Boot常用的starter(启动器)包括:

  • Spring-boot-starter-logging :使用 Spring Boot 默认的日志框架 Logback。
  • Spring-boot-starter-log4j :添加 Log4j 的支持。
  • Spring-boot-starter-web :支持 Web 应用开发,包含 Tomcat 和 Spring-mvc。
  • Spring-boot-starter-tomcat :使用 Spring Boot 默认的 Tomcat 作为应用服务器。
  • Spring-boot-starter-jetty :使用 Jetty 而不是默认的 Tomcat 作为应用服务器。
  • Spring-boot-starter-test :包含常用的测试所需的依赖,如 Junit、Hamcrest、Mockito 和 Spring-test 等。
  • Spring-boot-starter-AOP :包含 Spring-AOP 和 AspectJ 来支持面向切面编程(AOP)。
  • Spring-boot-starter-security :包含 Spring-security。
  • Spring-boot-starter-jdbc :支持使用 JDBC 访问数据库。
  • Spring-boot-starter-redis :支持使用 Redis。
  • Spring-boot-starter-data-mongodb :包含 Spring-data-mongodb 来支持 MongoDB。
  • Spring-boot-starter-data-jpa :包含 Spring-data-jpa、Spring-orm 和 Hibernate 来支持 JPA。
  • Spring-boot-starter-amqp :通过 Spring-rabbit 支持 AMQP。
  • Spring-boot-starter-actuator : 添加适用于生产环境的功能,如性能指标和监测等功能。

当然,如果有必要,也可以定制自己的starter。

起步依赖

在我们的pom文件里面引入以下jar:

spring-boot-starter-web包自动帮我们引入了web模块开发需要的相关jar包。

mybatis-spring-boot-starter帮我们引入了dao开发相关的jar包。 spring-boot-starter-xxx是官方提供的starter,xxx-spring-boot-starter是第三方提供的starter。

截图看一下我们的mybatis-spring-boot-starter

可以看出mybatis-spring-boot-starter并没有任何源码,只有一个pom文件,它的作用就是帮我们引入其它jar。

得益于starter的作用,使用SpringBoot确实方便,但对刚刚上手SpringBoot的人来说,可能只知道配置属性是在application.xml或application.yml中添加,但他们各自的属性都有哪些,具体怎么配置,却无从下手。这里先解决SpringBoot-starter中各属性的配置问题。

Mybatis的配置是怎么生效的?查看示例工程的pom依赖:

注意到mybatis-spring-boot-starter帮我们自动依赖了Mybatis所需jar包,其中有一个负责自动配置的mybatis-spring-boot-autoconfigure.jar,紧接着打开此jar,如下:

META-INF/spring-configuration-metadata.json中便是Mybatis在SpringBoot中的所有配置属性和介绍。

SpringBoot-starter自动配置bean

现在已得知jar包是怎么样自动依赖进来,以及他们的配置属性,那么接下来该考虑Mybatis所需的bean(如必需的sqlSessionFactory、sqlSessionTemplate等)是如何被自动加载的?

理所应当地,我们继续去查看mybatis-spring-boot-autoconfigure.jar,注意到里面有一个自动配置的类MybatisAutoConfiguration:

(1)@Configuration:被挂上@Configuration注解,表明它是一个配置类,作用等同于xml配置,里面有被@Bean注解的方法,也等同于xml配置的各种。

(2)@ConditionalOnClass/@ConditionalOnBean:自动配置条件注解,用于在某一部分配置中,将另一模块部分的配置自动加载进来,因为随着系统越来越大,配置内容越来越多,我们应当将Mybatis的配置放在一处,将log4j的配置放在一处,将SpringBoot自身的配置放在一处,当他们需要互相依赖时,可通过这类注解进行自动配置,如下:

代码语言:javascript
复制
@ConditionalOnClass @ConditionalOnMissingClass
@ConditionalOnBean @ConditionalOnMissingBean
@ConditionalOnProperty
@ConditionalOnResource
@ConditionalOnWebApplication @ConditionalOnNotWebApplication
@ConditionalOnExpression
 
@AutoConfigureAfter @AutoConfigureBefore @AutoConfigureOrder(指定顺序)
代码语言:javascript
复制

(3)@EnableConfigurationProperties:启用对@ConfigurationProperties注解的bean的支持,这里对应了配置属性类MybatisProperties,它里面定义了Mybatis的所有配置。

(4)@AutoConfigureAfter:应在其他指定的自动配置类之后应用自动配置。即org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration被自动配置后,才会接着自动配置MybatisAutoConfiguration。这里也解释了为什么我们在application.xml中只配置了数据源,而没有配置Mybatis,但是Mybatis可以正常查库的原因,就是因为它们配置之间的依赖关系。

到这里,差不多明白了starter自动配置bean的方式,但是如若再去深究,各种starter的bean是如何被自动加载的,猜想会不会是项目启动后,SpringBoot自动扫描里面所有的jar包,再去扫描所有的类,从而将各个bean放置IOC容器中。从结果来看,肯定是SpringBoot在启动时确确实实地自动加载了数据源和Mybatis相关的bean,不然他们无法正常工作。

回想在我们启动示例工程时,SpringBoot会自动扫描启动类所在包下的所有类,而如果还去扫描所有的jar包的话,又是具体怎么做到的?不妨从入口类调试一把,在SpringApplication.run(DemoApplication.class, args)打断点,一直追踪到getSpringFactoriesInstances这块:

查看SpringFactoriesLoader.loadFactoryNames的方法注释:

使用给定的类加载器从META-INF / spring.factories加载给定类型的工厂实现的完全限定类名。

这里的spring.factories刚好也存在于mybatis-spring-boot-autoconfigure.jar中,

继续调试,进入SpringFactoriesLoader.loadFactoryNames,

这里用类加载器得到工程中所有jar包中的META-INF/spring.factories文件资源,进而通过此文件得到了一些包括自动配置相关的类的集合,有各种工厂类、监听器、处理器、过滤器、初始化器等等,如下:

最后的org.springframework.boot.autoconfigure.EnableAutoConfiguration集合中当然包括了org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration和org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration。接着必然是将实例化的各个bean放进IOC容器中。

至此我们便明白了SpringBoot是如何自动配置starter里面的bean的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-06-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 通常流程
  • 常用的starter
  • 起步依赖
  • SpringBoot-starter自动配置bean
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档