什么是Spring?
Spring是一个开源框架,2003年兴起的一个轻量级的Java开发框架,作者:Rod Johnson
Spring是为了解决企业级应用开发复杂性而创建的,简化开发。
Spring是如何简化Java开发的?
为了降低Java开发的复杂性,Spring采用了以下4种关键策略:
1.基于POJO的轻量级和最小侵入性编程;
2.通过IOC,依赖注入(DI) 和面向接口实现松耦合;
3.基于切面(AOP) 和惯例进行声明式编程;
4.通过切面和模板减少样式代码
什么是SpringBoot
学过javaweb的人肯定知道,开发一个web应用,最初开始接触的Servlet结合Tomcat,跑出来一个Hello world,是要经历特别多的步骤;后来就使用了Struct,再后来是SpringMvc,到了现在的Springboot,过一两年又会有其他web框架出现;框架在不断的演进,那摩什么是SpringBoot呢,就是一个javaweb开发框架,和SpringMVC类似,对比其他javaweb框架的好处,官方说是简化开发,约定大于配置,能迅速开发web应用,几行代码开发一个http接口。
所有的技术框架发展似乎都遵循一条主线规律:从一个复杂应用场景衍生一种规范框架,人们只需要进行各种配置而不需要自己去实现它,这时候强大的配置功能成了优点;发展到一定程度之后,人们根据实际生产应用·情况,选取出其中实用功能和设计精华,重构出一些轻量级的框架;之后为了提高开发效率,嫌弃原先的各种配置过于麻烦,于是开始提倡"约定大于配置",进而衍生出一些一站式解决方案。
这就是Java企业级应用-》J2EE->spring->springboot 的过程。
随着Spring不断的发展,涉及的领域越来越多,项目整合开发需要配合各种各样的文件,慢慢变得不那么容易,违背了当初的理念,甚至人称配置地狱。SpringBoot正是在这样的一个背景下被抽象出来的开发框架,目的为了让大家更容易的使用Spring、更容易的集成各种常用的中间件,开源软件;
SpringBoot基于Spring开发,SpringBoot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷的开发新一代基于Spring框架的应用程序,也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。SpringBoot以约定大于配置的核心思想,默认帮我们进行了很多设置,多数springboot应用只需要很少的Spring配置。同时它集成了大量常用的第三方库配置(例如Redis、Monongdb,JPA,Kafka,rabbitmq等等),SpringBoot应用中这些第三方库几乎可以零配置的开箱即用。
简单来说就是SpringBoot其实不是什么新的框架,他默认配置了很多框架的使用方式,就像maven整合了所有的jar包,SpringBoot整合了所有的框架。
SpringBoot出身名门,从一开始就站在一个比较高的起点,又经过这几年的发展,生态足够完善,SpringBoot 已经当之无愧成为Java领域最热门的技术。
SpringBoot的主要优点
- 为所有的Spring开发者更快的入门
- 开箱即用,提供各种默认配置来简化项目的配置
- 内嵌式容器简化Web项目
- 没有冗余代码生成和xml配置的要求
什么是微服务?
微服务是一种架构风格,它要求我们在开发一个应用的时候,这个应用必须构建成一系列小的组合;可以通过http的方式进行互通。要说微服务架构,先得说说故去我们的单体应用架构
单体应用架构
所谓的单体应用架构(all in one)是指,我们将一个应用中的所有应用服务都封装在一个应用中。
无论是ERP,CRM或者是其他什么系统,你都把数据库访问,web访问,等等各个功能放到一个war包内。
- 这样做的好处是,易于开发和测试;也十分方便部署,只需要将war复制多份,然后放到多个服务器上,再做个负载均衡就可以了。
- 单体应用架构的缺点是,哪怕我要修改一个非常小的地方,我都要停掉整个的服务,重新打包,部署这个应用war包,特别是对于一个大型应用,我们不可能把所有内容都放在一个应用里面,我们如何维护,如何分工合作都是问题。
微服务架构
all in one的架构方式,我们把所有的功能单元放在一个应用里面,然后我们把整个应用部署到服务器上面,如果负载能力不行,我们将整个应用进行水平复制,进行扩展,然后再进行负载均衡。
所谓的微服务架构,就是打破之前all in one 的架构方式,把每个功能元素独立出来,把独立出来的功能元素动态的组合,需要的功能元素才去拿来组合,需要多一些时可以整合多个功能元素,所以微服务架构是对功能元素进行复制,而没有对整个应用进行复制。
这样做的好处是:
1.节省了调用资源。
2.每个功能元素的服务都是一个可替换的,可独立升级的软件代码
如何构建微服务
一个大型系统的微服务架构,就像一个复杂交织的神经网络,每一个神经元就是一个功能元素,他们各自完成自己的功能,然后通过http请求相互调用,比如一个电商系统,查缓存,连接数据库,浏览页面,结账,支付等服务都是一个个独立的功能服务,都被微化了,它们作为一个个微服务共同构建了一个庞大的系统,如果修改其中的一个功能,只需要更新升级其中一个功能服务单元即可。
但是这种庞大的系统架构给部署和运维带来了很大的难度,于是,Spring为我们带来了构建大型分布式微服务的全套、全程产品:
- 构建一个个功能独立的微服务应用单元,可以使用springboot,可以帮助我们快速构建一个应用;
- 大型分布式网络服务的调用,这部分由spring cloud 来完成,实现分布式;
- 在分布式中间,进行流式数据计算,批处理,我们有spring cloud data flow。
- spring为我们想清楚了整个从开始构建应用到大型分布式应用全流程方案
自动装配原理探究
spring-boot-dependencies: 核心依赖在父工程中!
我们在写或者引入一些SpringBoot依赖的时候,不需要指定版本,就因为有这些版本仓库
启动器·
- 启动器:说白了就是Springboot的启动场景;
- 比如spring-boot-starter-web,他就会帮我们自动导入web环境所有依赖
- springboot会将所有的功能场景,都变成一个个的启动器
- 我们要使用什么功能,就只需要找到对应的启动器就可以了starter
主程序
注解
获取候选的配置
META-INF/spring.factories:自动配置核心文件
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
所有资源加载到配置类中
结论:springboot所有自动配置都是在启动的时候扫描并加载:spring.factories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们的自动装配就会生效,然后就配置成功
1.springboot在启动的时候,从类路径下/META-INF/spring.factories获取指定的值;
2.将这些自动配置的类导入容器,自动配置就会生效,帮我们进行自动配置
3.以前我们需要自动配置的东西,现在springboot帮我们配置了!
4.整合javaee,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.2.x.RELEASE.jar这个包下
5.它会把所有需要导入的组件,以类名方式返回,这些组件就会被添加到容器;
6.容器中也会存在非常多的xxxAutoConfigure的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件,并且自动配置,@Configuration,javaconfig
7.有了自动配置类,免去了我们手动编写配置文件的工作
SpringApplication.run分析
分析该方法主要分两部分,一部分是SpringApplication的实例化,二是run方法的执行;
SpringApplication
这个类主要做了以下四件事情
1.推断应用的类型是普通的项目还是Web项目
2.查找并加载所有可用初始化器,设置到initializers属性中
3.找出所有的应用程序监听器,设置到listeners属性中
4.推断并设置main方法的定义类,找到运行的主类
springboot自动装配原理简单描述
在启动类里面,springboot是依靠它的main方法来启动的,在main方法里面我们会调用到SpringApplication.run方法,
在run方法执行的时候,其底层会调用一个refreshContext方法来执行刷新容器,
在刷新容器的时候,他就会通过解析注解,解析配置文件的方式把我们的bean注入到容器里面,这个时候它就会解析启动类上的注解**@SpringBootApplication**,而SpringbootApplication它本身是一个配置类,它的底层有一个**@EnableAutoConfiguration注解,
在这个注解里面,它导入进来了一个AutoConfigurationImportSelector的选择器类
在AutoConfigurationImportSelector类里面有个核心方法****SelectImport,
帮助我们从类路径下的
META-INF下找到spring.factories文件,在该文件中记录了许多的自动配置类,在启动的时候会把这些自动配置类加载到容器里面,这些自动配置类里面有许多条件注解,会根据开发者有没有引入jar包,有没有注入一些bean,来自动的给容器注入开发者所需要的bean,于是就实现了自动装配