Spring核心理解

掌握Spring和SpringBoot、SpringCloud等的关联和区别

详细信息去官网Spring.io中查看

Spring家族

Spring基础部分(IOC、DI、AOP),包括SpringBoot和Spring Framework

注:

SpringBoot除了包含Spring基础的一些功能,还包括自动配置、起步依赖(解决的就是使maven更加简洁)、零配置文件(Spring配置文件)

Spring Framework是包含SpringMVC模块的,里面分成很多的组件,这些组件其实就是jar包

Spring企业应用组件,包括SpringCloud、SpringData、SpringSecurity

Spring核心概念

IOC:控制反转,其实new对象的权利由使用者改为Spring去创建,Spring要想使用IOC去创建对象,就必须使用到DI

DI:依赖注入,就是给new出来的对象设置成员变量

AOP:将项目中的业务代码(提交订单)和系统代码(事务、记录日志)进行解耦,也是给业务代码进行功能增强的一种途径,AOP和OOP一样,都是编程思想

AOP的实现有SringAOP、AspectJ、Spring整合AspectJ这3种方式

BOP:指的是面向Bean的编程,Bean指的是无状态的Java对象,在Spring中一切都是针对Bean设计和编程的

Bean被Spring通过IOC和DI进行创建和管理,Bean被Spring通过AOP进行功能增强

Bean其实就是对应bean标签和@Bean注解的类

基础容器:IOC容器、具体指BeanFactory接口,具体是DefaultListableBeanFactory

高级容器:高级容器具体指的就是ApplicationContext接口,实现了BeanFactory接口,只是在该接口之外,新加了一些高级功能,本质还是一个BeanFactory

高级容器和基础容器的区别

高级容器对于bean实例的加载时机是项目启动时(可以理解为饿汉式加载)

基础容器对于bean实例的加载时机是第一次被需要时(可以理解为懒汉式加载)

循环依赖

A->B…B->A

构造方法的依赖,无法解决

1
2
3
4
5
6
7
8
9
10
11
12
13
public A{ 
private B b;
public A(B b){
this.b = b;
}
}

public B{
private A a;
public B(A a){
this.a = a;
}
}

set方法的循环,Spring中可以通过缓存去解决掉

1
2
3
4
5
6
7
8
9
10
11
12
13
public A{ 
private B b;
public setB(B b){
this.b = b;
}
}

public B{
private A a;
public setA(A a){
this.a = a;
}
}

Spring体系结构

EJB框架,JavaBean都是有状态的bean。
spring,提供一套一站式的轻量级企业开发框架。

Spring总共大约有20个模块,由1300多个不同的文件构成。而这些组件被分别整合在核心(CoreContainer)、AOP(AspectOrientedProgramming)和设备支持(Instrmentation)、数据访问及集成(DataAccess/Integeration)、Web、报文发送(Messaging)、Test,6个模块集合中。

以下是Spring5的模块结构图:

image-20200424204334253

image-20200424204351357

组成Spring框架的每个模块集合或者模块都可以单独存在,也可以一个或多个模块联合实现。每个模块的组成和功能如下

核心容器

由spring-beans、spring-core、spring-context和spring-expression(Spring ExpressionLanguage,SpEL)4个模块组成。

spring-beans和spring-core模块是Spring框架的核心模块,包含了控制反转(InversionofControl,IOC)和依赖注入(DependencyInjection,DI)。BeanFactory接口是Spring框架中的核心接口,它是工厂模式的具体实现。BeanFactory使用控制反转对应用程序的配置和依赖性规范与实际的应用程序代码进行了分离。但BeanFactory容器实例化后并不会自动实例化Bean,只有当Bean被使用时BeanFactory容器才会对该Bean进行实例化与依赖关系的装配。

spring-context模块构架于核心模块之上,他扩展了BeanFactory,为她添加了Bean生命周期控制、框架事件体系以及资源加载透明化等功能。此外该模块还提供了许多企业级支持,如邮件访问、远程访问、任务调度等,ApplicationContext是该模块的核心接口,她是BeanFactory的超类,与BeanFactory不同,ApplicationContext容器实例化后会自动对所有的单实例Bean进行实例化与依赖关系的装配,使之处于待用状态。

spring-expression模块是统一表达式语言(EL)的扩展模块,可以查询、管理运行中的对象,同时也方便的可以调用对象方法、操作数组、集合等。它的语法类似于传统EL,但提供了额外的功能,最出色的要数函数调用和简单字符串的模板函数。这种语言的特性是基于Spring产品的需求而设计,他可以非常方便地同SpringIOC进行交互。

AOP和设备支持

由spring-aop、spring-aspects和spring-instrument3个模块组成。

spring-aop是Spring的另一个核心模块,是AOP主要的实现模块。作为继OOP后,对程序员影响最大的编程思想之一,AOP极大地开拓了人们对于编程的思路。在Spring中,他是以JVM的动态代理技术为基础,然后设计出了一系列的AOP横切实现,比如前置通知、返回通知、异常通知等,同时,Pointcut接口来匹配切入点,可以使用现有的切入点来设计横切面,也可以扩展相关方法根据需求进行切入。

spring-aspects模块集成自AspectJ框架,主要是为SpringAOP提供多种AOP实现方法。

spring-instrument模块是基于JAVASE中的”java.lang.instrument”进行设计的,应该算是AOP的一个支援模块,主要作用是在JVM启用时,生成一个代理类,程序员通过代理类在运行时修改类的字节,从而改变一个类的功能,实现AOP的功能。在分类里,我把他分在了AOP模块下,在Spring官方文档里对这个地方也有点含糊不清,这里是纯个人观点。

数据访问及集成

由spring-jdbc、spring-tx、spring-orm、spring-jms和spring-oxm5个模块组成。

spring-jdbc模块是Spring提供的JDBC抽象框架的主要实现模块,用于简化SpringJDBC。主要是提供JDBC模板方式、关系数据库对象化方式、SimpleJdbc方式、事务管理来简化JDBC编程,主要实现类是JdbcTemplate、SimpleJdbcTemplate以及NamedParameterJdbcTemplate。

spring-tx模块是SpringJDBC事务控制实现模块。使用Spring框架,它对事务做了很好的封装,通过它的AOP配置,可以灵活的配置在任何一层;但是在很多的需求和应用,直接使用JDBC事务控制还是有其优势的。其实,事务是以业务逻辑为基础的;一个完整的业务应该对应业务层里的一个方法;如果业务操作失败,则整个事务回滚;所以,事务控制是绝对应该放在业务层的;但是,持久层的设计则应该遵循一个很重要的原则:保证操作的原子性,即持久层里的每个方法都应该是不可以分割的。所以,在使用SpringJDBC事务控制时,应该注意其特殊性。

spring-orm模块是ORM框架支持模块,主要集成Hibernate,JavaPersistenceAPI(JPA)和JavaDataObjects(JDO)用于资源管理、数据访问对象(DAO)的实现和事务策略。spring-jms模块(JavaMessagingService)能够发送和接受信息,自SpringFramework4.1以后,他还提供了对spring-messaging模块的支撑。

spring-oxm模块主要提供一个抽象层以支撑OXM(OXM是Object-to-XML-Mapping的缩写,它是一个O/M-mapper,将java对象映射成XML数据,或者将XML数据映射成java对象),例如:JAXB,Castor,XMLBeans,JiBX和XStream等。

Web

由spring-web、spring-webmvc、spring-websocket和spring-webflux4个模块组成。

spring-web模块为Spring提供了最基础Web支持,主要建立于核心容器之上,通过Servlet或者Listeners来初始化IOC容器,也包含一些与Web相关的支持。

spring-webmvc模块众所周知是一个的Web-Servlet模块,实现了SpringMVC(model-viewController)的Web应用。

spring-websocket模块主要是与Web前端的全双工通讯的协议。(资料缺乏,这是个人理解)

spring-webflux是一个新的非堵塞函数式ReactiveWeb框架,可以用来建立异步的,非阻塞,事件驱动的服务,并且扩展性非常好。

报文发送

即spring-messaging模块。

spring-messaging是从Spring4开始新加入的一个模块,主要职责是为Spring框架集成一些基础的报文传送应用。

Test

即spring-test模块。

spring-test模块主要为测试提供支持的,毕竟在不需要发布(程序)到你的应用服务器或者连接到其他企业设施的情况下能够执行一些集成测试或者其他测试对于任何企业都是非常重要的。

Spring是如何通过容器创建和管理bean实例

源码阅读篇

Spring重要接口详解

BeanFactory继承体系

体系结构图

image-20200425092736421

image-20200425092749263

这是BeanFactory基本的类体系结构,这里没有包括强大的ApplicationContext体系,ApplicationContext单独搞一个

文章目录
  1. 1. Spring核心理解
  2. 2. Spring家族
  3. 3. Spring核心概念
  • Spring体系结构
    1. 1. 核心容器
    2. 2. AOP和设备支持
    3. 3. 数据访问及集成
    4. 4. Web
    5. 5. 报文发送
    6. 6. Test
  • Spring是如何通过容器创建和管理bean实例
  • 源码阅读篇
    1. 1. Spring重要接口详解
      1. 1.1. BeanFactory继承体系
        1. 1.1.1. 体系结构图
  • |