刚关注的朋友,可以回顾前两篇文章:
欢迎关注我的微信公众号:情情说,有很多实践经验分享。
上篇文章总结了《深入实践Spring Boot》的第二部分,本篇文章总结第三部分,也是最后一部分。这部分主要讲解核心技术的源代码分析,因为篇幅和能力原因,分析的不会太详细,后续深入研究后再专门写文章。希望大家能从「阅读笔记」3篇文章中,对Spring Boot提供的功能有所了解,在项目中进行实践,不断从繁琐重复的开发中解放出来。
我也是最近刚开始了解Spring Boot,计划今年在项目中实践,到时会总结实践过程中的一些问题和经验,分享给大家。想一起学习、实践、交流的朋友,可以扫描文章下方的二维码,关注我的个人公众号,感谢大家。
本篇主要从以下几个方面总结:
- Spring Boot自动配置实现原理;
- Spring Boot数据访问实现原理;
- 微服务核心技术实现原理;
题外话
春节假期很快过去了,明天就要上班了,相信大家还是意犹未尽,没吃够、没玩够、没和家人待够。今年因为个人原因,没有回家过年,心理最牵挂的还是爷爷奶奶,他们都80多了,希望她们身体健康,开开心心地度过生命最后的旅程。
不管怎样,大家要切换频道了,回归到正常的工作中,好好努力,一起期待明年和家人更好的团聚。
Spring Boot自动配置实现原理
使用Spring Boot创建一个简单的Web项目很简洁,不需要太多配置,编写一个简单的主程序就行:
@SpringBootApplication
public class ConfigApplication{
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
主程序分析
首先分析下run方法(省略不关键的部分代码):
public ConfigurableApplicationContext run(String... args) {
ConfigurableApplicationContext context = null;
configureHeadlessProperty();
SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.started();
try {
ApplicationArguments applicationArguments = new DefaultApplicationArguments(
args);
ConfigurableEnvironment environment = prepareEnvironment(listeners,
applicationArguments);
Banner printedBanner = printBanner(environment);
context = createApplicationContext();
analyzers = new FailureAnalyzers(context);
prepareContext(context, environment, listeners, applicationArguments,
printedBanner);
listeners.finished(context, null);
return context;
}
catch (Throwable ex) {
handleRunFailure(context, listeners, analyzers, ex);
throw new IllegalStateException(ex);
}
}
它首先开启一个SpringApplicationRunListeners监听器,然后创建一个应用上下文ConfigurableApplicationContext,通过这个上下文加载应用所需的类和各种环境配置等。
一个应用能够正常运行起来,需要一些环境变量、各种资源和一些相关配置等,下面看下createApplicationContext方法会加载应用定义的和需要的类及各种资源。
自动配置
所有的自动配置都是从注解@SpringBootApplication引入的,它其实又包含了@Configuration、@EnableAutoConfiguration和@ComponentScan,其中,@EnableAutoConfiguration就是启用自动配置的,并将导入一些自动配置的类定义。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
Class<?>[] exclude() default {};
String[] excludeName() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default {};
}
EnableAutoConfiguration最终会导入一个自动配置的类列表,列表中的自动配置类很多,这些配置类中大都将被导入,并处于备用状态,当项目中引入了相关的包时,相关的功能将被启用。
例如在项目的maven配置中配置了Redis的引用,Redis的默认配置项将被启用,首先会读取项目中的配置,只有项目中没有相关配置才启用配置的默认值,下面代码是Redis的自动配置,如果配置文件中没设置,会使用下面默认设置。
@ConfigurationProperties(
prefix = "spring.redis"
)
public class RedisProperties {
private int database = 0;
private String host = "localhost";
private String password;
private int port = 6379;
private int timeout;
private RedisProperties.Pool pool;
private RedisProperties.Sentinel sentinel;
private RedisProperties.Cluster cluster;
public RedisProperties() {
}
通过自动配置,就不用重复定义配置项名称了,覆盖约定的配置项即可。可通过查看各个Properties类,查看有哪些配置项。
Spring Boot数据访问实现原理
要使用数据库,首先必须与数据库服务器建立连接。对于关系型数据库,Spring Boot 连接数据源一般都采用JDBC的方式来实现。其他类型的数据库使用各自独立的方式来建立连接。
数据源类型和驱动
JDBC连接数据源必须指定数据源类型和数据库驱动程序,数据源主要有4中:
- 使用java.sql.DriverManager类;
- 使用实现了javax.sql.DataSource接口的子类,DataSource接口由驱动程序供应商实现,主要有3类实现、基本实现、连接池实现,分布式事务实现 ;
- DBCP连接池,Apache 软件基金组织下的开源连接池实现,Tomcat 的连接池正是采用该连接池来实现的;
- C3P0连接池;
Spring Boot 默认使用org.apache.tomcat.jdbc.pool.DataSource,它使用第2种方式,实现了javax.sql.DataSource接口。数据源的类型可以通过配置更改。
另外,Spring Boot 默认几乎支持现有的所有数据库。
数据存取功能实现
与数据库建立连接后,就可以对数据库执行一些存取操作,对数据库实现管理的功能。数据存取操作大体上包含两方面的内容,即实体建模和持久化。
不管是关系型数据库,还是NoSQL数据库,都遵循这一设计规范。实体建模即将Java的普通对象和关系映射为数据库表机器相关的关系,在Spring Boot中,主要是通过注解实现。
关系型数据库都使用了JPA的一套标准,它结合使用Hibernate实现了实体的持久化。后续的数据库管理设计都遵循了JPA这一个标准规范,提供相同的访问数据库的API。
微服务核心技术实现原理
Spring Cloud是基于对Netfix开源组件进一步封装的一套云应用开发工具,可以用来开发各种微服务应用。
配置服务实现
前一篇文章说到,配置管理的在线更新功能使用事件总线,即spring-cloud-bus来发布状态变化,并使用分布式消息来发布更新事件,分布式消息最终使用RabbitMQ来实现消息收发。
再来回顾下在线更新流程:
- 更新Git仓库的配置文件;
- 以POST指令出发更新请求;
- 配置管理服务器从Git仓库中读取配置文件,并将配置文件分发给各个客户端,同时在RabbitMQ中发布一个更新消息;
- 客户端订阅RabbitMQ消息,收到消息后执行更新;
配置管理服务器中的消息分发是从spring-cloud-bus中调用spring-cloud-stream组件实现的,而spring-cloud-stream使用RabbitMQ实现了分布式消息分发。具体实现就不说了,使用过RabbitMQ的很好理解。
发现服务和负载均衡
客户端执行注册使用计划任务的方式来实现,而客户端从发现服务器中更新其他在线的客户端列表,也使用了一个定时任务来管理。
当一个应用启用发现服务的功能之后,会默认启用Ribbon的负载均衡服务。Ribbon通过发现服务获取在线的客户端,为具有多个实例的客户端建立起负载均衡管理机制。
分布式消息实现
使用spirng-cloud-stream可以非常简单地使用RabbitMQ的异步消息,Spring Cloud的配置管理中的分布式消息分发也是通过调用spring-cloud-stream组件来实现的。
下面以消息生产者和消费者的实现说明分布式消息实现
消息生产者:
@EnableBinding(Source.class)
@RestController
@SpringBootApplication
public class SenderApplication {
@Autowired
@Output(Source.OUTPUT)
private MessageChannel channel;
@RequestMapping(method = RequestMethod.POST, path = "/send")
public void write (@RequestBody Map<String, Object> msg){
channel.send(MessageBuilder.withPayload(msg).build());
}
public static void main(String[] args) {
SpringApplication.run(SenderApplication.class, args);
}
}
消息消费者:
@EnableBinding(Sink.class)
@IntegrationComponentScan
@MessageEndpoint
@SpringBootApplication
public class ReceiverApplication {
@ServiceActivator(inputChannel=Sink.INPUT)
public void accept(Map<String, Object> msg){
System.out.println(msg.get("msg").toString() + ":" + msg.get("name"));
}
public static void main(String[] args) {
SpringApplication.run(ReceiverApplication.class, args);
}
}
从上面的分析可以看到,Spring Boot及其一些相关组件,已经尽量把一些可以实现和做到的功能,都帮我们实现了。 虽然使用Spring Boot及其相关组件看起来非常简单,但实际上可以实现无比强大的功能,这就是Spring Boot 及其组件的神奇所在。
相关推荐
通过阅读和实践该系统源代码,将掌握Web应用程序开发技能,了解前后端交互方式。 适用人群: 该项目适合具有一定编程基础、对技术有浓厚兴趣的开发者,以及大学生作为学习参考的实践项目。主流技术栈,对编程和Web...
狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神...
此存储库包含有关对Spring Framework(v5.2.x)和Spring Boot(v2.4.x)的源代码进行分析的学习笔记。 我试图使这些注释尽可能地易于理解,因此,我主要将这些注释组织成图表,并结合一些微小的代码片段,以使说明...
此代码已使用Spring Boot 1.3的最新稳定版本进行更新。 这是的常规代码。 虽然本书解释了如何使用gradle包装器,但此处的代码已经设置了gradle包装器。 这意味着对于应用程序,只要您已在机器上安装了Java,就可以...
毕业设计,基于SpringBoot+Vue+MySql开发的IT技术交流和分享平台,内含Java完整源代码,数据库脚本,论文视频 本基于Spring Boot的IT技术交流和分享平台主要分管理员和用户两大功能模块,下面将详细介绍管理员和...
毕业设计,基于SpringBoot+Vue+MySql开发的学生读书笔记共享网站,内含完整源代码,数据库脚本,论文视频,视频教程 本论文主要论述了如何使用JAVA语言开发一个读书笔记共享平台 ,本系统将严格按照软件开发流程...
关键词:Spring Boot、Vue.js、Web应用程序开发、源代码、论文文档 系统概述: 本系统基于Spring Boot、Vue.js、Element UI和MySQL,旨在为开发者提供一个可扩展的管理系统框架。通过前后端交互方式,实现了用户...
Java秒杀系统方案优化高性能高并发学习实战源代码以及笔记..zip 章节笔记 第1章-课程介绍及项目框架搭建 知识点 使用spring boot 搭建项目基础框架 使用Thymeleaf做页面展示,封装Result统一结果 集成 mybatis + ...
它不仅可以作为学习Spring Boot框架和前后端开发的实践项目,也可以作为构建学生社区、促进知识分享与交流的平台。无论是对于即将进行毕业设计的同学,还是对于希望进行二次开发、定制开发的开发者来说,本资源都...
该项目采用Spring Boot作为后端开发框架,整合了Spring MVC、MyBatis等组件,实现了前后端分离的开发模式,使代码结构清晰,维护便捷。数据库采用MySQL,确保数据的稳定性和安全性。前端则使用HTML、CSS和JavaScript...
JSP基于SSM云笔记资料文件共享网设计可升级SpringBoot毕业源码案例设计 前台框架: Bootstrap(一个HTML5响应式框架) 开发环境:myEclipse/Eclipse/Idea都可以 + mysql数据库 后台框架: SSM(SpringMVC + Spring + ...
支持多用户写作,评论,邮件通知等核心功能。 蓝眼博客力求小而精,可以作为团队内部或个人私有的博客使用,同时也可作为学习资源使用。 项目源码阅读 建议使用Idea,同时安装 使用安装包安装 a) 准备工作 一台...
毕业设计,基于SpringBoot+Bootstrap+MySql开发的在线笔记NOTEBOOK,内含完整源代码,数据库脚本 毕业设计项目,使用Java语言、mysql数据库,使用springboot+shiro+mybaits框架搭建,模板语言使用freemaker。
毕业设计,基于SpringBoot+SpringCloud+Vue开发的前后端分离的在线考试系统,内含完整源代码,数据库脚本 毕业设计:为考-考试系统,后端采用Spring Cloud,前端采用Vue 3,存储采用Mysql,缓存采用Redis。完成基本...
大多数链接都包含指向源代码更改的链接。 如果遇到问题,可以将您的代码与课程代码进行比较。 Spring Framework 5:Guru课程Wiki的初学者 对您的Spring Framework 5课程有疑问吗? 设置开发环境 推荐版本 推荐的 ...
看透springMvc源代码分析与实践.pdf 网易2021招聘笔试- 系统开发研发工程师(提前批).docx 网易2021笔试- Java 开发工程师(提前批).docx 网易2021笔试- Java 开发工程师(正式批).docx 网易2021笔试- 系统开发...
要构建源代码,您需要安装 JDK 1.8。 Spring Cloud 将 Maven 用于大多数与构建相关的活动,您应该能够通过克隆您感兴趣的项目并键入来快速起步 $ ./mvnw install 笔记 您也可以自己安装 Maven (>=3.3.3) 并在下面的...
毕业设计,基于SpringBoot+Vue+MySql开发的在线教育系统,内含完整源代码,数据库脚本,论文答辩,论文视频教程 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了...
###SpringBoot的项目实战学习笔记#####SpringBoot的版本是1.5.10.RELEASE,全部...查看源代码,和日志分析. 4.1 使用的是AnnotationConfigApplicationContext实例化Spring容器 5. 异常处理.404,500,401.对应的页面放在sta
本系统分为员工、部门经理、人事、管理员四种角色(角色菜单可以自行分配) ### 用户: 登录、考勤管理、申请管理、任务管理、日程管理、工作计划管理、文件管理、笔记管理、邮件管理、通讯录、个人信息修改。...