承接上节继续,分析Ioc的工作原理,在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起(同时一个叫DI“依赖注入”或DL“依赖查找”的概念,在C++,java,php以及.net中也是用到过,但是Spring中也把IOC叫做依赖注入,这是找到资料上面是这样写的),决定什么时间 调用方法。从源码的角度看这个过程是怎样实现一下几步:
  • 定位
  • 载入
  • 初始化
  • 注册
  • 依赖注入使用
  在上章节里ClassPathXmlApplicationContext这个类
  
public ClassPathXmlApplicationContext(
            String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
            throws BeansException {

        super(parent);//这里是调用的父类的方法
        setConfigLocations(configLocations);
        if (refresh) {
            refresh();
        }
    }
//创建一个新的AbstractApplicationContext与给定的父上下文中。
    public AbstractApplicationContext(@Nullable ApplicationContext parent) {
        this();
        setParent(parent);
    }
//把parent赋给这个application 上下文

@Override
public void setParent(@Nullable ApplicationContext parent) {
this.parent = parent;
if (parent != null) {
Environment parentEnvironment = parent.getEnvironment();
if (parentEnvironment instanceof ConfigurableEnvironment) {
getEnvironment().merge((ConfigurableEnvironment) parentEnvironment);
}
}
}

这里只是加载application.xml文件的上下文,使我们的Spring的可以读取到这里面的所有的配置的bean,接下来的关键是,将需要的bean用getBean()的方式去定位拿到。

   获取bean是个结束:下图表明了获取bean的方法来自最顶层的接口BeanFactory,所以核心研究这个定义了规范的顶层接口做了做了些什么,也方便我们的代码以后的扩张。
   

  简单的下面的这种多种获取对象bean的面向接口编程方式,就是常见的工厂模式;也即 IOC 容器为开发者管理对象 间的依赖关系提供了很多便利和基础服务。其实我们知道这些方法就可以满足我们正在的开发的需要了,但是我们还是想跟着bean的生成过成做一次探索。

//定义了Ioc的基本功能规范
public interface BeanFactory {

    // 对FactoryBean的转义,假如,bean的名字被叫做FactoryBean,获取时会返回一个factory,不是工厂的实例,需要转义
    String FACTORY_BEAN_PREFIX = "&";

    //返回一个实例
    //根据bean的名字返回一个bean的实例对象
    Object getBean(String name) throws BeansException;
    // 返回一个bean的实例
    // 支持泛型的方法是安全的,参数bean的名字和输入的bean的类型必须一致
    <T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException;

    // 返回一个bean的实例
    // 输入一个bean的名字,使用显式参数创建bean实例时使用的rgs
    Object getBean(String name, Object... args) throws BeansException;

    // 返回与给定对象类型匹配的bean实例,如果有的话
    <T> T getBean(Class<T> requiredType) throws BeansException;

    //返回一个实例,该实例可以共享或独立于指定的bean。
    <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

    //这个bean工厂是否包含bean定义或外部注册的单例对象
    boolean containsBean(String name);

    //这个bean是一个共享的单例吗?返回相同的实例吗?
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

    //这个bean是原型吗?
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

    //检查给定名称的bean是否与指定的类型匹配
    boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

    //检查给定名称的bean是否与指定的类型匹配
    boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

    @Nullable
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;

    //为给定的bean名称提供别名,如果有的话。所有这些别名都指向同一个bean,在@link getbean调用中使用。
    String[] getAliases(String name);

}

  对bean的解析是现在开始:描述bean的接口是这个Beandefinition,这是一个比较复杂的一个过程,我也不知道我能不能完全把它说清楚,需要准备一下,我下节中会详细介绍这里面的细节实现,容我准备一波。

 

Spring的IOC分析(二)源码的更多相关文章

  1. 【SSH进阶之路】Spring的IOC逐层深入——源码解析之IoC的根本BeanFactory(五)

    我们前面的三篇博文,简单易懂的介绍了为什么要使用IOC[实例讲解](二).和Spring的IOC原理[通俗解释](三)以及依赖注入的两种常用实现类型(四),这些都是刚开始学习Spring IoC容器时 ...

  2. JAVA模拟Spring实现IoC过程(附源码)

    前言:本人大四学生,第一次写博客,如果有写得不好的地方,请大家多多指正 一.IoC(Inversion of Control)反转控制 传统开发都是需要对象就new,但这样做有几个问题: 效率低下,创 ...

  3. 【Spring】Spring IOC原理及源码解析之scope=request、session

    一.容器 1. 容器 抛出一个议点:BeanFactory是IOC容器,而ApplicationContex则是Spring容器. 什么是容器?Collection和Container这两个单词都有存 ...

  4. Spring MVC工作原理及源码解析(二)DispatcherServlet实现原理及源码解析

    1.DispatcherServlet 处理流程 从上一篇文章中Spring MVC原理图中我们可以看出:DispatcherServlet 在 Spring MVC框架 中处于核心位置,它负责协调和 ...

  5. 一文读懂Spring动态配置多数据源---源码详细分析

    Spring动态多数据源源码分析及解读 一.为什么要研究Spring动态多数据源 ​ 期初,最开始的原因是:想将答题服务中发送主观题答题数据给批改中间件这块抽象出来, 但这块主要使用的是mq消息的方式 ...

  6. Spring Boot 揭秘与实战 源码分析 - 工作原理剖析

    文章目录 1. EnableAutoConfiguration 帮助我们做了什么 2. 配置参数类 – FreeMarkerProperties 3. 自动配置类 – FreeMarkerAutoCo ...

  7. Spring Boot 揭秘与实战 源码分析 - 开箱即用,内藏玄机

    文章目录 1. 开箱即用,内藏玄机 2. 总结 3. 源代码 Spring Boot提供了很多”开箱即用“的依赖模块,那么,Spring Boot 如何巧妙的做到开箱即用,自动配置的呢? 开箱即用,内 ...

  8. 如何分析SpringBoot源码模块及结构?--SpringBoot源码(二)

    注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 前言 本篇接 如何搭建自己的SpringBoot源码调试环境?--SpringBoot源码(一). 前面搭建好了自己本地的S ...

  9. django 之(二) --- 源码分析

    CBV类视图继承 CBV:继承自View:注册的时候使用的as_view() 入口 不能使用请求方法的名字作为参数的名字 只能接受已经存在的属性对应的参数 定义了一个view 创建了一个类视图对象 保 ...

  10. Spring框架之spring-web web源码完全解析

    Spring框架之spring-web web源码完全解析 spring-web是Spring webMVC的基础,由http.remoting.web三部分组成,核心为web模块.http模块封装了 ...

随机推荐

  1. verilog抓外部低频输入信号的上升沿和下降沿

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7220107.html 作者:窗户 Q ...

  2. openstack操作之一 命令行

    在openstack环境中提供了多种操作虚拟机的方法,有最简单直接的dashborad界面,有不直观但高效的命令行,还有进阶版的postman调用openstack restfulapi和命令行中使用 ...

  3. redis中使用 check-and-set 操作实现乐观锁

    WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为. 被 WATCH 的键会被监视,并会发觉这些键是否被改动过了. 如果有至少一个被监视的键在 EXEC 执行之前 ...

  4. Oracle学习笔记_09_字符串相关函数

    二.参考资料 0.Oracle中的字符串类型及相关函数详解 1.ORACLE 字符串操作 2.oracle函数大全-字符串处理函数

  5. [编织消息框架][JAVA核心技术]动态代理应用1

    前面几篇介绍,终于到了应用阶段啦,我们来做一个RPC来加强学过的知识 做基础核心时先确定解决什么问题,提供什么服务,同将来扩展等 rpc 分两部份,一个是调用者,另一方是服务提供者 调用者只关心那个服 ...

  6. Ubuntu16.04下编译安装OpenCV3.4.0(C++ & python)

    Ubuntu16.04下编译安装OpenCV3.4.0(C++ & python) 前提是已经安装了python2,python3 1)安装各种依赖库 sudo apt-get update ...

  7. SQLSERVER 远程登录18456错误

    此文为转载:   我是这么解决的: 1.以windows验证模式进入数据库管理器. 第二步:右击sa,选择属性: 在常规选项卡中,重新填写密码和确认密码(改成个好记的).把强制实施密码策略去掉. 第三 ...

  8. vue2.0 样式表引入的方法 css sass less

    在引入样式之前,首先要了解static.assets两个文件夹的区别. 从字面上可以看出,static用来存放静态文件,assets用来存放资源文件: static存放的文件不会被编译,打包后直接赋值 ...

  9. AspNet Core Web 应用程序的启动(有关 Program.cs类/ Startup.cs类 ) 当项目中干掉 Startup.cs 类如何设置启动 配置等等

    .有关怎么创建Core MVC/API 这里就不说了,前段时间的博客有说过: 1.  项目生成后会有如图所示两个类 Program类Startup类 2. Startup类  初始内容 public ...

  10. 扩充表字段长度,引发的意外KILLED/ROLLBACK

    这一段时间,因为系统升级,新系统产生的数据长度,比原来的数据长度要长,所以说要扩充一下字段长度. ) --修改字段长度sql 在执行的时候,有这样一个情况. 例如Student表的Name字段长度是n ...