Spring学习笔记:(一)IOC容器加载过程

1. Spring框架功能整体介绍

Spring学习笔记:(一)IOC容器加载过程_第1张图片

1.1 Spring Core Container

作用:
Core 和 Beans 模块是框架的基础部分,提供 IoC (转控制)和依赖注入特性。 这里 的基础 概念是 BeanFactory,它提供对 Factory 模式的经典实 现来消除对程序’性单 例模式的需要,并真 正地允许你从程序逻辑中分离出依赖关系和配置

  • Beans (BeanFacotry的作用):包含访问配直文件、创建和管理 bean 以及进行 Inversion of Control I Dependency Injection ( IoC/DI )操作相关的所有类
  • Core:主要包含 Spring 框架基本的核心工具类, Spring 的其他组件都要用到这个包 里的类, Core 模块是其他组件的基 本核心
  • Context(处理BeanFactory):构建于 Core 和 Beans 模块基础之上,提供了一种类似JNDI 注册器的框 架式的对象访问方 法。 Context 模块继承了 Beans 的特性,为 Spring 核 心提供了大量 扩展,添加了对 国际化(例如资源绑定)、事件传播、资源加载和对 Context 的透明创 建的支持。 Context 模块同时 也支持 J2EE 的一些特 性, ApplicationContext 接口是 Context 模块的关键
    本质区别:(使用BeanFacotry的bean是延时加载的,ApplicationContext是非延时加载的)
  • Expression Language:提供了强大的表达式语言,用于在运行时查询和操纵对象。 它是 JSP 2.1 规范中定义的 unifed expression language 的扩展。 该语言支持设直/获取属 性的值,属性的分配,方法的调用,访问数 组上下文( accessiong the context of arrays )、 容器和索引器、逻辑和算术运算符、命名变量以 及从Spring的 IoC 容器中根据名称检 索对象。 它也支持 list 投影、选择和一般的 list 聚合

1.2 Spring Data Access/Integration

  • JDBC:提供了一个 JDBC 抽象层,它可以消除冗长的 JDBC 编码和解析数据库厂 商特有的错误代码。 这个模块包含了 Spring 对 JDBC 数据访问进行封装的所有类
  • ORM:如 JPA、 JDO、 Hibernate、 iBatis 等,提供了 一个交互层。 利用 ORM 封装包,可以混合使用所 有 Spring 提供的特性进行 O/R 映射
  • OXM:提供了一个对 ObjecνXML 映射实现的抽象层,现包括 JAXB、 Castor、 XMLBeans、 JiBX 和 XStrearn
  • JMS ( Java Messaging Service ):块主要包含了 一些制造和消 费消息的特性
  • Transaction:支持编程和声明性的事务管理,这些事务类必须实现特定的接口,并且对所有的 POJO 都适用

1.3 Spring Web

提供了基础的面向 Web 的集成特性c 例如,多文件上传、使用 servlet listeners 初始化 IoC 容器以及一个面向 Web 的应用上下文。 它还包含 Spring 远程支持中 Web 的相关部分

1.4 Spring Aop

  • Aspects 模块提供了对 AspectJ 的集成支持
  • Instrumentation 模块提供了 class instrumentation 支持和 classloader 实现,使得可以在特 定的应用服务器上使用

1.5 Test

支持使用 JUnit 和 TestNG 对 Spring 组件进行测试

2.IOC加载过程

Spring学习笔记:(一)IOC容器加载过程_第2张图片

3. 面试相关问题

3.1 描述下BeanFactorry

IOC容器或对象工厂,可以创建并管理各种类的对象。这些被创建和管理的对象可以被看成一个POJO。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似

存在的原因:
①:解耦。beanFactory之前是通过new来创建对象,beanFactory之后通过beanFactory来创建对象
②:进行额外的操作。BeanFactorry会在bean的生命周期的各个阶段中对bean进行各种管理和操作,并且对外暴露这些接口。即,只需让bean实现对应的接口,我们就可以在bean的生命周期中进行额外的操作

主要的扩展接口:
Spring学习笔记:(一)IOC容器加载过程_第3张图片

  • ListableBeanFactory: 定义了访问容器Bean中的一些方法
  • HierarchicalBeanFactory :父子级联IoC容器的接口,子容器可以通过接口方法访问父容器
  • ConfigurableBeanFactory :实现了IoC容器的可定制性
  • AutowireCapableBeanFactory :定义了容器中的Bean按照某种规则进行自动装配的方法
  • SingletonBeanRegistry :定义了允许在运行期间向容器注册单实例Bean的方法
  • BeanDefinitionRegistry:Spring配置文件中和注解实现的每个bean,在Spring中都是通过一个BeanDefinition对象表示,它描述了Bean的各种配置信息,该接口提供了向容器手动注册BeanDefinition的方法。

主要的作用:
getBean(String beanName). 该方法从容器中返回特定名称的Bean

3.2 BeanFactory和ApplicationContext的区别

BeanFactory是Spring框架最核心的接口,是Spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等

ApplicationContext建立在BeanFactory的基础上,提供了更多面向应用的功能,如:

  • MessageSource, 提供国际化的消息访问
  • 资源访问(如URL和文件)
  • 事件传递
  • Bean的自动装配
  • 各种不同应用层的Context实现

适用场景不同:

  • BeanFactory是Spring框架的基础设施,面向Spring本身
  • ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合都可以直接使用Application而非底层的BeanFactory

3.3 SpringIOC的加载过程

Bean容器的启动阶段:

  1. 读取bean的xml配置文件(或者注解实现的bean),然后解析xml文件中的各种bean的定义,将xml文件中的每一个元素分别转换成一个BeanDefinition对象,其中保存了从配置文件中读取到的该bean的各种信息
  2. 然后通过BeanDefinitionRegistry将这些bean注册到beanFactory中

Bean的实例化阶段:

  1. 调用各种Aware接口。如 BeanFactoryAware,MessageSourceAware,ApplicationContextAware,对于实现了这些Aware接口的bean,在实例化bean时Spring会帮我们注入对应的:BeanFactory, MessageSource,ApplicationContext的实例。
  2. 调用BeanPostProcessor接口。
  3. 调用InitializingBean接口。实现了InitializingBean接口的bean,在实例化bean时Spring会帮我们调用接口中的方法
  4. 调用DisposableBean接口。实现了BeanPostProcessor接口的bean,在该bean死亡时Spring会帮我们调用接口中的方法

3.4 Bean的生命周期

大纲版:

  1. 实例化 Instantiation
  2. 属性赋值 Populate
  3. 初始化 Initialization
  4. 销毁 Destruction

精简版:
Spring学习笔记:(一)IOC容器加载过程_第4张图片

详细版:
Spring学习笔记:(一)IOC容器加载过程_第5张图片

3.5 Spring中有哪些扩展接口

  • InitialingBean:提供了一个唯一的方法afterPropertiesSet()。在Bean属性都设置完毕后调用afterPropertiesSet()方法做一些初始化的工作
  • DisposableBean:提供了一个唯一的方法destory()。在Bean生命周期结束前调用destory()方法做一些收尾工作
  • BeanNameAware:在Bean加载的过程中可以获取到该Bean的id
  • ApplicationContextAware:在Bean加载的过程中可以获取到Spring的ApplicationContext。ApplicationContext是Spring应用上下文,从ApplicationContext中可以获取包括任意的Bean在内的大量Spring容器内容和信息
  • BeanFactoryAware:在Bean加载的过程中可以获取到加载该Bean的BeanFactory
  • BeanPostProcessor:postProcessBeforeInitialization方法是在初始化Bean之前,postProcessAfterInitialization方法是在初始化Bean之后

你可能感兴趣的:(Spring,java,spring)