目录
Spring的功能
1. 控制反转
也叫依赖注入。但依赖注入只是控制反转的一种方式,通过依赖注入使得Java Bean的创建、引用、销毁的控制反转交给框架处理,使用方只需要声明需要依赖某个Java Bean,这个Bean就会被自动注入,这也是控制反转的核心概念。
优点:实现各个模块之间的解耦,降低各模块的耦合度。把各个类的管理控制权交给容器。当需要使用某个类时,容器会自动管理该类实例并交给使用方使用,管理策略为:如果容器中无此类实例,则自动创建实例并保存在容器中;如果已存在实例,则直接获得该实例。对于使用方而言,只需声明需要依赖的类即可被自动注入。例如,当A类需要使用B类的实例时,只需要在A类中声明需要B类,框架就会自动将B类实例注入到A类中,以此实现各个类之间的解耦,降低系统的复杂度。
类比于生活中的应用场景:
在Java市内原本没有餐厅,要想吃饭只能自己准备材料自己做,每做一顿饭都需要耗费大量的时间。后来开了餐厅,想要吃什么直接通过餐厅点餐即可,从而节省了从食材准备、烹饪及餐后打扫的时间,这样就有更多的时间来做更多的事
2. 面向切面
在大型企业应用中,一般会把逻辑单元按照功能划分为多个层,如控制器层、服务层、数据操作层等,每个逻辑单元自身是按照面向过程和面向对象模式编写的,但是在各层逻辑单元相互调用时,会出现一些公用的逻辑,需要在某一层的所有逻辑单元执行。最终的目标是去除冗余的代码,达到逻辑复用的目的,也就是为某一层添加统一功能。
生活举例:
以往餐厅的门是手动门,每一位进入餐厅的客人都需要手动推开门,而在离开餐厅时还需要手动拉开门。后来餐厅进行了一次升级,手动门改成了自动门,门自动感应客人的进出并自动开关,客人感觉不到门的存在,带来了极大的便利。这就类似于面向切面的结构。客人的餐厅是两层逻辑单元,原本上层的客人要调用下层的餐厅都需要先执行开门动作,而在两层的切面门上加上自动机制,可以自动地在两层调用之间加入统一的逻辑,大大简化了开发。
Spring的模块
除了核心模块以外,其他模块都是可插拔的,需要使用时引入模块即可。
1. 核心容器
- spring-core:提供Spring框架的核心支持,包括各种工具包与基本注解,大多数其他模块都需要引入核心模块。
- spring-beans:提供Spring框架对Bean生命周期相关的支持,包括BeanFactory等组件
- spring-context:提供Spring上下文支持,包括ApplicationContext等组件。
- spring-expression:提供SpEL表达支持
2. AOP
为Spring提供面向切面编程的支持,包括ProxyFactory代理工厂等组件
3. Web应用模块
- spring-web:提供对Web应用的支持,用于Web容器整合Spring框架,如Tomcat等
- spring-websocket:提供对WebSocket协议的相关支持
- spring-webmvc:提供MVC框架,与Spring框架无缝整合
- sping-webflux:为Spring提供基于Reactive响应式编程的Web框架。不同于spring-webmvc基于Servlet容器,spring-webflux一般基于Netty等异步网络框架,打破了原有Servlet统治地位。
4. 数据访问集成
- spring-jdbc:提供对JDBC相关数据库操作的支持
- spring-tx提供对事务相关的支持
- spring-orm:提供对对象关系映射的支持
- spring-oxm:提供对对象XML实体映射的支持。
5. Message
- 为Spring提供各种消息队列支持,包括ActiveMQ、Kafka等消息组件支持的核心。
6. Test
- 提供Sprign框架测试组件相关支持。
除此之外,Spring生态还有很多其他组件,如用于简化各种数据库操作的Spring Data。用于支持快速开发的Spring Boot,分布式微服务框架Spring Cloud等都是基于Spring框架体系构建的简化开发的扩展框架。
Spring Boot
- 更加方便,使开发人员更加专心于业务逻辑,而不是各种配置,大大简化了开发过程,提高了开发效率。
特性
- 提供自动配置机制,使得在Spring Boot中使用大部分Spring体系和第三方框架非常方便。通过自动配置体系,为Spring体系和第三方框架提供即插即用的自动化配置,采用约定(习惯)大于配置的方式,为各种框架使用最常用的默认配置,以达到最小化配置的目的。
- 提供各种可选的Starter系列Maven依赖,以解决传统项目中遇到的依赖地狱和版本冲突问题。通过使用starter系列依赖,自动引入实现特定功能的一系列依赖,以达到依赖版本统一控制的目的。同时也简化了项目的依赖管理。
- 内嵌各种可选的Web容器,如Tomcat、Jetty、Undertow等。无须部署为War包通过容器启动,开创性地部署为Jar包,通过Jar包直接启动。也就是说无须依赖外部容器,实现了完全自治。
- 无需代码生成,也无需XML配置。通过Spring Boot的条件化配置功能,可以根据某些Class是否存在来判断是否创建一些Bean,并通过默认加载配置文件的机制,通过配置文件获取常用Bean的一些配置,达到了无XML也可以配置Bean的目的。
- 提供一些生产特征,如指标、建康检查和外部化配置等。这是一项新特性,基于Spring Boot独立出创建的应用具有更加独立的特性,使得Spring Boot可以为其嵌入众多的监控功能,如此令以往通过第三方插件才可实现的系统监控功能在框架层级就可以实现,为部署生产应用提供了更多的便利。
Spring Boot与Spring MVC的区别
- 添加了Spring Boot的parent
- 改变MVC与JDBC相关的依赖为starter
- 打包方式为jar,添加Spring Boot的Maven插件用于打包
- SpringMVC的启动入口在Tomcat容器中,容器读取web.xml文件最终完成项目的启动与加载。而在Spring Boot项目中,启动入口改为类的main方法。
- Spring Boot添加了一个很重要的机制,启动时自动读取配置文件,并可以根据配置文件初始化各种项目中可能需要的Bean,包括数据库DataSource,也就是本项目的application.properties.
spring.datasource.url = jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root