一起玩转微服务(12)——揭密starter
介绍
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自身的配置放在一处,当他们需要互相依赖时,可通过这类注解进行自动配置,如下:
@ConditionalOnClass @ConditionalOnMissingClass
@ConditionalOnBean @ConditionalOnMissingBean
@ConditionalOnProperty
@ConditionalOnResource
@ConditionalOnWebApplication @ConditionalOnNotWebApplication
@ConditionalOnExpression @AutoConfigureAfter @AutoConfigureBefore @AutoConfigureOrder(指定顺序)
(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的。
一起玩转微服务(12)——揭密starter的更多相关文章
- 一起玩转微服务(10)——spring boot介绍
对于Spring,相信大家都非常熟悉,从出现开始,一直是企业级开发的主流.但是随着软件的发展和应用开发的不断演化,它的一些缺点也逐渐胡暴露了出来,下面,我们就一起看一下Spring的发展历程并且认识一 ...
- 一起玩转微服务(13)——AOP
一.什么是AOP编程 AOP: Aspect Oriented Programming 面向切面编程. 面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP), ...
- 《Spring Cloud与Docker微服务架构实战》配套代码
不才写了本使用Spring Cloud玩转微服务架构的书,书名是<Spring Cloud与Docker微服务架构实战> - 周立,已于2017-01-12交稿.不少朋友想先看看源码,现将 ...
- 转载:Service Mesh:重塑微服务市场--敖小剑
转载地址:https://skyao.io/talk/201805-service-mesh-rebuild-microservice-market/ 重点: 不要太过关注 Service Mesh ...
- 《深入理解Spring Cloud与微服务构建》书籍目录
转载请标明出处: https://blog.csdn.net/forezp/article/details/79735542 本文出自方志朋的博客 作者简介 方志朋,毕业于武汉理工大学,CSDN博客专 ...
- 朱晔的互联网架构实践心得S2E4:小议微服务的各种玩法(古典、SOA、传统、K8S、ServiceMesh)
十几年前就有一些公司开始践行服务拆分以及SOA,六年前有了微服务的概念,于是大家开始思考SOA和微服务的关系和区别.最近三年Spring Cloud的大火把微服务的实践推到了高潮,而近两年K8S在容器 ...
- GoldenGate 12.3微服务架构与传统架构的区别
随着Oracle GoldenGate 12c(12.3.0.1.0)的发布,引入了可用于复制业务数据的新架构. 多年来,这种架构有着不同的称谓,Oracle终于在最后GA发布的版本中,以“Micro ...
- 玩转SpringCloud Spring Cloud 微服务
Spring Cloud 简介 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均 ...
- 【12】JMicro微服务-Zookeeper
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到11小节 1. CuratorFramework支持 JMicro目前基于Zookeeper实现统 ...
随机推荐
- 快速复习C语言 - 1变量与运算符
变量与运算符 本篇以读者知道 int.char.float.double 等数据类型为前提条件. float 类型注意事项 float 类型数没有办法跟一个数真正比较是否相等,可以定义借助绝对值在一定 ...
- 3. OpenCV-Python——图像梯度算法、边缘检测、图像金字塔与轮廓检测、直方图与傅里叶变换
一.图像梯度算法 1.图像梯度-Sobel算子 dst = cv2.Sobel(src, ddepth, dx, dy, ksize) ddepth:图像的深度 dx和dy分别表示水平和竖直方向 ks ...
- ActiveMQ 笔记(三)JMS规范和落地产品、小知识Broker
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.JMS规范概述 1.JavaEE 概述及主要核心规范 JavaEE是一套使用Java进行企业级应用开 ...
- Java实现 LeetCode 678 有效的括号字符串(暴力+思路转换)
678. 有效的括号字符串 给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串.有效字符串具有如下规则: 任何左括号 ( 必须有相应的右括号 ). 任何右括号 ...
- Java实现 LeetCode 468 验证IP地址
468. 验证IP地址 编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址. IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(&qu ...
- Java实现堆排序问题(变治法)
问题描述 用基于变治法的堆排序算法对任意一组给定的数据进行排序 2.1 堆排序原理简介 堆可以定义为一颗二叉树,树的节点中包含键(每个节点是一个键),并且满足下面两个条件: (1)树的形状要求--这颗 ...
- Linux网络命令详解
命令write,功能是给指定用户发信息(接收信息的用户要处于登录状态,相当于QQ的私聊),例如:用户xbb给用户liuyifei发消息:I want to eat together!(发送消息以CRT ...
- 使用dotnet Cli向nuget发布包
长话短说, 今天分享如何在nuget.org创建并发布.NET Standard package. 前置 安装勾选.NET Core开发套件的Visual Studio; 安装dotnet Cli 从 ...
- java启动RabbitMQ消息报异常解决办法
启动SpringCloud微服务,RabbitMQ报如下异常: 2019-08-12 18:15:49.543 ERROR 53096 --- [68.252.131:5672] o.s.a.r.c. ...
- 双剑合璧 Nacos 结合 Sentinel 实现流量安全控制
Alibaba Sentinel 是一款高性能且轻量级的流量控制.熔断降级解决方案.是面向分布式服务架构的高可用流量控制组件. Sentinel 官网:https://sentinelguard.io ...