Spring IOC容器继承关系图

MessageSource支持消息国际化。ResouceLoader资源加载。BeanFactory创建Bean。ApplicationEventPublisher通知的所有与事件相匹配的监听器。

Ioc(inverse of control)

Ioc: 控制反转,简单来说就是 把创建对象实例的行为由程序交给Spring容器来完成。这样能达到松耦合的目的。Spring容器通过解析Bean的各项参数配置来回复Bean的生命周期以及Bean与Bean之间的关系。Spring容器以此来达到对Bean的管理。

Spring中常用的接口有:BeanFactory、ApplicationContext、ConfigurableApplicationContext、ConfigurableWebApplicationContext、Xml BeanFactory、FactoryBean等等

BeanFactory

package org.springframework.beans.factory;

import org.springframework.beans.BeansException;

public abstract interface BeanFactory

{

public static final String FACTORY_BEAN_PREFIX = "&";

//从factory中获取给定名称的bean

public abstract Object getBean(String paramString)

throws BeansException;

//从factory中获取给定名称的bean实例

public abstract Object getBean(String paramString, Class paramClass)

throws BeansException;

//从factory中获取给定名称的bean实例

public abstract Object getBean(String paramString, Object[] paramArrayOfObject)

throws BeansException;

//判断factory中是否有给定名称的bean实例,有则返回true.

public abstract boolean containsBean(String paramString);

//判断给定名称的bean实例的作用域是否是Singleton,是则返回true.

public abstract boolean isSingleton(String paramString)

throws NoSuchBeanDefinitionException;

//判断给定名称的bean实例的作用域是否是Prototype,是则返回true.

public abstract boolean isPrototype(String paramString)

throws NoSuchBeanDefinitionException;

//判断factory中是否有给定type和class类型的bean实例

public abstract boolean isTypeMatch(String paramString, Class paramClass)

throws NoSuchBeanDefinitionException;

//从factory中获取给定type的bean实例,并装换成class类型.

public abstract Class getType(String paramString)

throws NoSuchBeanDefinitionException;

//返回给定bean名称的所有别名.

public abstract String[] getAliases(String paramString);

}

ApplicationContext

package org.springframework.context;

import org.springframework.beans.factory.HierarchicalBeanFactory;

import org.springframework.beans.factory.ListableBeanFactory;

import org.springframework.beans.factory.config.AutowireCapableBeanFactory;

import org.springframework.core.io.support.ResourcePatternResolver;

public abstract interface ApplicationContext

extends ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver

{

//获取父ApplicationContext容器

public abstract ApplicationContext getParent();

//获取可自动装配的bean factory

public abstract AutowireCapableBeanFactory getAutowireCapableBeanFactory()

throws IllegalStateException;

//获取显示名称

public abstract String getDisplayName();

//获取启动时间

public abstract long getStartupDate();

}

首先,它是个BeanFactory,可以管理、装配bean,可以有父级BeanFactory实现Bean的层级管理(具体到这里来说它可以有父级的ApplicationContext,因为ApplicationContext本身就是一个BeanFactory。这在web项目中很有用,可以使每个Servlet具有其独立的context, 所有Servlet共享一个父级的context),它还是Listable的,可以枚举出所管理的bean对象。

其次,它是一个ResourceLoader,可以加载资源文件;

再次,它可以管理一些Message实现国际化等功能;

还有,它可以发布事件给注册的Listener,实现监听机制。

ApplicationContext 接口具有两个直接子接口,分别是:

org.springframework.context.ConfigurableApplicationContext

org.springframework.web.context.WebApplicationContext

分别看这两个子接口:

(1)       public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable

这是一个在ApplicationContext基础上提供配置方法的接口。ConfigurableApplicationContext 提供了如setID()、setParent()、setEnvironment()等方法,用来配置ApplicationContext。其另外还继承了两个接口:①Lifecycle:Lifecycle接口中具有start()、stop()等方法,用于对context生命周期的管理;②Closeable:Closeable是标准JDK所提供的一个接口,用于最后关闭组件释放资源等;

(2)       public interface WebApplicationContext extends ApplicationContext

该接口仅仅在原接口基础上提供了getServletContext(),用于给servlet提供上下文信息。

这两个子接口的下一级共同子接口:

(1)       public interface ConfigurableWebApplicationContext extends WebApplicationContext, ConfigurableApplicationContext

这里 ConfigurableWebApplicationContext 又将上述两个接口结合起来,提供了一个可配置、可管理、可关闭的WebApplicationContext,同时该接口还增加了setServletContext(),setServletConfig()等set方法,用于装配WebApplicationContext。

ApplicationContext相关接口基本上总结起来就是两大接口:

org.springframework.context.ConfigurableApplicationContext

org.springframework.web.context.ConfigurableWebApplicationContext

对于普通应用,使用ConfigurableApplicationContext 接口的实现类作为bean的管理者,对于web应用,使用ConfigurableWebApplicationContext 接口的实现类作为bean的管理者。这两个接口,从结构上讲他们是继承关系,从应用上讲他们是平级关系,在不同的领域为Spring提供强大的支撑。

FactoryBean

package org.springframework.beans.factory;

public abstract interface FactoryBean

{

//返回FactoryBean创建的Bean实例,如果isSingleton()返回true,则会将实例放入Spring的单例缓存池中.

public abstract Object getObject()

throws Exception;

//返回FactoryBean创建的Bean类型

public abstract Class getObjectType();

//判断FactoryBean创建的Bean的作用域是Singleton还是Prototype

public abstract boolean isSingleton();

}

注意:

1.普通Bean的创建:Spring通过反射机制利用<bean>的class属性指定实现类实例化Bean。(通常比较复杂,这时使用FactoryBean可以通过编码方式得到一个比较简单的方案)。

2. 通过FactoryBean创建Bean:用户可以通过实现该接口定制实例化Bean的逻辑。FactoryBean是一个接口,当在IOC容器中的Bean实现了FactoryBean后,通过getBean(String BeanName)获取到的Bean对象并不是FactoryBean的实现类对象,而是这个实现类中的getObject()方法返回的对象。要想获取FactoryBean的实现类,就要getBean(&BeanName),在BeanName之前加上&。

3. FactoryBean使用了装饰者模式和简单工厂模式.

从源码层面解析SpringIOC容器的更多相关文章

  1. java架构之路-(spring源码篇)springIOC容器源码解析(上)

    我们这次来叭叭一下Spring的源码,这次博客主要来说说Spring源码,先粗略的撸一遍,下篇博客选几个重点去说,由于过于复杂,我也是看了一点点,我们先来过一遍源码,然后上流程图,最后我们再回头总结一 ...

  2. spring5 源码深度解析-----ApplicationContext容器refresh过程

    在之前的博文中我们一直以BeanFactory接口以及它的默认实现类XmlBeanFactory为例进行分析,但是Spring中还提供了另一个接口ApplicationContext,用于扩展Bean ...

  3. SpringMVC 源码深度解析&lt;context:component-scan&gt;(扫描和注冊的注解Bean)

    我们在SpringMVC开发项目中,有的用注解和XML配置Bean,这两种都各有自己的优势,数据源配置比較经经常使用XML配置.控制层依赖的service比較经经常使用注解等(在部署时比較不会改变的) ...

  4. spring5 源码深度解析----- 被面试官给虐懵了,竟然是因为我不懂@Configuration配置类及@Bean的原理

    @Configuration注解提供了全新的bean创建方式.最初spring通过xml配置文件初始化bean并完成依赖注入工作.从spring3.0开始,在spring framework模块中提供 ...

  5. spring源码深度解析— IOC 之 容器的基本实现

    概述 上一篇我们搭建完Spring源码阅读环境,spring源码深度解析—Spring的整体架构和环境搭建 这篇我们开始真正的阅读Spring的源码,分析spring的源码之前我们先来简单回顾下spr ...

  6. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

  7. 转 Spring源码剖析——核心IOC容器原理

    Spring源码剖析——核心IOC容器原理 2016年08月05日 15:06:16 阅读数:8312 标签: spring源码ioc编程bean 更多 个人分类: Java https://blog ...

  8. Spring框架之spring-webmvc源码完全解析

    Spring框架之spring-webmvc源码完全解析 Spring框架提供了构建Web应用程序的全功能MVC模块.Spring MVC分离了控制器.模型对象.分派器以及处理程序对象的角色,支持多种 ...

  9. Retrofit源码设计模式解析(下)

    本文将接着<Retrofit源码设计模式解析(上)>,继续分享以下设计模式在Retrofit中的应用: 适配器模式 策略模式 观察者模式 单例模式 原型模式 享元模式 一.适配器模式 在上 ...

随机推荐

  1. 修改数据库中的内容报错:PropertyAccessException:Null value was assinged to a property of primitive type setter of

    错误原因:totalTime的类型为int,数据库中为NULL,int 类型不能赋值为NULL,只能为0,所以报此异常. 解决方案:将totalTime的类型改为Integer,或者初始化为0

  2. 以json格式打印实体类信息

    1.pom.xml <dependency> <groupId>com.google.code.gson</groupId> <artifactId>g ...

  3. Haodoop RPC解析

    1. 前言 1 2. Hadoop RPC 1 2.1. 总体结构 1 2.1.1. RPC Interface 1 2.1.2. RPC Server 1 2.1.3. RPC Client 1 2 ...

  4. java中null转换成其它类型

    对null进行强转会不会抛错.测试结果是,如果把null强转给对象,是不会抛异常的,因为本身对象是可以为null的.但是如果是基本类型,比如 int i = (Integer)obj的强转,其实内部会 ...

  5. 用 pyqt4 编写的一个翻译小工具

    有时候我们在开发时遇到一些陌生的英文单词或者不容易看出某些长句的中文意思时该怎么办呢?打开桌面上的翻译软件?打开浏览器里收藏着的翻译网址或者直接贴上百度的搜索框去查?这些方法固然可以,还很常见,但如果 ...

  6. 企业搜索引擎开发之连接器connector(二十四)

    本人在上文中提到,连接器实现了两种事件依赖的机制 ,其一是我们手动操作连接器实例时:其二是由连接器的自动更新机制 上文中分析了连接器的自动更新机制,即定时器执行定时任务 那么,如果我们手动操作连接器实 ...

  7. 1、Docker介绍

      Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化.容器完全使用沙箱机制,相互之间不会有任何接口 ...

  8. python signal

    在了解了Linux的信号基础之 后,Python标准库中的signal包就很容易学习和理解.signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂 停并等待信号,以及定时 ...

  9. SQL Server创建表超出行最大限制解决方法

    问题的现象在创建表A的时候,出现“信息 511,级别 16,状态 1,第 5 行  无法创建大小为 的行,该值大于允许的最大值 8060.”的信息提示.很奇怪,网上查了一下,是因为要插入表的数据类型的 ...

  10. [react002] component基本用法

    1 什么是component 设计接口的时候,把通用的设计元素(按钮,表单框,布局组件等)拆成接口良好定义的可复用的组件. 这样,下次开发相同界面程序时就可以写更少的代码,也意义着更高的开发效率,更少 ...