Spring源码分析

AnnotationConfigApplicationContext作为注解型IOC的入口
ClassPathXmlApplicationContext 作为XML IOC的入口

    public AnnotationConfigApplicationContext(Class... componentClasses) {
        this();
        register(componentClasses);
        refresh();
    }

传入一个Class对象
首先this()初始化reader和scanner,创建beanFactory,这个this其实是执行了父类GenericApplicationContext中的初始化方法

    /**
     * Create a new GenericApplicationContext.
     * @see #registerBeanDefinition
     * @see #refresh
     */
    public GenericApplicationContext() {
        this.beanFactory = new DefaultListableBeanFactory();
    }

他初始化了一个beanFactory,beanFactory会记录一些bean信息。
Register(class)通过AnnotatedBeanDefinitionReader去doRegisterBean()。
这里其实是把主类解析成BeanDefinition同时会解析主类上的注解会把配置类信息放进beanDefinitionMap。
refresh()方法,refresh是放在AbstractApplicationContext类中的抽象方法,主要是对beanFactory进行一系列配置刷新。

refresh方法

  1. prepareBeanFactory()为 beanFactory 工厂添加一些单例内置组件,进行预处理
    预埋三级缓存
    protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        beanFactory.addBeanPostProcessor(new ServletContextAwareProcessor(this.servletContext, this.servletConfig));
        beanFactory.ignoreDependencyInterface(ServletContextAware.class);
        beanFactory.ignoreDependencyInterface(ServletConfigAware.class);
        WebApplicationContextUtils.registerWebApplicationScopes(beanFactory, this.servletContext);
        WebApplicationContextUtils.registerEnvironmentBeans(beanFactory, this.servletContext, this.servletConfig);
    }
  1. invokeBeanFactoryPostProcessors() 一个后置方法允许我们按需注入暴露了ConfigurableListableBeanFactory 和BeanDefinitionRegistry 。找出来,排序然后重新注入。主要是对实现后置处理器的方法的一个调用。
    处理一些实现了后置处理器postProcessor的类,然后调用postProcessor.postProcessBeanDefinitionRegistry(registry)
@Component
public class BeanDefinitionRegistryPostProcessorTest implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        System.out.println("A");
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("B");
    }
}

初始化的时候允许自由修改registry与beanFactory

  1. registerBeanPostProcessors() 这一步是向容器中注入实现了 BeanPostProcessor的类。注意是注册而非使用
    public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
        Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
        // Remove from old position, if any
        this.beanPostProcessors.remove(beanPostProcessor);
        // Track whether it is instantiation/destruction aware
        if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) {
            this.hasInstantiationAwareBeanPostProcessors = true;
        }
        if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) {
            this.hasDestructionAwareBeanPostProcessors = true;
        }
        // Add to end of list
        this.beanPostProcessors.add(beanPostProcessor);
    }
  1. initMessageSource() 初始化messageSource,对messageSource bean进行装配,messageSource是国际化文件
  2. initApplicationEventMulticaster()对BeanFactory中的ApplicationEventMulticaster的事件进行监听,通过实现ApplicationEventMulticaster接口来监听事件。如果没有则采用SimpleApplicationEventMulticaster来监听事件。初始化事件监听器,一种观察者模式。
        if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
            this.applicationEventMulticaster =
                    beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
            if (logger.isTraceEnabled()) {
                logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
            }
        }
        else {
            this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
            beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
            if (logger.isTraceEnabled()) {
                logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +
                        "[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");
            }
        }
  1. registerListeners() 找出实现ApplicationListener的类装配进applicationListeners。其实是放到ApplicationEventMulticaster 广播器里。发布事件通知,对应Listener会收到消息进行处理。
  2. finishBeanFactoryInitialization() ,直接看里面调用的beanFactory.preInstantiateSingletons()
    剩下来的这个步骤就是初始化所有剩余的单实例 bean。RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName)获取。下面会根据是不是FactoryBean来选择初始化方式。普通的直接走getBean()就行。transformedBeanName会获得bean的真实名字
        for (String beanName : beanNames) {
            RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
            if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
                if (isFactoryBean(beanName)) {
                    Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
                    if (bean instanceof FactoryBean) {
                        FactoryBean factory = (FactoryBean) bean;
                        boolean isEagerInit;
                        if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
                            isEagerInit = AccessController.doPrivileged(
                                    (PrivilegedAction) ((SmartFactoryBean) factory)::isEagerInit,
                                    getAccessControlContext());
                        }
                        else {
                            isEagerInit = (factory instanceof SmartFactoryBean &&
                                    ((SmartFactoryBean) factory).isEagerInit());
                        }
                        if (isEagerInit) {
                            getBean(beanName);
                        }
                    }
                }
                else {
                    getBean(beanName);
                }
            }
        }

通过getBean()走到dogetBean()。但其实里面最终都会走到getObjectForBeanInstance()。
在getObjectForBeanInstance()方法中会先判断bean是不是FactoryBean,如果不是,就直接返回Bean。

  • 如果是FactoryBean,且name是以&符号开头,那么表示的是获取FactoryBean的原生对象,也会直接返回。如果name不是以&符号开头,那么表示要获取FactoryBean中getObject()方法返回的对象即Bean.class。
  • 接下来会先尝试从缓存中获取,如果缓存中不存在则getObjectFromFactoryBean()然后doGetObjectFromFactoryBean()这样走下去。这是FactoryBean的流程。
        Object sharedInstance = getSingleton(beanName);
        if (sharedInstance != null && args == null) {
            if (logger.isTraceEnabled()) {
                if (isSingletonCurrentlyInCreation(beanName)) {
                    logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
                            "' that is not fully initialized yet - a consequence of a circular reference");
                }
                else {
                    logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
                }
            }
            bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
        }

再说一下dogetBean(),用到三级缓存的地方是getSingleton()方法,
singletonObjects一级缓存:单例对象缓存池,beanName->Bean,其中存储的是完整的Bean
earlySingletonObjects二级缓存早期的单例对象,beanName->ObjectFactory,存储的是实例化后,属性未赋值的单例对象
singletonFactories三级缓存:单例工厂的缓存,beanName->ObjectFactory,添加进去的时候实例未具备属性
一层一层往下找就是了,最后找不到调用singletonFactory.getObject()

                    singletonObject = this.singletonObjects.get(beanName);
                    if (singletonObject == null) {
                        singletonObject = this.earlySingletonObjects.get(beanName);
                        if (singletonObject == null) {
                            ObjectFactory singletonFactory = this.singletonFactories.get(beanName);
                            if (singletonFactory != null) {
                                singletonObject = singletonFactory.getObject();
                                this.earlySingletonObjects.put(beanName, singletonObject);
                                this.singletonFactories.remove(beanName);
                            }
                        }
                    }

  • 尝试从一级缓存中查找完整的Bean实例,找到则直接返回.
  • 如果无法从一级缓存中查找,对一级缓存进行上锁,然后尝试从二级缓存中查找半成品的Bean.找到直接返回.
  • 从三级缓存中查找,找到则放入二级缓存,同时为了保证一个对象实例为单例,将该实例从第三级缓存中进行移除

在这里判断的循环依赖,如果一个beanName可以从单力池里拿到实例,而他还在创建说明这个类循环依赖,就还会走到getObjectForBeanInstance()方法拿到对象。Spring对于循环依赖的处理时不是一个一个去找,而是直接看池子里有没有。

        Object sharedInstance = getSingleton(beanName);
        if (sharedInstance != null && args == null) {
            if (logger.isTraceEnabled()) {
                if (isSingletonCurrentlyInCreation(beanName)) {
                    logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
                            "' that is not fully initialized yet - a consequence of a circular reference");
                }
                else {
                    logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
                }
            }
            bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
        }

如果实在拿不到,就要开始创建了。首先会到ParentBeanFactory中进行递归查找。根据名称和type。对合并后的BeanDefinition进行检测,主要是判断是否为abstract,然后会找到所有依赖的Bean名称,如果循环依赖直接抛异常,然后会递归走getBean。
递归完成后走到getSingleton()走createBean()。真正创建单例Bean前会检测是否正在创建,做点预处理,最后都会走到createBean()。

                // Create bean instance.
                if (mbd.isSingleton()) {
                    sharedInstance = getSingleton(beanName, () -> {
                        try {
                            return createBean(beanName, mbd, args);
                        }
                        catch (BeansException ex) {
                            // Explicitly remove instance from singleton cache: It might have been put there
                            // eagerly by the creation process, to allow for circular reference resolution.
                            // Also remove any beans that received a temporary reference to the bean.
                            destroySingleton(beanName);
                            throw ex;
                        }
                    });
                    bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
                }

进到createBean()。先获取Bean的Class放到BeanDefinition。经过方法重载以及代理对象判断后走到doCreateBean()。
这里会再进一次缓存,如果拿不到BeanWrapper(包装类对象)则调用createBeanInstance()来创建Bean实例,此时获取类的构造方法createBean,即调用autowireConstructor(),最典型的应用就是Autowire打在构造方法上。mbd.getConstructorArgumentValues()可以从BeanDefinition中拿到构造函数信息,通过resolveConstructorArguments()拿到参数。

        // Candidate constructors for autowiring?
        Constructor[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
        if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
                mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
            return autowireConstructor(beanName, mbd, ctors, args);
        }

        // Preferred constructors for default construction?
        ctors = mbd.getPreferredConstructors();
        if (ctors != null) {
            return autowireConstructor(beanName, mbd, ctors, null);
        }

这个时候会把BeanDefinition尽早放进SingletonFactory。然后会进行依赖注入,再看下属性注入,走到populateBean()方法会通过BeanDefinition进行属性判断。这里会选择名称进行注入或者根据类型进行注入。这里最后还是走getBean递归

        if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
            MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
            // Add property values based on autowire by name if applicable.
            if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
                autowireByName(beanName, mbd, bw, newPvs);
            }
            // Add property values based on autowire by type if applicable.
            if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
                autowireByType(beanName, mbd, bw, newPvs);
            }
            pvs = newPvs;
        }

通过名称注入,先通过 unsatisfiedNonSimpleProperties() 找到需要填充的所有属性 name。然后递归getbean加载属性

    protected void autowireByName(
            String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {

        String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
        for (String propertyName : propertyNames) {
            if (containsBean(propertyName)) {
                Object bean = getBean(propertyName);
                pvs.add(propertyName, bean);
                registerDependentBean(propertyName, beanName);
                if (logger.isTraceEnabled()) {
                    logger.trace("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");
                }
            }
        }
    }

类型则是先通过 unsatisfiedNonSimpleProperties() 找到需要填充的所有属性 name,根据传入的参数 pvs 中找出已经加载的 bean,并递归实例化,然后再加入到 pvs 中

            try {
                PropertyDescriptor pd = bw.getPropertyDescriptor(propertyName);
                // Don't try autowiring by type for type Object: never makes sense,
                // even if it technically is a unsatisfied, non-simple property.
                if (Object.class != pd.getPropertyType()) {
                    MethodParameter methodParam = BeanUtils.getWriteMethodParameter(pd);
                    // Do not allow eager init for type matching in case of a prioritized post-processor.
                    boolean eager = !(bw.getWrappedInstance() instanceof PriorityOrdered);
                    DependencyDescriptor desc = new AutowireByTypeDependencyDescriptor(methodParam, eager);
                    Object autowiredArgument = resolveDependency(desc, beanName, autowiredBeanNames, converter);
                    if (autowiredArgument != null) {
                        pvs.add(propertyName, autowiredArgument);
                    }
                    for (String autowiredBeanName : autowiredBeanNames) {
                        registerDependentBean(autowiredBeanName, beanName);
                        if (logger.isTraceEnabled()) {
                            logger.trace("Autowiring by type from bean name '" + beanName + "' via property '" +
                                    propertyName + "' to bean named '" + autowiredBeanName + "'");
                        }
                    }
                    autowiredBeanNames.clear();
                }
            }

你可能感兴趣的:(Spring源码分析)