Spring基础知识汇总

前言

这个文档是总结了所有Spring相关的知识点,建立此文档的目的为:建立一个Spring的大致世界观了解。所有关于Spring的知识点在这里都或多或少有体现。
后期会对此文档进行差异化分类:应用层和原理层分类。
作者理解带有个人思维,理解不同,解读不同。

Spring架构

Spring是一个轻量级控制反转和面向切面的容器框架。
Spring能够激发POJO的潜能:很多框架通过强迫应用继承他们的类或者实现它们的接口从而导致应用与框架绑死。一个典型的例子就是EJB的无状态Session Bean。早期的EJB就是这样的框架。

而在这方面Spring就做的很好。Spring竭力避免因为自身的API而弄乱你的代码。
Spring不会强迫你实现Spring规范的接口或者继承Spring规范的类。
在基于Spring构架你的应用中,它的类通常没有任何痕迹表明你使用了Spring。 最差情况就是一个会使用Spring注解的类。仅此而已。
Spring在对于POJO实行增强的方法就是用DI来装配他们。

作者理解:#轻量级。进一步解放了部分程序员的头发!︿( ̄︶ ̄)︿

常用7大模块

Spring框架是分模块存在,除了最核心的Spring Core Container(即Spring容器)是必要模块之外,其他模块都是可选,视需要而定。大约有20多个模块。
Spring3与Spring4是有区别的,4.0主要是对Java 8的新函数式语法进行支持,还有加强了对网络各种新技术比如http-streaming, websocket的更好的支持。
一般来说,Spring主要分为7个模块:

注:来源于Spring官网的翻译

1.core

这是Spring框架最基础的部分,它提供了依赖注入(Dependency Injection)特征来实现容器对Bean的管理。这里最基本的概念是BeanFactory,它是任何Spring应用的核心。BeanFactory是工厂模式的一个实现,它使用IOC将应用配置和依赖说明从实际的应用代码中分离出来。

作者理解:需要看DI的源码,去这里看。

2.context
核心模块的BeanFactory使Spring成为一个容器,而上下文模块使它成为一个框架。Web上下文模块建立于应用上下文模块之上,提供了一个适合于Web应用的上下文。该模块还提供了一些面向服务支持这个模块扩展了BeanFactory的概念,增加了对国际化(I18N)消息、事件传播以及验证的支持。
另外,这个模块还提供了许多企业服务,例如电子邮件、JNDI访问、EJB集成、远程以及时序调度(scheduling)服务。也包括对模版框架例如Velocity和FreeMarker集成的支持。

作者理解:我感觉上下文就是一个容器,去负责Bean的创建组装。

3.AOP
AOP即面向切面编程技术,Spring在它的AOP模块中提供了对面向切面编程的丰富支持。AOP允许通过分离应用的业务逻辑与系统级服务(例如安全和事务管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责其它的系统级关注点,例如日志或事务支持。

作者理解:AOP的应用层很好用,拿来应用日志和短信发送贼方便,大赞!


4.DAO
Spring虽然集成了几个ORM产品,但也可以不选择这几款产品,因为Spring提供了JDBC和DAO模块。该模块对现有的JDBC技术进行了优化。你可以保持你的数据库访问代码干净简洁,并且可以防止因关闭数据库资源失败而引起的问题。
JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构管管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。SpringDAO的面向JDBC的异常遵从从通用的DAO异常层次结构

作者理解:dao层一般就是各种第三方jar包的集成starter,主要在Spring data中有所体现

5.ORM
Hibernate是成熟的ORM产品,Spring并没有自己实现ORM框架而是集成了几个流行的ORM产品如Hibernate、JDO和iBATIS等。可以利用Spring对这些模块提供事务支持等。

作者理解:ORM?不知道算不算,我也不是很清楚自己用了这玩意没有。(°ー°〃)。可能用了事务就代表用到了吧。

6.WEB
Web上下文模块建立于应用上下文模块之上,提供了一个适合于Web应用的上下文。另外,这个模块还提供了一些面向服务支持。例如:实现文件上传的multipart请求,它也提供了Spring和其它Web框架的集成,比如Struts、WebWork。

作者理解:这个我懂。文件上传嘛,用过用过。啊哈哈。

7.MVC
Spring为构建Web应用提供了一个功能全面的MVC框架。虽然Spring可以很容易地与其它MVC框架集成,例如Struts2,但Spring的MVC框架使用IoC对控制逻辑和业务对象提供了完全的分离。

作者理解:内置型的东西,springmvc后面的框架都是基于mvc来的,对,我说的就是springboot。



主要JAR包

  • org.springframework.core           Spring的核心工具包,其他包依赖此包
  • org.springframework.beans          所有应用都用到,包含访问配置文件,创建和管理bean等
  • org.springframework.aop             Spring的面向切面编程,提供AOP的实现
  • org.springframework.context          提供在基础IOC功能上的拓展服务,此外还提供许多企业级的服务支持,有电子邮件、JNDI访问、EJB集成、远程以及时序调度(scheduling)服务等。
  • org.springframework.web.mvc         包含SpringMVC应用开发时所需的核心类
  • org.springframework.transaction       为JDBC,HIBERNATE,JDO,JPA提供一致的声明式和编程式服务管理。
  • org.springframework.web           包含Web应用开发时,用到Spring框架时所需的核心类
  • org.springframework.aspects         Spring提供的对AspectJ框架的整合
  • org.springframework.test             测试框架
  • org.springframework.asm             spring3.0以后的独立asm jar包
  • org.springframework.context.support    Spring context的拓展支持,用于MVC方面
  • org.springframework.expression        Spring表达式语言
  • org.springframework.instrument.tomcat   Spring对tomcat连接池的集成
  • org.springframework.instrument        Spring对服务器的代理接口
  • org.springframework.jdbc              很明显,就是JDBC
  • org.springframework.jms              简化jms的封装
  • org.springframework.orm              整合如:hibernate,ibaties,jdo,jpa等第三方的orm实现
  • org.springframework.oxm              Spring对于object/xml映射的支持,能在JAVA和XML中来回摇摆
  • org.springframework.web.protlet          增强MVC
  • org.springframework.webservlet          对J2EE6.0 servlet3.0的支持
  • org.springframework.web.struts          整合了struts框架

作者理解:有的jar包在新版的5.x版中暑校了,比如protlet。具体的jar包可以去spring官网上查看。

DI(dependence injection)依赖注入

#松耦合#依赖注入#反射
组件的依赖关系由容器在运行期决定,spring会将某个依赖关系动态的注入到组件当中。这样能提升系统的性能,并且为系统搭建了灵活的可拓展的平台。
DI带来的最大收益就是——松耦合。如果一个对象只通过接口来表明依赖关系,这种依赖就能够在对象本身毫不知情的情况下,用不同的具体实现进行替换。
Spring通过应用上下文(Application Context)装载bean的定义并把它们组装起来。Spring应用上下文全权负责对象的创建和组装。Spring自带了多种应用上下文的实现,它们之间主要的区别仅仅是还在于如何加载配置。
底层是通过反射实现依赖注入,注入方式有set方法,构造器注入,工厂方法注入,注解方法注入。

IOC(inversion of control)控制反转

就是我们将对象交由spring容器控制,对象的创建和销毁以及使用都是由spring负责。因为之前是对象控制其他对象,现在交由spring控制所有对象,所以叫做控制反转。

AOP(Aspect-orientedProgramming)面向切面

#松耦合#高内聚#动态代理模式
DI能够让相互协作的软件组件保持松散耦合,而面向切面变成(AOP)允许你把遍布应用的各处的功能分离出来形成可重用的组件。更近一步的松耦合。
AOP的作用就是使得这些服务模块化,并且以声明的方式将它们应用到它们需要影响的组件中去。所造成的结果就是使得这些组件会具有更高的内聚性并且会更加关注自身的业务,完全不用了解涉及系统服务所带来的复杂性。
面向切面的底层使用的是动态代理,对切面进行权限控制,事务管理,日志记录等公共操作。
作者理解:总结:先将对象交由spring容器控制,这叫做IOC控制反转;然后对对象赋值就是依赖注入(dependence injection),注入方法有set,构造器,注解,配置文件,工厂方法等。最后有一个优化,就是将很多类中的方法相同行为给提取出来,就是AOP技术。常用于日志处理,事务管理,权限控制等。利于业务解耦,使开发者能够将精力放入到业务逻辑中。


拓展:Spring AOP与AspectJ AOP的区别。
1.Spring AOP属于运行时增强,而AspectJ是编译时增强。
2.Spring AOP基于代理(Proxying),而AspectJ基于字节码操作(Bytecode Manipulation)。
3.AspectJ相比于Spring AOP功能更加强大,但是Spring AOP相对来说更简单。如果切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择AspectJ,它比SpringAOP快很多。
作者理解:AspectJ不是看面试题都不知道这个,看来有空得去理解一下了。

Bean的生命周期

#生命周期#aware#BeanPostProcessor
bean默认是单例的,但是也可以配置成非单例

  1. 实例化:实例出来一个bean对象。
  2. 属性注入:context为bean对象设置相关的属性和依赖
  3. 初始化:主要是看bean实现的几个接口。
    3.1 首先是检查aware系列接口并设置相关的依赖
    3.2 然后检查BeanPostProcessor接口,做前置处理
    它有个postProcessBeforeInitialization方法,具体可以查看源码。
    3.3 再检查initializingBean接口(回调接口),调用afterPropertiesSet方法
    3.4检查自定义的init-method方法
    3.5 BeanPostProcessor的后置处理。
    它有个postProcessAfterInitialization方法,具体可以查看源码。
  4. 销毁
    4.1使用前注册了销毁的相关接口调用
    4.2若实现了DisposableBean接口,执行对应的destory方法
    4.3如果配置了自定义的destory-method,执行
    作者理解:在学习bean的生命周期,可以多看几遍,然后去看看源码,最后以理解aware,beaPostProcessor为关键来做核心记忆点即可。

思考:为什么aware要在初始化前执行?


因为初始化可能会依赖Aware接口提供的状态,需要通过aware系列接口来设置相关的依赖。所有我们有时候可以将aware不当做初始化的部分。
这样初始化的真实执行过程就是,BeanPostProcessor,initializingBean,init-method,BeanPostProcessor这样的过程了。

//这个aware接口的三种方法是Spring为了自己使用而专门设计的
public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor {
 
    // 推测bean的类型,例如在属性注入阶段我们就需要知道符合依赖类型的Bean有哪些
    @Nullable
    default Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException {
        return null;
    }
 
    // 推断出所有符合要求的构造函数,在实例化对象的时候我们就需要明确到底使用哪个构造函数
    @Nullable
    default Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName)
        throws BeansException {

        return null;
    }
 
    // 获取一个提前暴露的对象,用于解决循环依赖
    default Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
        return bean;
    }

}

思考:为什么初始化的三个方法会按照@PostConstruct,afterPropertiesSet,XML的init-method的顺序执行?


首先@PostConstruct是在postProcessBeforeInitialization方法中处理的,所以肯定是最先调用的。
其次afterPropertiesSet是强转后直接一次调用,而XML的init是通过反射两次调用。从性能上来说afterPropertiesSet优先。因此就将afterPropertiesSet的优先级排在init-method之前了。

拓展:
一:aware接口是什么?

  1. spring它提供了三个接口给BeanFactory类型的Bean分别是:
    BeanFactory类型的Bean是一个比较古老的Factory,它是后置加载。
    1.1 BeanNameAware:注入name。
    1.2 BeanClassLoaderAware:注入ClassLoader,也就是类加载器。
    ClassLoader是什么?它是负责将class的字节码形式转换成内存形式的Class对象
    1.3 BeanFactoryAware:注入当前beanFactory容器的引用。

  2. spring也提供了几个接口给ApplicationContext类型的Bean
    ApplicationContext是BeanFactory的派生类,它在前者的基础上拓展了更多的功能。
    2.1 EnvironmentAware:注入environment,用于获取配置属性
    2.2 EmbeddedValueResolverAware:注入EmbeddedValueResolver(spring el解析器),用于参数解析。
    EmbeddedValueResolver与IOC相关
    2.3 ApplicationContextAware(ResolverLoader,applictionEventPublisherAware,
    messageSoureceAware):注入applicationContexr容器本身。

二:BeanPostProcessor接口是什么?
它是IOC的重要成员,bean就是在这个接口下被代理的。

三:initialzingBean接口是什么?
又名回调接口,它是spring为bean初始化提供的拓展点,它只有一个方法,就是afterPropertiesSet(),只针对当前实现类。有一定的侵略性。

四:init-method和destory-method介绍
自定义的接口,处于最后执行阶段。在BeanPostProessor后置处理之前。

五:bean的循环依赖的问题。
首先需要说明一下bean的实例化步骤,它分为两步,第一步是实例化,第二步是为其注入属性。
所以先准备实例化A,去spring容器中寻找A,这时候A不存在,创建A的实例。将A放入spring容器中。
创建好A实例之后,准备注入属性B,去spring容器中寻找B,这时候B不存在,创建B的实例,并将B放入Spring容器中。
创建好B实例之后,准备注入属性A,去spring容器寻找A,这时候A存在,注入。
至此,A创建完成。
总结:通过递归调用解决循环依赖。

5大常用框架

1.spring framework
也就是我们经常说的spring框架,包括了ioc依赖注入,Context上下文、bean管理、springmvc等众多功能模块,其它spring项目比如spring boot也会依赖spring框架。

以下来源于Spring官网:https://spring.io/projects/spring-framework#overview

  • Core technologies: dependency injection:依赖注入, events:事件, resources:资源, i18n, validation:验证, data binding:数据绑定, type conversion:类型转换, SpEL, AOP.
  • Testing: mock objects, TestContext framework, Spring MVC Test, WebTestClient.
  • Data Access: transactions, DAO support, JDBC, ORM, Marshalling XML.
  • Spring MVC and Spring WebFlux web frameworks.
  • Integration: remoting, JMS, JCA, JMX, email, tasks, scheduling, cache.
  • Languages: Kotlin, Groovy, dynamic languages.
    作者理解:我们需要关注的核心技术主要就是,AOP,其他的先了解,以后遇到了可以查看后续的官网API。多看看官网,能熟练掌握官网才能说懂得了一点Spring。

2.spring boot
它的目标是简化Spring应用和服务的创建、开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,可以和spring cloud联合部署。Spring Boot的核心思想是约定大于配置,应用只需要很少的配置即可,简化了应用开发模式。官网文档:

  • Create stand-alone Spring applications
    创建独立的Spring应用程序
  • Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)
    直接嵌入Tomcat,Jetty或Undertow(不需要部署WAR文件)
  • Provide opinionated ‘starter’ dependencies to simplify your build configuration
    提供自定义的启动器依赖来简化你的构建配置
  • Automatically configure Spring and 3rd party libraries whenever possible
    尽可能的自动配置Spring和第三方库
  • Provide production-ready features such as metrics, health checks, and externalized configuration
    提供可用于生产的特性,如度量,运行状况检查和外部化配置。
    作者理解:这个应该指的是actuator了,适合运维。
  • Absolutely no code generation and no requirement for XML configuration
    绝对不需要生产代码,也不需要XML配置器

3.spring data
是一个数据访问及操作的工具集,封装了多种数据源的操作能力,包括:jdbc、Redis、MongoDB等。官网文档:

Features

  • Powerful repository and custom object-mapping abstractions
    强大的存储库和自定义对象映射抽象
  • Dynamic query derivation from repository method names
    从存储库方法名称派生的动态查询
  • Implementation domain base classes providing basic properties
    实现提供基本属性的域基类
  • Support for transparent auditing (created, last changed)
    支持透明审计(已创建,最后更改)
  • Possibility to integrate custom repository code
    集成自定义存储库代码的可能性
  • Easy Spring integration via JavaConfig and custom XML namespaces
    通过JavaConfig和自定义XML名称空间轻松集成Spring
  • Advanced integration with Spring MVC controllers
    与Spring MVC控制器的高级集成
  • Experimental support for cross-store persistence
    跨存储持久性的实验性支持

Main modules

  • Spring Data Commons - Core Spring concepts underpinning every Spring Data module.
    支持每个Spring数据模块的核心Spring概念
  • Spring Data JDBC - Spring Data repository support for JDBC.
  • Spring Data JDBC Ext - Support for database specific extensions to standard JDBC including support for Oracle RAC fast connection failover, AQ JMS support and support for using advanced data types.
    对标准JDBC的特定数据库扩展的支持,包括对Oracle RAC快读连接故障转移的支持,AQ IMS支持和对使用高级数据类型的支持。
  • Spring Data JPA - Spring Data repository support for JPA.
  • Spring Data KeyValue - Map based repositories and SPIs to easily build a Spring Data module for key-value stores.
    基于存储库和SPlis的映射,可以轻松的为key构建Spring Data模块价值商店。
  • Spring Data LDAP - Spring Data repository support for Spring LDAP.
  • Spring Data MongoDB - Spring based, object-document support and repositories for MongoDB.
    基于Spring的MongoDB,支持对象文档和存储库。
  • Spring Data Redis - Easy configuration and access to Redis from Spring applications.
  • Spring Data REST - Exports Spring Data repositories as hypermedia-driven RESTful resources.
    将Spring数据存储库导出为超媒体驱动的RESTful资源
  • Spring Data for Apache Cassandra - Easy configuration and access to Apache Cassandra or large scale, highly available, data oriented Spring applications.
    易于配置和访问Apache Cassandra或大规模,高可用,面向数据的Spring应用程序。
  • Spring Data for Apache Geode - Easy configuration and access to Apache Geode for highly consistent, low latency, data oriented Spring applications.
    易于配置和访问Apache Geode,用于高度一致,ow延迟,面向数据的Spring应用程序。
  • Spring Data for Pivotal GemFire - Easy configuration and access to Pivotal GemFire for your highly consistent, low latency/high through-put, data-oriented Spring applications.
    易于配置和访问 pivtal GemFire,为了高可用,低延迟/高吞吐量,面向数据的Spring应用程序。


    作者理解:这里除了JDBC,JPA,MongoDB,Redis这几个其他都没有用过,过个眼熟吧。Spring东西太多了,先吃进自己知道的东西就行了。

4.spring cloud
是一套完整的微服务解决方案,是一系列不同功能的微服务框架的集合。Spring Cloud基于Spring Boot,简化了分布式系统的开发,集成了服务发现、配置管理、消息总线、负载均衡、断路器、数据监控等各种服务治理能力。比如sleuth提供了全链路追踪能力,Netflix套件提供了hystrix熔断器、zuul网关等众多的治理组件。config组件提供了动态配置能力,bus组件支持使用RabbitMQ、kafka、Activemq等消息队列,实现分布式服务之间的事件通信。官网文档:

Spring Cloud focuses on providing good out of box experience for typical use cases and extensibility mechanism to cover others.
SpringCloud 着重于为典型用例提供良好的开箱即用体验,以及覆盖其他用例的扩展机制。

  • Distributed/versioned configuration    分布式版本配置
  • Service registration and discovery    服务注册与发现
  • Routing                路由
  • Service-to-service calls         服务之间的调用
  • Load balancing            负载均衡
  • Circuit Breakers            断路器
  • Global locks              全局锁
  • Leadership election and cluster state   选举与集群状态管理
  • Distributed messaging         分布式消息
    作者理解:这里是微服务的知识点,后期拓展。

5.spring security
主要用于快速构建安全的应用程序和服务,在Spring Boot和Spring Security OAuth2的基础上,可以快速实现常见安全模型,如单点登录,令牌中继和令牌交换。你可以了解一下oauth2授权机制和jwt认证方式。oauth2是一种授权机制,规定了完备的授权、认证流程。JWT全称是JSON Web Token,是一种把认证信息包含在token中的认证实现,oauth2授权机制中就可以应用jwt来作为认证的具体实现方法。官网文档:

  • Comprehensive and extensible support for both Authentication and Authorization
    对身份验证和授权的全面和可扩展支持
  • Protection against attacks like session fixation, clickjacking, cross site request forgery, etc
    防止攻击,如会话固定,点击劫持,跨站请求伪造等
  • Servlet API integration
    Servlet API的集成
  • Optional integration with Spring Web MVC
    可选的与Spring Web MVC的集成
  • Much more…

文章总结

学习Spring相关,主要就是对DI,IOC,AOP以及bean的理解,其他的知识点属于硬知识,知道即可。多去看看官网文档,那个才是真正有用的。
作者总结:整个文章整理完之后,个人感觉对于Spring来说,更多的还是停留在理论层,并无很多的实际操作。后续的一些实用操作应该会放到Spring Boot文章中。2021-04-08

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值