`
情情说
  • 浏览: 38871 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

《深入实践Spring Boot》阅读笔记之三:核心技术源代码分析

 
阅读更多

 

刚关注的朋友,可以回顾前两篇文章:

欢迎关注我的微信公众号:情情说,有很多实践经验分享。

上篇文章总结了《深入实践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 及其组件的神奇所在。

 


情情说

 

 

1
0
分享到:
评论
1 楼 情情说 2018-04-24  
喜欢的可以关注我的为公众号:情情说 ~

相关推荐

    Spring Boot核心技术-笔记-pdf版.pdf

    **Spring Boot核心技术详解** Spring Boot是由Pivotal团队提供的全新框架,其设计目标是为了简化Spring应用的...希望这份学习笔记能帮助你深入理解和掌握Spring Boot的精髓,祝你在Spring Boot的学习之路上一帆风顺!

    spring-boot学习笔记

    ### Spring Boot 学习笔记知识点总结 #### 一、Spring发展史 - **Spring1.x时代**:在Spring1.x的时代,主要通过XML文件来配置Bean。随着项目的规模扩大,XML配置文件的数量也随之增加,这导致开发人员需要频繁地...

    读书笔记:Spring Boot 实战 源代码.zip

    读书笔记:Spring Boot 实战 源代码

    spring-boot深入浅出

    在阅读《Spring-Boot深入浅出》这本书时,结合1.txt中可能包含的笔记或注释,将有助于深化理解,提升实践技能。此外,实际动手操作,创建自己的Spring Boot项目并逐步实现书中提到的功能,是巩固知识的最佳方式。...

    尚硅谷spring boot 代码及笔记

    在“尚硅谷spring boot 代码及笔记”中,你将找到一系列关于 Spring Boot 的实践代码和学习笔记,这对于初学者或有一定经验的开发者来说都是宝贵的资源。 首先,Spring Boot 的核心特性包括自动配置、起步依赖和...

    Spring笔记示例源代码

    "Spring笔记示例源代码"这个资源很可能是为了帮助学习者深入理解Spring框架的各种功能和用法而提供的实际代码示例。 1. **Spring IoC**:IoC是Spring的核心特性,它将对象的创建和管理权交给Spring容器,使得开发者...

    读书笔记:Spring Boot 揭秘与实战 源代码.zip

    读书笔记:Spring Boot 揭秘与实战 源代码

    spring-boot 笔记

    Spring Boot提供了大量的自动配置模块,可以自动配置Spring以及第三方库,如Web开发、数据访问、消息服务等。通过starter的依赖,开发者可以不用编写任何配置代码,快速开始开发,极大地提高了开发效率和项目的启动...

    Spring Boot核心技术-笔记-pdf版.7z

    《Spring Boot核心技术》笔记PDF版是一个详尽的指南,涵盖了Java开发者在使用Spring Boot框架时所需要掌握的关键概念和技术。Spring Boot简化了Java企业级应用的开发过程,通过默认配置、起步依赖和“开箱即用”的...

    Spring Boot 笔记1

    在本篇Spring Boot笔记中,我们将探讨Spring Boot的核心特性、如何创建一个简单的Spring Boot应用以及相关的Maven配置。Spring Boot是Spring框架的一个扩展,旨在简化Spring应用的初始搭建以及开发过程,提供了一种...

    Spring Boot学习笔记

    总结,Spring Boot学习笔记涵盖了Thymeleaf模板引擎的使用,如何实现国际化,以及如何将MyBatis和JDBC整合到Spring Boot应用中,这些都是在构建现代Java后端应用时不可或缺的技术。通过深入理解并掌握这些知识点,...

    Spring boot 笔记

    ### Spring Boot 笔记 #### 一、Spring Boot 概述与重要性 Spring Boot 是由 Pivotal 团队提供的新一代框架,旨在简化 Spring 应用程序的启动配置及开发流程。它采用了一种独特的方式来减少样板代码的编写,从而...

    Spring Boot 学习笔记完整教程.docx

    这个学习笔记的完整教程将涵盖多个关键领域,帮助开发者深入理解和使用 Spring Boot。 1. **Spring Boot 教程** - **基础入门**:了解 Spring Boot 的核心理念,包括自动配置、起步依赖和独立运行的特性。 - **...

    [springBoot]看《Spring Boot》时的同步笔记与实例代码

    标题中的“看《Spring Boot》时的同步笔记与实例代码”表明这是一个学习Spring Boot过程中记录的笔记和实践代码的集合。这样的资源对于初学者来说尤其有价值,因为它可以帮助他们理解和掌握Spring Boot的核心概念,...

    Spring Boot 笔记 二 (核心)

    在本笔记中,我们将深入探讨Spring Boot的核心特性,以及如何利用这些特性来构建高效且易于维护的项目。 1. **起步依赖(Starter Dependencies)** Spring Boot的起步依赖是其核心特性之一,它允许开发者通过添加...

    Spring Boot 笔记.rar

    尚硅谷的 Spring Boot 笔记涵盖了以上这些核心概念,并可能深入到实际应用案例、问题解决、最佳实践等方面,对于学习和进阶 Spring Boot 的开发者来说是一份宝贵的资源。通过阅读这些笔记,你可以更好地理解 Spring ...

    马士兵老师spring框架学习笔记

    马士兵老师是知名的Java教育专家,他的Spring框架学习笔记深入浅出,对于初学者和进阶者来说都是一份宝贵的资源。这份笔记涵盖了Spring的核心概念、配置、AOP(面向切面编程)、DI(依赖注入)等关键知识点。 1. **...

    读书笔记:个人使用的《JavaEE开发的颠覆者 Spring Boot实战 源代码》.zip

    读书笔记:个人使用的《JavaEE开发的颠覆者 Spring Boot实战 源代码》

    spring-boot-test_springboot学习笔记

    在Spring Boot测试方面,我们主要关注的是如何有效地利用Spring Boot提供的测试工具和框架来确保我们的应用程序功能正确且高效。Spring Boot简化了测试流程,通过自动配置和内嵌的Servlet容器,使得测试Java web应用...

Global site tag (gtag.js) - Google Analytics