码迷,mamicode.com
首页 > 编程语言 > 详细

Spring的IOC分析(二)源码

时间:2018-01-24 00:41:12      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:gpo   obj   依赖注入   工厂模式   alias   比较   加载   image   factory   

  承接上节继续,分析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分析(二)源码

标签:gpo   obj   依赖注入   工厂模式   alias   比较   加载   image   factory   

原文地址:https://www.cnblogs.com/zhikou/p/8338352.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!