Spring简言

 

目录

1.什么是Spring

1.1 简介

1.2 定义

1.3 相关网址

 1.4 依赖

2.Spring的结构

2.1 Spring的理念

2.2 Spring容器

2.3 BeanFactory和ApplicationContext

2.4 Bean的生命周期

2.5 FactoryBean

3.Spring的七大模块

SpringCore(核心容器)

SpringContext(应用上下文)

SpringAOP(面向切面模块)

Spring Dao(JDBC抽象和DAO模块)

Spring ORM(对象/关系映射集成模块)

Spring Web(Spring的Web模块)

Spring WebMVC(Spring的MVC框架)


1.什么是Spring

1.1 简介

    • 2002年首次推出了Spring框架的雏形:interface21框架
    • Spring框架基于interface21框架不断完善于2004年3月24日正式诞生创始人rod johnson
    • Spring的核心理念:使开发更简单( 源于轮子理论)
    • 核心特点:包容性、适配性
    • 早期的开发体系:SSH(Struct2+Spring+Hibernate)现已被SSM(SpringMVC+Spring+Mybatis)开发体系取代
    • Spring之所以与Struts、Hibernate等单层框架不同,是因为Spring致力于提供一个以统一的、高效的方式构造整个应用,并且可以将单 层框架以最佳的组合揉和在一起建立一个连贯的体系。可以说Spring是一个提供了更完善开发环境的一个框架,可以为POJO(Plain Ordinary Java Object)对象提供企业级的服务。

1.2 定义

  • Spring是一个开源的轻量级控制反转(IoC)面向切面(AOP)支持事务处理非入侵式容器框架

1.3 相关网址

官网:Spring Framework Overview

下载地址:repo.spring.io

github托管地址:github.com

 1.4 依赖

//spring依赖
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.9</version>
</dependency>

//spring与Mibatis整合依赖
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.9</version>
</dependency>

2.Spring的结构

Spring总共有十几个组件,为了满足不同的需求Spring提供了不同的组件。但是Spring框架中的核心组件只有三个:Bean,Context和Core,这三个组件是Spring框架的基础设置,没有它们就不会有AOP,Web等上层的功能组件。Spring框架如图所示:

2.1 Spring的理念

面向Bean编程

Bean组件就是Spring对Java对象Object的封装,在Spring容器中管理的就是被Bean封装了的Java对象。

Context组件就是我们经常说的IOC容器,也就是Spring容器。

Context组件可以发现每个Bean之间的关系,为它们建立好Bean之间的依赖关系,为Bean提供生存环境。最后的Core组件,它是Context组件与Bean组件的工具包,可以把Core组件理解为Util工具包。

总结来说,Bean组件解决Bean的定义,Bean的创建以及Bean的解析,例如在Spring配置文件中定义的节点,Spring会解析得到对应的BeanDefinition对象。Context组件提供了这些Bean的生存环境,保存各个Bean的状态。实际上Context组件结合Bean组件,Core组件共同建立了一个Bean的容器

2.2 Spring容器

Spring容器有时候也称为IOC容器,那么什么是IOC呢?IOC:Inverse of Control,控制反转。现在来解释到底控制反转是什么含义?控制反转包括两个方面,一是控制,二是反转。控制是什么?控制就是调用类对某一个接口具体实现类的选择控制权,例如Person类依赖了Move接口,那么Person类可以选择依赖实现了Move接口的OnFoot(步行)类,也可以选择依赖ByCar(坐车)类,这就是调用类(Person)对某一个接口(Move)具体实现类(OnFoot,ByCar)的选择控制权。那么何为反转?本来对某一个接口具体实现类的选择控制权在调用类,现在该选择控制权转交第三方决定,由Spring容器来统一配置管理Bean。为了更好理解IOC,大家经常使用依赖注入来代替控制反转这个概念,即让调用类对某一接口的实现类的依赖关系由第三方容器注入,以移除调用类对某一接口实现类的依赖。那么IOC容器的工作就是通过配置文件和注解来描述类和类之间的依赖关系,利用反射机制完成类的初始化和依赖注入

2.3 BeanFactory和ApplicationContext

BeanFcatory和ApplicationContext经常出现在Spring容器的相关文章中,它们有时候都可以代指为IOC容器,那么它们的区别是什么?简单来说,BeanFactory是Spring框架的核心接口,提供了IOC的配置机制,是Spring的基础设施,面向Spring本身;ApplicationContext建立在BeanFactory之上,提供了更多的面向应用的功能,是Spring给开发者提供了IOC容器接口。大多数场合,我们都是直接使用ApplicationContext而非更加底层的BeanFactory。

2.4 Bean的生命周期

Bean的生命周期由多个特定的生命阶段构成,并且每个阶段Spring容器都提供了对开发者的接口,允许外界对Bean加以控制。

Bean的生命周期如图所示(ApplicationContext中Bean的生命周期),先看图然后在一步一步看:

1.如果在配置文件中声明了工厂后处理器接口BeanFactoryPostProcessor的实现类,那么在Spring容器装载配置文件之后,初始化Bean实例之前将调用这些BeanFactoryPostProcessor对配置信息进行加工处理。也就是说工厂后处理器是容器级别的,仅在容器初始化的时候调用一次,对配置文件进行加工

2.当我们通过getBean(String beanName)方法向容器请求某个Bean实例的时候,如果容器注册了InstantiationAwareBeanPostProcessor接口的实现类,那么在实例化Bean之前,将调用该接口的postProcessBeforeInstantiation()方法

3.实例化Bean

4.如果容器注册了InstantiationAwareBeanPostProcessor接口的实现类,那么在实例化Bean之后,将调用该接口的postProcessAfterInstantiation()方法

5.如果Bean配置了属性信息,那么容器在将属性值配置到Bean中之前,将调用InstantiationAwareBeanPostProcessor接口的postProcessPropertyValues()方法

6.为Bean设置属性值

7.如果Bean实现了BeanNameAware接口,那么就调用该接口的setBeanName()方法,将配置文件中该Bean对应的名称设置到Bean中

8.如果Bean实现了BeanFactoryAware接口,那么就调用该接口的setBeanFactory()方法,将BeanFactory容器实例设置到Bean中

9.如果Bean实现了BeanFactoryAware接口,那么就调用该接口的setBeanFactory()方法,将BeanFactory容器实例设置到Bean中

10.如果BeanFactory装配了BeanPostProcessor接口的实现类,那么就调用该后处理器的postProcessBeforeInitialization(Object bean , String beanName)方法对Bean进行加工。其中,入参bean是当前正在处理的Bean,而beanName是当前Bean的配置名。开发者可以通过改方法对Bean进行特殊的改造,例如Spring提供的AOP功能就利用BeanPostPrecessor来实现

11.如果Bean实现了InitializingBean接口,那么就调用该接口的afterPropertiesSet()方法

12.如果在中通过init-method属性定义了初始化方法,那么就执行这个方法

13.这是工厂后处理器BeanPostProcessor接口定义的第二个方法,第一个方法在第10步执行了,该接口的postProcessAfterInitialization(Object bean , String beanName)方法给容器提供了再次对Bean进行加工的机会

14.如果在中配置的Bean的作用范围是scope=“prototype”,那么就直接将该Bean实例返回给调用者,这些Bean实例不再由Spring容器管理。如果scope=“singleton”,那么就缓存该Bean实例,再返回给调用者,同时Spring容器将继续管理缓存池中的Bean实例

15.对于scope=“singleton”(默认情况)的Bean,当容器关闭的时候,如果Bean实现了DisposableBean接口,那么就调用该接口的destroy()方法

16.对于scope=“singleton”(默认情况)的Bean,如果通过destroy-method属性配置的销毁方法,那么就调用该方法

上述16步描述了ApplicationContext管理的Bean的生命周期,其中的每一步都调用了相关的方法,主要有以下几类:

  1. Bean自身的方法:Bean的构造函数,Bean的Setter方法,以及init-method和destroy-method方法
  2. Bean级生命周期接口方法:这些方法是Spring容器规定的,由Bean实现的方法,例如BeanNameAware接口,BeanFactoryAware接口,ApplicationContextAware接口,InitializingBean接口,DisposableBean接口
  3. 容器级生命周期接口方法:这些方法是容器来配置实现类的,无需Bean来实现,在流程图中用黑点标识的方法。由于是容器级别的后处理器,这些方法对容器中所有的Bean都起作用。

在ApplicationContext中,只需要在配置文件中通过定义工厂后处理器和Bean后处理器,容器就会按照预定的机制运行。以上就是Spring容器中管理的Bean的生命周期,并不是每一步都在实际中用到,但是这些生命周期体现了Spring容器对Bean的管理理念,提供给开发者足够的空间来自己控制Bean。

2.5 FactoryBean

如果某些Bean的实例化过程比较复杂,如果按照XML或者注解来配置的话需要大量的配置信息,并且灵活性也受限制。Spring为了解决这一情况,提供了FactoryBean,我们可以通过实现该工厂接口来定制实例化Bean的逻辑。FactoryBean接口定义了3个方法:

  • T getObject():返回由FactoryBean创建的Bean的实例。
  • boolean isSingleton():由FactoryBean创建的Bean是Singleton还是prototype
  • Class getObjectType():返回FactoryBean创建的Bean的类型

当配置文件中的类型是FactoryBean时,容器通过getBean()方法返回的不是FactoryBean本身,而是FactoryBean.getObject()方法所返回的对象。Spring提供了FactoryBean接口给我们提供了自定义实例化Bean的方法,在某些复杂的情况下很有用处。

3.Spring的七大模块

SpringCore(核心容器)

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

SpringContext(应用上下文)

核心模块的BeanFactory使Spring成为一个容器,而上下文模块使它成为一个框架。这个模块扩展了BeanFactory的概念,增加了对国际化(I18N)消息、事件传播以及验证的支持。

另外,这个模块提供了许多企业服务,例如电子邮件、JNDI访问、EJB集成、远程以及时序调度(scheduling)服务。也包括了对模版框架例如Velocity和FreeMarker集成的支持。

SpringAOP(面向切面模块)

Spring在它的AOP模块中提供了对面向切面编程的丰富支持。这个模块是在Spring应用中实现切面编程的基础。为了确保Spring与其它AOP框架的互用性,Spring的AOP支持基于AOP联盟定义的API。AOP联盟是一个开源项目,它的目标是通过定义一组共同的接口和组件来促进AOP的使用以及不同的AOP实现之间的互用性。通过访问他们的站点,你可以找到关于AOP联盟的更多内容。

Spring的AOP模块也将元数据编程引入了Spring。使用Spring的元数据支持,你可以为你的源代码增加注释,指示Spring在何处以及如何应用切面函数。

Spring Dao(JDBC抽象和DAO模块)

使用JDBC经常导致大量的重复代码,取得连接、创建语句、处理结果集,然后关闭连接。Spring的JDBC和DAO模块抽取了这些重复代码,因此你可以保持你的数据库访问代码干净简洁,并且可以防止因关闭数据库资源失败而引起的问题。

这个模块还在几种数据库服务器给出的错误消息之上建立了一个有意义的异常层。使你不用再试图破译神秘的私有的SQL错误消息!

另外,这个模块还使用了Spring的AOP模块为Spring应用中的对象提供了事务管理服务。

Spring ORM(对象/关系映射集成模块)

对那些更喜欢使用对象/关系映射工具而不是直接使用JDBC的人,Spring提供了ORM模块。Spring并不试图实现它自己的ORM解决方案,而是为几种流行的ORM框架提供了集成方案,包括Hibernate、JDO和iBATIS SQL映射。Spring的事务管理支持这些ORM框架中的每一个也包括JDBC。

Spring Web(Spring的Web模块)

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

Spring WebMVC(Spring的MVC框架)

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

它也允许你声明性地将请求参数绑定到你的业务对象中,此外,Spring的MVC框架还可以利用Spring的任何其它服务,例如国际化信息与验证。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值