首页 > 编程语言 > 详细

spring ioc

时间:2020-03-30 00:10:56      阅读:94      评论:0      收藏:0      [点我收藏+]

spring源码地址:git clone git://github.com/SpringSource/Spring-framework.git
版本:4.3.x

引入例子

先来看个例子,spring容器的使用

//定义接口
public interface MessageService {
    String getMessage();
}
//定义实现类

public class MessageServiceImpl implements MessageService {
 
    public String getMessage() {
        return "hello world";
    }
}

//编写配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"  
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName">
  
    <bean id="messageService" class="com.javadoop.example.MessageServiceImpl"/>
</beans>

//运行 

public class App {
    public static void main(String[] args) {
        // 用我们的配置文件来启动一个 ApplicationContext
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application.xml");
 
        System.out.println("context 启动成功");
 
        // 从 context 中取出我们的 Bean,而不是用 new MessageServiceImpl() 这种方式
        MessageService messageService = context.getBean(MessageService.class);
        // 这句将输出: hello world
        System.out.println(messageService.getMessage());
    }
}

上边是spring ioc的使用流程。接下来看几个重要的接口/类。

ApplicationContext

ApplicationContext就代表了spring容器,具体实现类如下:
技术分享图片
可以使用的有:
FileSystemXmlApplicationContex:可以通过绝对路径获取配置文件,没配置绝对路径则读取的是项目根路径。
ClassPathXmlApplicationContext:classPath下读取配置文件
AnnotationConfigApplicationContext:注解方式读取配置文件

BeanFactory

技术分享图片
BeanFactory为spring ioc的最核心顶层接口,就连ApplicationContext也是一种BeanFactory。
接下来会有用到的几种BeanFactory说明一下:
1、ListableBeanFactory:这种BeanFactory提供了一次获取多个bean的方法。
2、HierarchicalBeanFactory:可以在应用中起多个 BeanFactory,然后可以将各个 BeanFactory 设置为父子关系
3、AutowireCapableBeanFactory :
4、ConfigurableListableBeanFactory :特殊之处在于它继承了第二层所有的三个接口。
5、DefaultListableBeanFactory :功能最全的BeanFactory 。

BeanDefinition

BeanDefinition 就是我们所说的 Spring 的 Bean,我们自己定义的各个 Bean 其实会转换成一个个 BeanDefinition 存在于 Spring 的 BeanFactory 中。
BeanDefinition 中保存了我们的 Bean 信息,比如这个 Bean 指向的是哪个类、是否是单例的、是否懒加载、这个 Bean 依赖了哪些 Bean 等等。

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
        // 我们可以看到,默认只提供 sington 和 prototype 两种,
        // 很多读者都知道还有 request, session, globalSession, application, websocket 这几种,
        // 不过,它们属于基于 web 的扩展。
        String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
        String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;

        // 设置父 Bean,这里涉及到 bean 继承,不是 java 继承。请参见附录介绍
        void setParentName(String parentName);
        String getParentName();

        // 设置 Bean 的类名称
        void setBeanClassName(String beanClassName);
        String getBeanClassName();


        // 设置 bean 的 scope
        void setScope(String scope);
        String getScope();

        // 设置是否懒加载
        void setLazyInit(boolean lazyInit);
        boolean isLazyInit();

        // 设置该 Bean 依赖的所有的 Bean,注意,这里的依赖不是指属性依赖(如 @Autowire 标记的),
        // 是 depends-on="" 属性设置的值。
        void setDependsOn(String... dependsOn);
        String[] getDependsOn();

        // 设置该 Bean 是否可以注入到其他 Bean 中,只对根据类型注入有效,
        // 如果根据名称注入,即使这边设置了 false,也是可以的
        void setAutowireCandidate(boolean autowireCandidate);

        // 该 Bean 是否可以注入到其他 Bean 中
        boolean isAutowireCandidate();

        // 主要的。同一接口的多个实现,如果不指定名字的话,Spring 会优先选择设置 primary 为 true 的 bean
        void setPrimary(boolean primary);
        boolean isPrimary();

        // 如果该 Bean 采用工厂方法生成,指定工厂名称。对工厂不熟悉的读者,请参加附录
        void setFactoryBeanName(String factoryBeanName);
        String getFactoryBeanName();

        // 指定工厂类中的 工厂方法名称
        void setFactoryMethodName(String factoryMethodName);
        String getFactoryMethodName();

        // 构造器参数
        ConstructorArgumentValues getConstructorArgumentValues();

        // Bean 中的属性值,后面给 bean 注入属性值的时候会说到
        MutablePropertyValues getPropertyValues();

        // 是否 singleton
        boolean isSingleton();

        // 是否 prototype
        boolean isPrototype();

        // 如果这个 Bean 原生是抽象类,那么不能实例化
        boolean isAbstract();

        int getRole();

        String getDescription();

        String getResourceDescription();

        BeanDefinition getOriginatingBeanDefinition();
    }

开始分析源码

入口ClassPathXmlApplicationContext构造函数:

public ClassPathXmlApplicationContext(String[] paths, Class<?> clazz, ApplicationContext parent) throws BeansException {
        super(parent);
        Assert.notNull(paths, "Path array must not be null");
        Assert.notNull(clazz, "Class argument must not be null");
        this.configResources = new Resource[paths.length];

//xml配置文件可以传入多个
        for(int i = 0; i < paths.length; ++i) {
            this.configResources[i] = new ClassPathResource(paths[i], clazz);
        }
//下一步方法入口   这里为什么明明为刷新而不是init:因为spring容器可以通过调用这个方法进行销毁重建的刷新操作
        this.refresh();
    }

AbstractApplicationContext.refresh():这个方法中列出了一大堆步骤,后边的所有分析都在肢解这个方法。

 public void refresh() throws BeansException, IllegalStateException {
        // 来个锁,不然 refresh() 还没结束,又来个启动或销毁容器的操作,那不就乱套了嘛
        synchronized(this.startupShutdownMonitor) {
            //准备工作
            this.prepareRefresh();
           //生成beanDefinition
            ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
          //设置 BeanFactory 的类加载器,添加几个特殊的 BeanPostProcessor,手动注册几个特殊的 bean
            this.prepareBeanFactory(beanFactory);

            postProcessBeanFactory(beanFactory);

            invokeBeanFactoryPostProcessors(beanFactory);
            //注册后置处理器
            registerBeanPostProcessors(beanFactory); 

            initMessageSource();

            initApplicationEventMulticaster();

            onRefresh();

            registerListeners();
            //创建所有的 singleton beans
            finishBeanFactoryInitialization(beanFactory);

            finishRefresh();
        }
    }

接下来开始分析refresh方法里的各个方法。

prepareRefresh

AbstractApplicationContext.prepareRefresh:该方法主要是做准备工作,记录下容器的启动时间、标记“已启动”状态、处理配置文件中的占位符、校验xml文件格式。代码略。

obtainFreshBeanFactory

AbstractApplicationContext.obtainFreshBeanFactory:这步完成后,配置文件就会解析成一个个 Bean 定义,注册到 BeanFactory 中,当然,这里说的 Bean 还没有初始化,只是配置信息都提取出来了,注册也只是将这些信息都保存到了注册中心(说到底核心是一个 beanName-> beanDefinition 的map)

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
        // 关闭旧的 BeanFactory (如果有),创建新的 BeanFactory,加载 Bean 定义、注册 Bean 等等
        refreshBeanFactory();
        // 返回刚刚创建的 BeanFactory
        ConfigurableListableBeanFactory beanFactory = getBeanFactory();
        return beanFactory;
    }
@Override
    protected final void refreshBeanFactory() throws BeansException {
        /***
         * 如果 ApplicationContext 中已经加载过 BeanFactory 了,销毁所有 Bean,关闭 BeanFactory,
         * 注意,应用中 BeanFactory 本来就是可以多个的,这里可不是说应用全局是否有 BeanFactory,而是当前
         * ApplicationContext 是否有 BeanFactory
         */
        if (hasBeanFactory()) {
            destroyBeans();
            closeBeanFactory();
        }
        try {
            // 初始化一个 DefaultListableBeanFactory。
            DefaultListableBeanFactory beanFactory = createBeanFactory();
            beanFactory.setSerializationId(getId());
            // 设置 BeanFactory 的两个配置属性:是否允许 Bean 覆盖、是否允许循环引用
            customizeBeanFactory(beanFactory);
            // 加载 Bean 到 BeanFactory 中
            loadBeanDefinitions(beanFactory);
            synchronized (this.beanFactoryMonitor) {
                this.beanFactory = beanFactory;
            }
        }
        catch (IOException ex) {
            throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
        }
    }
 protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
//这两个值默认是null,也就是默认是不允许覆盖、不允许循环依赖。
//但是默认不允许覆盖指的是一个配置文件,如果多个文件发生重名,则默认是覆盖的
        if (this.allowBeanDefinitionOverriding != null) {
            // 是否允许 Bean 定义覆盖
            beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
        }
        if (this.allowCircularReferences != null) {
            // 是否允许 Bean 间的循环依赖
            beanFactory.setAllowCircularReferences(this.allowCircularReferences);
        }
    }

接下来开始加载bean到beanFactory中。

@Override
    protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
        // 给这个 BeanFactory 实例化一个 XmlBeanDefinitionReader,负责读取xml配置文件
        XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);

        beanDefinitionReader.setEnvironment(this.getEnvironment());
        beanDefinitionReader.setResourceLoader(this);
        beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
        initBeanDefinitionReader(beanDefinitionReader);
        loadBeanDefinitions(beanDefinitionReader);//入口
    }

读取配置文件,解析配置文件,转换成DOM树,代码略。

到现在xml文件已经成document了,接下来是解析document

  protected void doRegisterBeanDefinitions(Element root) {
        //解析doc的帮助类
        BeanDefinitionParserDelegate parent = this.delegate;
        this.delegate = createDelegate(getReaderContext(), root, parent);

        if (this.delegate.isDefaultNamespace(root)) {
            //profile属性处理
            String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE);
            if (StringUtils.hasText(profileSpec)) {
                String[] specifiedProfiles = StringUtils.tokenizeToStringArray(
                        profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS);
                if (!getReaderContext().getEnvironment().acceptsProfiles(specifiedProfiles)) {
                    if (logger.isInfoEnabled()) {
                        logger.info("Skipped XML bean definition file due to specified profiles [" + profileSpec +
                                "] not matching: " + getReaderContext().getResource());
                    }
                    return;
                }
            }
        }

        preProcessXml(root);
        parseBeanDefinitions(root, this.delegate);//入口
        postProcessXml(root);

        this.delegate = parent;
    }

DefaultBeanDefinitionDocumentReader.parseBeanDefinitions:

 protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
        if (delegate.isDefaultNamespace(root)) {
            NodeList nl = root.getChildNodes();
            for (int i = 0; i < nl.getLength(); i++) {//循环解析所有标签
                Node node = nl.item(i);
                if (node instanceof Element) {
                    Element ele = (Element) node;
                    if (delegate.isDefaultNamespace(ele)) {
                        parseDefaultElement(ele, delegate);//默认标签
                    }
                    else {
                        delegate.parseCustomElement(ele);//自定义标签
                    }
                }
            }
        }
        else {
            delegate.parseCustomElement(root);
        }
    }

默认标签解析

private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
        if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {//improt标签
            importBeanDefinitionResource(ele);
        }
        else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {//alias
            processAliasRegistration(ele);
        }
        else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {//bean
            processBeanDefinition(ele, delegate);
        }
        else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) {//beans
            doRegisterBeanDefinitions(ele);
        }
    }

这四种标签挑一个最重要的来分析:bean

protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
        // 将bean的信息封装到BeanDefinitionHolder中
        BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);//入口


        if (bdHolder != null) {
            bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
            try {
                BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
            }
            catch (BeanDefinitionStoreException ex) {
                getReaderContext().error("Failed to register bean definition with name ‘" +
                        bdHolder.getBeanName() + "‘", ele, ex);
            }
            getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
        }
    }
public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, BeanDefinition containingBean) {
        String id = ele.getAttribute(ID_ATTRIBUTE);
        String nameAttr = ele.getAttribute(NAME_ATTRIBUTE);

        List<String> aliases = new ArrayList<String>();

        // 将 name 属性的定义按照 ”逗号、分号、空格“ 切分,形成一个别名列表数组,
        if (StringUtils.hasLength(nameAttr)) {
            String[] nameArr = StringUtils.tokenizeToStringArray(nameAttr, MULTI_VALUE_ATTRIBUTE_DELIMITERS);
            aliases.addAll(Arrays.asList(nameArr));
        }

        String beanName = id;
        // 如果没有指定id, 那么用别名列表的第一个名字作为beanName
        if (!StringUtils.hasText(beanName) && !aliases.isEmpty()) {
            beanName = aliases.remove(0);
        }

        // 根据 <bean ...>...</bean> 中的配置创建 BeanDefinition,然后把配置中的信息都设置到实例中,
        AbstractBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName, containingBean);//入口

        if (beanDefinition != null) {
            String[] aliasesArray = StringUtils.toStringArray(aliases);
            // 返回 BeanDefinitionHolder
            return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray);
        }

        return null;
    }
 public AbstractBeanDefinition parseBeanDefinitionElement(
            Element ele, String beanName, BeanDefinition containingBean) {

        // 创建 BeanDefinition,然后设置类信息而已,很简单,就不贴代码了
        AbstractBeanDefinition bd = createBeanDefinition(className, parent);

        // 设置 BeanDefinition 的一堆属性,这些属性定义在 AbstractBeanDefinition 中
        parseBeanDefinitionAttributes(ele, beanName, containingBean, bd);
        bd.setDescription(DomUtils.getChildElementValueByTagName(ele, DESCRIPTION_ELEMENT));

        /**
         * 下面的一堆是解析 <bean>......</bean> 内部的子元素,
         * 解析出来以后的信息都放到 bd 的属性中
         */

        // 解析 <meta />
        parseMetaElements(ele, bd);
        // 解析 <lookup-method />
        parseLookupOverrideSubElements(ele, bd.getMethodOverrides());
        // 解析 <replaced-method />
        parseReplacedMethodSubElements(ele, bd.getMethodOverrides());
        // 解析 <constructor-arg />
        parseConstructorArgElements(ele, bd);
        // 解析 <property />
        parsePropertyElements(ele, bd);
        // 解析 <qualifier />
        parseQualifierElements(ele, bd);

        bd.setResource(this.readerContext.getResource());
        bd.setSource(extractSource(ele));

        return bd;

    }

到此 bean的信息都已经封装到beanDifinationHolder中了,接下来就是将beanDifinationHolder注册到BeanDefinition,然后广播出去。

那么是如何注册、广播的呢?回到上面processBeanDefinition方法:

protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
        // 将bean的信息封装到BeanDefinitionHolder中
        BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);//入口


        if (bdHolder != null) {
            bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
            try {
                BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());//注册
            }
            catch (BeanDefinitionStoreException ex) {
                getReaderContext().error("Failed to register bean definition with name ‘" +
                        bdHolder.getBeanName() + "‘", ele, ex);
            }
            getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
        }
    }

注册方法:

 public static void registerBeanDefinition(
            BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)
            throws BeanDefinitionStoreException {

        String beanName = definitionHolder.getBeanName();
        // 注册这个 Bean
        registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());//入口

        // 如果还有别名的话,也要根据别名统统注册一遍
        String[] aliases = definitionHolder.getAliases();
        if (aliases != null) {
            for (String alias : aliases) {
                // alias -> beanName 保存它们的别名信息,这个很简单,用一个 map 保存一下就可以了,
                // 获取的时候,会先将 alias 转换为 beanName,然后再查找
                registry.registerAlias(beanName, alias);
            }
        }
    }
@Override
    public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
            throws BeanDefinitionStoreException {

        // old? 还记得 “允许 bean 覆盖” 这个配置吗?allowBeanDefinitionOverriding
        BeanDefinition oldBeanDefinition;

        // 之后会看到,所有的 Bean 注册后会放入这个 beanDefinitionMap 中
        oldBeanDefinition = this.beanDefinitionMap.get(beanName);

        // 处理重复名称的 Bean 定义的情况
        if (oldBeanDefinition != null) {
            if (!isAllowBeanDefinitionOverriding()) {
                // 如果不允许覆盖的话,抛异常
                throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription()...
            }
            else if (oldBeanDefinition.getRole() < beanDefinition.getRole()) {
                // log...用框架定义的 Bean 覆盖用户自定义的 Bean
            }
            else if (!beanDefinition.equals(oldBeanDefinition)) {
                // log...用新的 Bean 覆盖旧的 Bean
            }
            else {
                // log...用同等的 Bean 覆盖旧的 Bean,这里指的是 equals 方法返回 true 的 Bean
            }
            // 覆盖
            this.beanDefinitionMap.put(beanName, beanDefinition);
        }
        else {
            // 判断是否已经有其他的 Bean 开始初始化了.
            // 注意,"注册Bean" 这个动作结束,Bean 依然还没有初始化,我们后面会有大篇幅说初始化过程,
            // 在 Spring 容器启动的最后,会 预初始化 所有的 singleton beans
            if (hasBeanCreationStarted()) {
                // Cannot modify startup-time collection elements anymore (for stable iteration)
                synchronized (this.beanDefinitionMap) {
                    this.beanDefinitionMap.put(beanName, beanDefinition);
                    List<String> updatedDefinitions = new ArrayList<String>(this.beanDefinitionNames.size() + 1);
                    updatedDefinitions.addAll(this.beanDefinitionNames);
                    updatedDefinitions.add(beanName);
                    this.beanDefinitionNames = updatedDefinitions;
                    if (this.manualSingletonNames.contains(beanName)) {
                        Set<String> updatedSingletons = new LinkedHashSet<String>(this.manualSingletonNames);
                        updatedSingletons.remove(beanName);
                        this.manualSingletonNames = updatedSingletons;
                    }
                }
            }
            else {
                // 最正常的应该是进到这里。

                // 将 BeanDefinition 放到这个 map 中,这个 map 保存了所有的 BeanDefinition
                this.beanDefinitionMap.put(beanName, beanDefinition);
                // 这是个 ArrayList,所以会按照 bean 配置的顺序保存每一个注册的 Bean 的名字
                this.beanDefinitionNames.add(beanName);
                // 这是个 LinkedHashSet,代表的是手动注册的 singleton bean,
                // 注意这里是 remove 方法,到这里的 Bean 当然不是手动注册的
                // 手动指的是通过调用以下方法注册的 bean :
                //     registerSingleton(String beanName, Object singletonObject)
                //         这不是重点,解释只是为了不让大家疑惑。Spring 会在后面"手动"注册一些 Bean,如 "environment"、"systemProperties" 等 bean
                this.manualSingletonNames.remove(beanName);
            }
            // 这个不重要,在预初始化的时候会用到,不必管它。
            this.frozenBeanDefinitionNames = null;
        }

        if (oldBeanDefinition != null || containsSingleton(beanName)) {
            resetBeanDefinition(beanName);
        }
    }

prepareBeanFactory

设置 BeanFactory 的类加载器,添加几个 BeanPostProcessor,手动注册几个特殊的 bean

  protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        // 设置 BeanFactory 的类加载器,我们知道 BeanFactory 需要加载类,也就需要类加载器,
        // 这里设置为加载当前 ApplicationContext 类的类加载器
        beanFactory.setBeanClassLoader(getClassLoader());

        // 设置 BeanExpressionResolver
        beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
        beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

        // 添加一个 BeanPostProcessor,这个 processor 比较简单:
        // 实现了 Aware 接口的 beans 在初始化的时候,这个 processor 负责回调,
        // 这个我们很常用,如我们会为了获取 ApplicationContext 而 implement ApplicationContextAware
        // 注意:它不仅仅回调 ApplicationContextAware,
        //   还会负责回调 EnvironmentAware、ResourceLoaderAware 等,看下源码就清楚了
        beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));

        // 下面几行的意思就是,如果某个 bean 依赖于以下几个接口的实现类,在自动装配的时候忽略它们,
        // Spring 会通过其他方式来处理这些依赖。
        beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
        beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
        beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
        beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
        beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
        beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);

        /**
         * 下面几行就是为特殊的几个 bean 赋值,如果有 bean 依赖了以下几个,会注入这边相应的值,
         * 之前我们说过,"当前 ApplicationContext 持有一个 BeanFactory",这里解释了第一行。
         * ApplicationContext 还继承了 ResourceLoader、ApplicationEventPublisher、MessageSource
         * 所以对于这几个依赖,可以赋值为 this,注意 this 是一个 ApplicationContext
         * 那这里怎么没看到为 MessageSource 赋值呢?那是因为 MessageSource 被注册成为了一个普通的 bean
         */
        beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
        beanFactory.registerResolvableDependency(ResourceLoader.class, this);
        beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
        beanFactory.registerResolvableDependency(ApplicationContext.class, this);

        // 这个 BeanPostProcessor 也很简单,在 bean 实例化后,如果是 ApplicationListener 的子类,
        // 那么将其添加到 listener 列表中,可以理解成:注册 事件监听器
        beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

        // 这里涉及到特殊的 bean,名为:loadTimeWeaver,这不是我们的重点,忽略它
        // tips: ltw 是 AspectJ 的概念,指的是在运行期进行织入,这个和 Spring AOP 不一样,
        //    感兴趣的读者请参考我写的关于 AspectJ 的另一篇文章 https://www.javadoop.com/post/aspectj
        if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
            beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
            // Set a temporary ClassLoader for type matching.
            beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
        }

        /**
         * 从下面几行代码我们可以知道,Spring 往往很 "智能" 就是因为它会帮我们默认注册一些有用的 bean,
         * 我们也可以选择覆盖
         */

        // 如果没有定义 "environment" 这个 bean,那么 Spring 会 "手动" 注册一个
        if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
            beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
        }
        // 如果没有定义 "systemProperties" 这个 bean,那么 Spring 会 "手动" 注册一个
        if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
            beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
        }
        // 如果没有定义 "systemEnvironment" 这个 bean,那么 Spring 会 "手动" 注册一个
        if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
            beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
        }
    }

finishBeanFactoryInitialization

初始化所有的 singleton beans,上面初始化的beanDifination只是加载了配置文件封装到beanDifination中,这个方法负责真正的实例化bean。

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {

        // 初始化名字为 conversionService 的 Bean。
        if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
                beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
            beanFactory.setConversionService(
                    beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
        }

        // 开始初始化
        beanFactory.preInstantiateSingletons();//入口
    }
@Override
    public void preInstantiateSingletons() throws BeansException {
        // this.beanDefinitionNames 保存了所有的 beanNames
        List<String> beanNames = new ArrayList<String>(this.beanDefinitionNames);

        // 下面这个循环,触发所有的非懒加载的 singleton beans 的初始化操作
        for (String beanName : beanNames) {
            RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);

            // 非抽象、非懒加载的 singletons。如果配置了 ‘abstract = true‘,那是不需要初始化的
            if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
                // 处理 FactoryBean(读者如果不熟悉 FactoryBean,请移步附录区了解)
                if (isFactoryBean(beanName)) {
                    // FactoryBean 的话,在 beanName 前面加上 ‘&’ 符号。再调用 getBean
                    final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);
                    getBean(beanName);//入口
                }
                else {
                    // 对于普通的 Bean,只要调用 getBean(beanName) 这个方法就可以进行初始化了
                    getBean(beanName);//入口
                }
            }
        }
    }

接下来到getBean方法了:从容器中获取bean,有就直接获取,没有就创建bean在获取。
先总结以下接下来要调用的各种方法路径:
getBean -- doGetBean -- createBean -- doCreateBean。
然后在doCreateBean发起了三个方法的调用:
1、createBeanInstance:实例化bean
2、populateBean :给bean设置值(包括依赖注入的bean)
3、initializeBean:各种回调

getBean :

@Override
    public Object getBean(String name) throws BeansException {
        return doGetBean(name, null, null, false);
    }

doGetBean:

@SuppressWarnings("unchecked")
    protected <T> T doGetBean(
            final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)
            throws BeansException {
        // 获取一个 “正统的” beanName,处理两种情况,一个是前面说的 FactoryBean(前面带 ‘&’),
        // 一个是别名问题,因为这个方法是 getBean,获取 Bean 用的,你要是传一个别名进来,是完全可以的
        final String beanName = transformedBeanName(name);

        // 注意跟着这个,这个是返回值
        Object bean;

        // 从三级缓存中获取bean实例
        Object sharedInstance = getSingleton(beanName);

        if (sharedInstance != null && args == null) {//已经创建过该bean了
            // 下面这个方法:如果是普通 Bean 的话,直接返回 sharedInstance,
            // 如果是 FactoryBean 的话,返回它创建的那个实例对象
            bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
        }

        else {//没创建过该bean

            /*
             * 稍稍总结一下:
             * 到这里的话,要准备创建 Bean 了,对于 singleton 的 Bean 来说,容器中还没创建过此 Bean;
             * 对于 prototype 的 Bean 来说,本来就是要创建一个新的 Bean。
             */
            try {
                final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
                checkMergedBeanDefinition(mbd, beanName, args);

                // 先初始化依赖的所有 Bean,这个很好理解。
                // 注意,这里的依赖指的是 depends-on 中定义的依赖
                String[] dependsOn = mbd.getDependsOn();
                if (dependsOn != null) {
                    for (String dep : dependsOn) {
                        // 检查是不是有循环依赖,这里的循环依赖和我们前面说的循环依赖又不一样,这里肯定是不允许出现的,不然要乱套了,读者想一下就知道了
                        if (isDependent(beanName, dep)) {
                            throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                                    "Circular depends-on relationship between ‘" + beanName + "‘ and ‘" + dep + "‘");
                        }
                        // 注册一下依赖关系
                        registerDependentBean(dep, beanName);
                        // 先初始化被依赖项
                        getBean(dep);
                    }
                }

                // 如果是 singleton scope 的,创建 singleton 的实例
                if (mbd.isSingleton()) {
                    sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
                        @Override
                        public Object getObject() throws BeansException {
                            try {
                                // 执行创建 Bean,详情后面再说
                                return createBean(beanName, mbd, args);//入口
                            }
                            catch (BeansException ex) {
                                destroySingleton(beanName);
                                throw ex;
                            }
                        }
                    });
                    bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
                }

                // 如果是 prototype scope 的,创建 prototype 的实例
                else if (mbd.isPrototype()) {
                    // It‘s a prototype -> create a new instance.
                    Object prototypeInstance = null;
                    try {
                        beforePrototypeCreation(beanName);
                        // 执行创建 Bean
                        prototypeInstance = createBean(beanName, mbd, args);//入口
                    }
                    finally {
                        afterPrototypeCreation(beanName);
                    }
                    bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
                }

                // 如果不是 singleton 和 prototype 的话,需要委托给相应的实现类来处理
                else {
                    String scopeName = mbd.getScope();
                    final Scope scope = this.scopes.get(scopeName);
                    if (scope == null) {
                        throw new IllegalStateException("No Scope registered for scope name ‘" + scopeName + "‘");
                    }
                    try {
                        Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() {
                            @Override
                            public Object getObject() throws BeansException {
                                beforePrototypeCreation(beanName);
                                try {
                                    // 执行创建 Bean
                                    return createBean(beanName, mbd, args);//入口
                                }
                                finally {
                                    afterPrototypeCreation(beanName);
                                }
                            }
                        });
                        bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
                    }
                    catch (IllegalStateException ex) {
                        throw new BeanCreationException(beanName,
                                "Scope ‘" + scopeName + "‘ is not active for the current thread; consider " +
                                        "defining a scoped proxy for this bean if you intend to refer to it from a singleton",
                                ex);
                    }
                }
            }
            catch (BeansException ex) {
                cleanupAfterBeanCreationFailure(beanName);
                throw ex;
            }
        }

        // 最后,检查一下类型对不对,不对的话就抛异常,对的话就返回了
        if (requiredType != null && bean != null && !requiredType.isInstance(bean)) {
            try {
                return getTypeConverter().convertIfNecessary(bean, requiredType);
            }
            catch (TypeMismatchException ex) {
                if (logger.isDebugEnabled()) {
                    logger.debug("Failed to convert bean ‘" + name + "‘ to required type ‘" +
                            ClassUtils.getQualifiedName(requiredType) + "‘", ex);
                }
                throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
            }
        }
        return (T) bean;
    }

从三级缓存中获取实例:

//DefaultSingletonBeanRegistry#getSingleton
    protected Object getSingleton(String beanName, boolean allowEarlyReference) {
        //singletonObjects 第一级缓存,BeanFactory的单例全存在singletonObjects中
        //保存的是已经初始化完全的单例
        Object singletonObject = this.singletonObjects.get(beanName);
        //isSingletonCurrentlyInCreation=true,代表beanName所代表的bean循环依赖了
        if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
            synchronized (this.singletonObjects) {
                //第二级缓存,保存的是未初始化完全的单例(只是实例化)
                singletonObject = this.earlySingletonObjects.get(beanName);
                //allowEarlyReference在当前场景下,默认为true
                if (singletonObject == null && allowEarlyReference) {
                    //第三级缓存,不是真的缓存,缓存的是生成二级缓存的工厂方法
                    ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
                    if (singletonFactory != null) {
                        //通过三级缓存构造二级缓存
                        singletonObject = singletonFactory.getObject();
                        this.earlySingletonObjects.put(beanName, singletonObject);
                        this.singletonFactories.remove(beanName);
                    }
                }
            }
        }
        return (singletonObject != NULL_OBJECT ? singletonObject : null);
    }

createBean:

@Override
    protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
        RootBeanDefinition mbdToUse = mbd;

        // 准备方法覆写,这里又涉及到一个概念:MethodOverrides,它来自于 bean 定义中的 <lookup-method />
        // 和 <replaced-method />,如果读者感兴趣,回到 bean 解析的地方看看对这两个标签的解析。
        try {
            mbdToUse.prepareMethodOverrides();
        }
        catch (BeanDefinitionValidationException ex) {
            throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
                    beanName, "Validation of method overrides failed", ex);
        }

        try {
            // 让 InstantiationAwareBeanPostProcessor 在这一步有机会返回代理
            Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
            if (bean != null) {
                return bean;
            }
        }
        catch (Throwable ex) {
            throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
                    "BeanPostProcessor before instantiation of bean failed", ex);
        }

        // 重头戏,创建 bean
        Object beanInstance = doCreateBean(beanName, mbdToUse, args);//入口
        if (logger.isDebugEnabled()) {
            logger.debug("Finished creating instance of bean ‘" + beanName + "‘");
        }
        return beanInstance;
    }

doCreateBean:

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
            throws BeanCreationException {

        BeanWrapper instanceWrapper = null;
        if (mbd.isSingleton()) {
            instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
        }
        if (instanceWrapper == null) {
            // 实例化 Bean
            instanceWrapper = createBeanInstance(beanName, mbd, args);//入口1
        }

        // 这个就是 Bean 里面的 我们定义的类 的实例,很多地方我直接描述成 "bean 实例"
        final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null);
        // 类型
        Class<?> beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null);
        mbd.resolvedTargetType = beanType;


        // 下面这块代码是为了解决循环依赖的问题 ,添加三级缓存
        boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
                isSingletonCurrentlyInCreation(beanName));
        if (earlySingletonExposure) {
            addSingletonFactory(beanName, new ObjectFactory<Object>() {
                @Override
                public Object getObject() throws BeansException {
                    return getEarlyBeanReference(beanName, mbd, bean);
                }
            });
        }

        Object exposedObject = bean;
        // 这一步也是非常关键的,这一步负责属性装配,因为前面的实例只是实例化了,并没有设值,这里就是设值
        populateBean(beanName, mbd, instanceWrapper);//入口2
        if (exposedObject != null) {
            // 还记得 init-method 吗?还有 InitializingBean 接口?还有 BeanPostProcessor 接口?
            // 这里就是处理 bean 初始化完成后的各种回调
            exposedObject = initializeBean(beanName, exposedObject, mbd);
        }

        return exposedObject;
    }

createBeanInstance:

protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {

        if (mbd.getFactoryMethodName() != null)  {
            // 采用工厂方法实例化
            return instantiateUsingFactoryMethod(beanName, mbd, args);
        }

        // 如果不是第一次创建,比如第二次创建 prototype bean。
        // 这种情况下,我们可以从第一次创建知道,采用无参构造函数,还是构造函数依赖注入 来完成实例化
        boolean resolved = false;
        boolean autowireNecessary = false;
        if (args == null) {
            synchronized (mbd.constructorArgumentLock) {
                if (mbd.resolvedConstructorOrFactoryMethod != null) {
                    resolved = true;
                    autowireNecessary = mbd.constructorArgumentsResolved;
                }
            }
        }
        if (resolved) {
            if (autowireNecessary) {
                // 构造函数依赖注入
                return autowireConstructor(beanName, mbd, null, null);
            }
            else {
                // 无参构造函数
                return instantiateBean(beanName, mbd);
            }
        }

        // 判断是否采用有参构造函数
        Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
        if (ctors != null ||
                mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||
                mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args))  {
            // 构造函数依赖注入
            return autowireConstructor(beanName, mbd, ctors, args);
        }

        // 调用无参构造函数
        return instantiateBean(beanName, mbd);//入口
    }

挑个简单的无参构造函数构造实例来看看:

 protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {
        try {
            Object beanInstance;
            final BeanFactory parent = this;
            if (System.getSecurityManager() != null) {
                beanInstance = AccessController.doPrivileged(new PrivilegedAction<Object>() {
                    @Override
                    public Object run() {

                        return getInstantiationStrategy().instantiate(mbd, beanName, parent);
                    }
                }, getAccessControlContext());
            }
            else {
                // 实例化
                beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);//入口
            }
            // 包装一下,返回
            BeanWrapper bw = new BeanWrapperImpl(beanInstance);
            initBeanWrapper(bw);
            return bw;
        }
        catch (Throwable ex) {
            throw new BeanCreationException(
                    mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex);
        }
    }
 @Override
    public Object instantiate(RootBeanDefinition bd, String beanName, BeanFactory owner) {

        // 如果不存在方法覆写,那就使用 java 反射进行实例化,否则使用 CGLIB,
        // 方法覆写 请参见 lookup-method 和 replaced-method
        if (bd.getMethodOverrides().isEmpty()) {
            Constructor<?> constructorToUse;
            synchronized (bd.constructorArgumentLock) {
                constructorToUse = (Constructor<?>) bd.resolvedConstructorOrFactoryMethod;
                if (constructorToUse == null) {
                    final Class<?> clazz = bd.getBeanClass();
                    if (clazz.isInterface()) {
                        throw new BeanInstantiationException(clazz, "Specified class is an interface");
                    }
                    try {
                        if (System.getSecurityManager() != null) {
                            constructorToUse = AccessController.doPrivileged(new PrivilegedExceptionAction<Constructor<?>>() {
                                @Override
                                public Constructor<?> run() throws Exception {
                                    return clazz.getDeclaredConstructor((Class[]) null);
                                }
                            });
                        }
                        else {
                            constructorToUse = clazz.getDeclaredConstructor((Class[]) null);
                        }
                        bd.resolvedConstructorOrFactoryMethod = constructorToUse;
                    }
                    catch (Throwable ex) {
                        throw new BeanInstantiationException(clazz, "No default constructor found", ex);
                    }
                }
            }
            // 利用构造方法进行实例化
            return BeanUtils.instantiateClass(constructorToUse);
        }
        else {
            // 存在方法覆写,利用 CGLIB 来完成实例化,需要依赖于 CGLIB 生成子类,这里就不展开了。
            // tips: 因为如果不使用 CGLIB 的话,存在 override 的情况 JDK 并没有提供相应的实例化支持
            return instantiateWithMethodInjection(bd, beanName, owner);
        }
    }

到这里,我们就算实例化完成了。我们开始说怎么进行属性注入。
populateBean:

protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
        // pvs是一个MutablePropertyValues实例,里面实现了PropertyValues接口,提供属性的读写操作实现,同时可以通过调用构造函数实现深拷贝
        // 在本例中,里面存在一个propertyValueList,里面只有一个propertyValue:key->value="student"->RuntimeBeanReference("<student>")
        // bean 实例的所有属性都在这里了
        PropertyValues pvs = mbd.getPropertyValues();

        if (bw == null) {
            if (!pvs.isEmpty()) {
                throw new BeanCreationException(
                        mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
            }
            else {
                // 空对象直接返回
                return;
            }
        }

        // 给InstantiationAwareBeanPostProcessors最后一次机会在属性注入前修改Bean的属性值
        // 具体通过调用postProcessAfterInstantiation方法,如果调用返回false,表示不必继续进行依赖注入,直接返回
        // (InstantiationAwareBeanPostProcessor 的实现类可以在这里对 bean 进行状态修改)
        boolean continueWithPropertyPopulation = true;
        if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
            for (BeanPostProcessor bp : getBeanPostProcessors()) {
                if (bp instanceof InstantiationAwareBeanPostProcessor) {
                    InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                    // 如果返回 false,代表不需要进行后续的属性设值,也不需要再经过其他的 BeanPostProcessor 的处理
                    if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                        continueWithPropertyPopulation = false;
                        break;
                    }
                }
            }
        }

        if (!continueWithPropertyPopulation) {
            return;
        }

        // 根据Bean配置的依赖注入方式完成注入,默认是0,即不走以下逻辑,所有的依赖注入都需要在xml文件中有显式的配置
        // 如果设置了相关的依赖装配方式,会遍历Bean中的属性,根据类型或名称来完成相应注入,无需额外配置
        if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||
                mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
            // 深拷贝当前已有的配置
            MutablePropertyValues newPvs = new MutablePropertyValues(pvs);

            // 根据名称进行注入
            if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {
                autowireByName(beanName, mbd, bw, newPvs);//入口1
            }

            // // 根据类型进行注入
            if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
                autowireByType(beanName, mbd, bw, newPvs);//入口2
            }
            // 结合注入后的配置,覆盖当前配置
            pvs = newPvs;
        }

        // 容器是否注册了InstantiationAwareBeanPostProcessor
        boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
        // 是否进行依赖检查
        boolean needsDepCheck = (mbd.getDependencyCheck() != RootBeanDefinition.DEPENDENCY_CHECK_NONE);

        if (hasInstAwareBpps || needsDepCheck) {
            // 过滤出所有需要进行依赖检查的属性编辑器
            PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
            if (hasInstAwareBpps) {
                for (BeanPostProcessor bp : getBeanPostProcessors()) {
                    // 如果有相关的后置处理器,进行后置处理
                    if (bp instanceof InstantiationAwareBeanPostProcessor) {
                        InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                        // 这里有个非常有用的 BeanPostProcessor 进到这里: AutowiredAnnotationBeanPostProcessor
                        // 对采用 @Autowired、@Value 注解的依赖进行设值
                        pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
                        if (pvs == null) {
                            return;
                        }
                    }
                }
            }
            if (needsDepCheck) {
                // 检查是否满足相关依赖关系,对应的depends-on属性,需要确保所有依赖的Bean先完成初始化
                checkDependencies(beanName, mbd, filteredPds, pvs);
            }
        }
        // 将pvs上所有的属性填充到BeanWrapper对应的Bean实例中
        applyPropertyValues(beanName, mbd, bw, pvs);//入口3
    }
protected void autowireByName(
            String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {
        // 根据bw的PropertyDescriptors,遍历出所有可写的(即set方法存在),存在于BeanDefinition里的PropertyValues,且不是简单属性的属性名
        // 简单属性的判定参照下面方法,主要涵盖基本类型及其包装类,Number,Date等
        String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
        for (String propertyName : propertyNames) {
            if (containsBean(propertyName)) {
                // 递归初始化相关Bean(依赖的bean在这里通过getBean进行实例化),这也是解决循环依赖的一个地方
                Object bean = getBean(propertyName);
                // 根据名称添加到pvs中
                pvs.add(propertyName, bean);
                // 注册依赖关系
                registerDependentBean(propertyName, beanName);
                if (logger.isDebugEnabled()) {
                    logger.debug("Added autowiring by name from bean name ‘" + beanName +
                            "‘ via property ‘" + propertyName + "‘ to bean named ‘" + propertyName + "‘");
                }
            }
            else {
                if (logger.isTraceEnabled()) {
                    logger.trace("Not autowiring property ‘" + propertyName + "‘ of bean ‘" + beanName +
                            "‘ by name: no matching bean found");
                }
            }
        }
    }

    // 简单类型判定
    public static boolean isSimpleValueType(Class<?> clazz) {
        return ClassUtils.isPrimitiveOrWrapper(clazz) || clazz.isEnum() ||
                CharSequence.class.isAssignableFrom(clazz) ||
                Number.class.isAssignableFrom(clazz) ||
                Date.class.isAssignableFrom(clazz) ||
                clazz.equals(URI.class) || clazz.equals(URL.class) ||
                clazz.equals(Locale.class) || clazz.equals(Class.class);
    }


    protected void autowireByType(
            String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {
        // 获取类型转换器
        TypeConverter converter = getCustomTypeConverter();
        if (converter == null) {
            converter = bw;
        }

        Set<String> autowiredBeanNames = new LinkedHashSet<String>(4);
        // 类似的,过滤出满足装配条件的Bean属性
        String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
        for (String propertyName : propertyNames) {
            try {
                如果是Object类型不进行装配
                if (!Object.class.equals(pd.getPropertyType())) {
                    // 获取相关的写方法参数
                    MethodParameter methodParam = BeanUtils.getWriteMethodParameter(pd);
                    // 定义是否允许懒加载。
                    boolean eager = !PriorityOrdered.class.isAssignableFrom(bw.getWrappedClass());
                    //
                    DependencyDescriptor desc = new AutowireByTypeDependencyDescriptor(methodParam, eager);
                    // 这里会根据传入desc里的入参类型,作为依赖装配的类型
                    // 再根据这个类型在BeanFacoty中查找所有类或其父类相同的BeanName
                    // 最后根据BeanName获取或初始化相应的类,然后将所有满足条件的BeanName填充到autowiredBeanNames中。
                    Object autowiredArgument = resolveDependency(desc, beanName, autowiredBeanNames, converter);
                    if (autowiredArgument != null) {
                        pvs.add(propertyName, autowiredArgument);
                    }
                    for (String autowiredBeanName : autowiredBeanNames) {
                        // 注册依赖
                        registerDependentBean(autowiredBeanName, beanName);
                        if (logger.isDebugEnabled()) {
                            logger.debug("Autowiring by type from bean name ‘" + beanName + "‘ via property ‘" +
                                    propertyName + "‘ to bean named ‘" + autowiredBeanName + "‘");
                        }
                    }
                    autowiredBeanNames.clear();
                }
            }
            catch (BeansException ex) {
                throw new UnsatisfiedDependencyException(mbd.getResourceDescription(), beanName, propertyName, ex);
            }
        }
    }
protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) {
        // 为空直接返回
        if (pvs == null || pvs.isEmpty()) {
            return;
        }

        MutablePropertyValues mpvs = null;
        List<PropertyValue> original;

        if (System.getSecurityManager() != null) {
            if (bw instanceof BeanWrapperImpl) {
                ((BeanWrapperImpl) bw).setSecurityContext(getAccessControlContext());
            }
        }

        if (pvs instanceof MutablePropertyValues) {
            mpvs = (MutablePropertyValues) pvs;
            if (mpvs.isConverted()) {
                // 如果已被设置转换完成,直接完成配置
                try {
                    bw.setPropertyValues(mpvs);
                    return;
                }
                catch (BeansException ex) {
                    throw new BeanCreationException(
                            mbd.getResourceDescription(), beanName, "Error setting property values", ex);
                }
            }
            original = mpvs.getPropertyValueList();
        }
        else {
            original = Arrays.asList(pvs.getPropertyValues());
        }

        TypeConverter converter = getCustomTypeConverter();
        if (converter == null) {
            converter = bw;
        }
        // 创建BeanDefinitionValueResolver解析器,用来解析未被解析的PropertyValue。
        BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, converter);

        // 开始遍历检查original中的属性,对未被解析的先解析/已解析的直接加入deepCopy中,最后再填充到具体的Bean实例中
        List<PropertyValue> deepCopy = new ArrayList<PropertyValue>(original.size());
        boolean resolveNecessary = false;
        for (PropertyValue pv : original) {
            // 如果属性已经转化,直接添加
            if (pv.isConverted()) {
                deepCopy.add(pv);
            }
            else {
                String propertyName = pv.getName();
                Object originalValue = pv.getValue();
                // 核心逻辑,解析获取实际的值
                // 对于RuntimeReference,会解析拿到具体的beanName,最终通过getBean(beanName)拿到具体的对象
                Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue);
                Object convertedValue = resolvedValue;
                // 判断是否可以转换
                boolean convertible = bw.isWritableProperty(propertyName) &&
                        !PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName);
                if (convertible) {
                    // 尝试进行转换
                    convertedValue = convertForProperty(resolvedValue, propertyName, bw, converter);
                }
                // 避免需要重复转换,设定已转换
                if (resolvedValue == originalValue) {
                    if (convertible) {
                        pv.setConvertedValue(convertedValue);
                    }
                    deepCopy.add(pv);
                }
                else if (convertible && originalValue instanceof TypedStringValue &&
                        !((TypedStringValue) originalValue).isDynamic() &&
                        !(convertedValue instanceof Collection || ObjectUtils.isArray(convertedValue))) {
                    pv.setConvertedValue(convertedValue);
                    deepCopy.add(pv);
                }
                else {
                    resolveNecessary = true;
                    deepCopy.add(new PropertyValue(pv, convertedValue));
                }
            }
        }
        if (mpvs != null && !resolveNecessary) {
            mpvs.setConverted();
        }

        // 完成设置
        try {
            bw.setPropertyValues(new MutablePropertyValues(deepCopy));
        }
        catch (BeansException ex) {
            throw new BeanCreationException(
                    mbd.getResourceDescription(), beanName, "Error setting property values", ex);
        }
    }

接下来是initializeBean方法来处理各种回调:

protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
   if (System.getSecurityManager() != null) {
      AccessController.doPrivileged(new PrivilegedAction<Object>() {
         @Override
         public Object run() {
            invokeAwareMethods(beanName, bean);
            return null;
         }
      }, getAccessControlContext());
   }
   else {
      // 如果 bean 实现了 BeanNameAware、BeanClassLoaderAware 或 BeanFactoryAware 接口,回调
      invokeAwareMethods(beanName, bean);
   }

   Object wrappedBean = bean;
   if (mbd == null || !mbd.isSynthetic()) {
      // BeanPostProcessor 的 postProcessBeforeInitialization 回调
      wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
   }

   try {
      // 处理 bean 中定义的 init-method,
      // 或者如果 bean 实现了 InitializingBean 接口,调用 afterPropertiesSet() 方法
      invokeInitMethods(beanName, wrappedBean, mbd);
   }
   catch (Throwable ex) {
      throw new BeanCreationException(
            (mbd != null ? mbd.getResourceDescription() : null),
            beanName, "Invocation of init method failed", ex);
   }

   if (mbd == null || !mbd.isSynthetic()) {
      // BeanPostProcessor 的 postProcessAfterInitialization 回调
      wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
   }
   return wrappedBean;
}

spring ioc

原文:https://www.cnblogs.com/yanhui007/p/12595491.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!