做java开发的同学最熟悉框架应该就属spring了,spring从诞生的那天起,他就是为了更好的管理bean,不管从前还是未来,这始终的他的目标。为了更好的学习spring,我们需要从头开始了解spring
Spring 的别称(万能胶🤣🤣)
Spring 的设计初衷
Spring是为解决企业级应用开发的复杂性而设计,她可以做很多事。但归根到底支撑Spring 的仅仅是少许的基本理念,而所有的这些基本理念都能可以追溯到一个最根本的使命∶简化开发。这是一个郑重的承诺,其实许多框架都声称在某些方面做了简化。而Spring 则立志于全方面的简化Java开发。对此,她主要采取了 4 个关键策略∶
- 基于 POJO 的轻量级和最小侵入性编程 ;
- 通过依赖注入和面向接口松耦合;
- 基于切面和惯性进行声明式编程 ;
- 通过切面和模板减少样板式代码 ;
而他主要是通过∶面向 Bean(BOP)、**依赖注入(DI)以及面向切面(AOP)**这三种方式来达成的。
Spring编程思想总结
| spring思想 | 应用场景(特点) | 一句话归纳 |
|---|---|---|
| OOP | Object Oriented Programming(面向对象编程)用程序归纳总结生活中一切事物。 | 封装、继承、多态。 |
| BOP | Bean Oriented Programming(面向Bean编程)面向 Bean(普通的 Java类)设计程序,解放程序员。 | 一切从 Bean 开始。 |
| AOP | Aspect Oriented Programming(面向切面编程)找出多个类中有一定规律的代码,开发时拆 开, 运行时再合并。 | 解耦 ,专人做专事 |
| IOC | Inversion of Control (控制反转)将 new 对象的动作交给 Spring 管理,并由spring保存已经创建的对象(IOC容器) | 移交控制权(既控制权反转) |
| DI/DL | Dependency Injection(依赖注入)或者Dependency Lookup(依赖查找)依赖注入、依赖查找,Spring 不仅保存自己创建的对象,而且保存对象与对象之间的关系。注入即赋值 ,主要三种方式构造方法、set方法、直接赋值。 | 赋值 |
SpringBoot的前世今生
Spring1.x版本
在2013年左右,市场上最火的框架组合有两种
- SpringMvc + Spring + Mybatis (ssm)
- Struts + Spring + Hibernate (ssh)
举个例子,如果要搭建ssm的框架,那么架构师需要做的步骤如下:
- 创建一个项目结构(maven/gradle)
- spring的依赖,spring mvc 、servlet api、mybatis的依赖
- 配置web.xml
- Springmvc的配置文件
- Spring的配置文件
- mybatis的配置文件
可以看到,搭建一个ssm的框架需要有这么多的步骤,而每一步,都需要有很多的配置,全部都是手工配置。工作量上升的同时,还极易出错。
SpringBoot 的诞生
Springboot的诞生就是为了简化Spring中的配置问题
随着使用 Spring 进行开发的个人和企业越来越多,Spring 也慢慢从一个单一简洁的小框架变成一个大而全的开源软件,Spring 的边界不断的进行扩充,到了后来 Spring 几乎可以做任何事情了,市面上主流的开源软件、中间件都有 Spring 对应组件支持,人们在享用 Spring 的这种便利之后,也遇到了一些问题。
Spring 每集成一个开源软件,就需要增加一些基础配置,慢慢的随着人们开发的项目越来越庞大,往往需要集成很多开源软件,因此后期使用 Spirng 开发大型项目需要引入很多配置文件,太多的配置非常难以理解,并容易配置出错,到了后来人们甚至称 Spring 为配置地狱。
Spring 似乎也意识到了这些问题,急需有这么一套软件可以解决这些问题,这个时候微服务的概念也慢慢兴起,快速开发微小独立的应用变得更为急迫,Spring 刚好处在这么一个交叉点上,于 2013 年初开始的 Spring Boot 项目的研发,2014年4月,Spring Boot 1.0.0 发布。
Spring Boot 诞生之初,就受到开源社区的持续关注,陆续有一些个人和企业尝试着使用了 Spring Boot,并迅速喜欢上了这款开源软件。直到2016年,在国内 Spring Boot 才被正真使用了起来,期间很多研究 Spring Boot 的开发者在网上写了大量关于 Spring Boot 的文章,同时有一些公司在企业内部进行了小规模的使用,并将使用经验分享了出来。从2016年到2018年,使用 Spring Boot 的企业和个人开发者越来越多,我们从 Spring Boot 关键字的百度指数就可以看出。
到底什么是SpringBoot
约定优于配置理念下的一个产物
- 只要依赖的spring-boot-starter-web的jar,就会自动内置一个tomcat容器(替换)
- 项目结构
- 默认提供了配置文件application.properties
- starter启动依赖 - 如果是一个webstarter ,默认认为你是去构建一个spring mvc的应用.
SpringBoot 和微服务
为什么Spring Cloud会采用Spring Boot来作为基础框架呢?原因很简单
- Spring Cloud它是关注服务治理领域的解决方案,而服务治理是依托于服务架构之上,所以它仍然 需要一个承载框架
- Spring Boot 可以简单认为它是一套快速配置Spring应用的脚手架,它可以快速开发单个微服务。所以spring cloud的版本和spring boot版本的兼容性有很大关联
Spring Boot的特性
- EnableAutoConfiguration 自动装配
- Starter 启动依赖 依赖于自动装配的技术
- Actuator 监控 , 提供了一些endpoint ,http、jmx形式去进行访问, health信息。 metrics 信 息
- Spring Boot CLI(命令行操作的功能, groovy脚本) 客户端, groovy
Spring 注解驱动的发展过程
版本命名规则



spring 1.x
在SpringFramework1.x时代,其中在1.2.0是这个时代的分水岭,当时Java5刚刚发布,业界正兴起了使用Annotation的技术风,Spring Framework自然也提供了支持,比如当时已经支持了@Transactional 等注解,但是这个时候,XML配置方式还是唯一选择。
<bean name="" class=""/>
Spring 2.x
Spring Framework2.x时代,2.0版本在Annotation中添加了@Required、@Repository以及AOP相关的@Aspect等注解,同时也提升了XML配置能力,也就是可扩展的XML,比如Dubbo这样的开源框架就是基于Spring XML的扩展来完美的集成Spring,从而降低了Dubbo使用的门槛。
在2.x时代,2.5版本也是这个时代的分水岭, 它引入了一些很核心的Annotation
- Autowired 依赖注入
- @Qualifier 依赖查找
- @Component、@Service 组件声明
- @Controller、@RequestMappring等spring mvc的注解
尽管Spring 2.x时代提供了不少的注解,但是仍然没有脱离XML配置驱动,比如context:annotation-config context:componet-scan , 前者的职责是注册Annotation处理器,后者是负责扫描classpath下指定包路径下被Spring模式注解标注的类,将他们注册成为Spring Bean。
@Required/ @Repository(Dao)/@Aspect spring 2.5
@Component (组件)
@Service service
@Controller (controller)
@RequetsMapping
spring 3.x版本
Spring Framework3.0是一个里程碑式的时代,他的功能特性开始出现了非常大的扩展,比如全面拥抱 Java5、以及Spring Annotation。更重要的是,它提供了配置类注解@Configuration, 他出现的首要任务就是取代XML配置方式
- @Configuration 去xml化 : 核心目的是:把bean对象如何更加便捷的方式去加载到Spring IOC容器中
- Component-Scan - @Service @Repository @Controller
- Import: 将外部的配置文件引入到项目中
Enable模块驱动
自动完成相关相关组件的bean的装配

Spring3.x版本中,集成Redis或者mybatis
- 创建一个配置类
- @bean注解来声明一个bean
@Bean
DefaultKaptcha defaultKaptcha(){
}
- @Enable启动一个模块,把相关组件的bean自动装配到IOC容器中
ScheduledAnnotationBeanPostProcessor

spring 4.x版本
加入了@Conditional 注解:条件注解
spring 5.x版本
加入了@Indexed 注解:作用是,注解多的时候,相当于一个索引;
spring5 模块结构图

各核心模块的功能








Spring IOC bean的装载
- xml:xml配置文件
- Configuration:注解类
- Enable:模块
Spring 的动态Bean的装载
- ImportSelector: DeferredImportSelector
- Registator : ImportBeanDefinitionRegistrar
SPI机制 (Service provider interface)
满足以下条件
- 需要在classpath目录下创建一个 META-INF/services
- 在该目录下创建一个 扩展点的全路径名.
- 文件中填写这个扩展点的实现
- 文件编码格式UTF-8
- ServiceLoader去进行加载
Spring Boot自动装配
条件控制
对于官方组件,是基于condition条件来决定对于类是否要自动装配,对于第三方组件,是采用spi机制 来实现扩展
- 官方包 spring-boot-starter-xxx
- 第三方包 xxx-spring-boot-starter
本文深入探讨Spring框架的设计理念,包括其轻量级编程、依赖注入、面向切面编程等核心特性,并介绍了Spring Boot如何简化Spring应用配置,以及Spring框架随版本演进的重要更新。
1920





