spring容器启动

1 无论是classpathxml还是annotation,最后都会走到AbsApplicationContext的refresh方法中。

2 到达refresh方法中总流程共有13个方法。

3 为spring上下文创建BeanFactory
3-1 首先会通过obtainFreshBeanFactory方法创建一个BeanFactory,它是spring上下文顶层接口,比如getBean方法都在这个接口中约定的。
obtainFreshBeanFactory方法实际调用的是AbstractRefreshApplicationContext对象的getBeanFactory方法获得的,实际就是new了一个DefaultListableBeanFactory(getInternalParentBeanFactory());

3-2 扫描特殊注解类(@Configuration @CompomentScan @Import等),通过ConfigurationClassPostProcess,来获取注解,并解析bean的范围,去生成beanDefinition。

3-3 通过DefaultListableBeanFactory进行loadBeanDefinitions,来扫描配置文件,或是扫描注解,来进行bean的定义。

4 进行singleton的bean初始化工作
4-1 获取beanDefinitions,会判断是否为FactoryBean,如果是的话,首先会获得&+beanName,并通过beanFactory的getBean方法先进行,实际bean的生产;因为这个bean已经交给了FactoryBean进行创建。

5 bean的初始化核心方法有3个(bean的生命周期)

5-1 首先调用createBeanInstance方法, 在这个方法中spring会去推断构造函数,ps:默认使用无参构造函数,如果有参数,它会获得参数最多,最具体的构造函数,并且按照public优先级最高原则。

****5-1和5-2之间,在这3个方法之前还会将当前对象加入正在创建的集合:singletonsCurrentlyInCreationSet中,并且加入singletonFactories中***

5-2 之后调用populateBean方法,来进行属性注入。

5-3 最后调用initializationBean方法,首先会进行对原始bean对象的最终处理,在这个方法中会调用bean的后置处理器BeanPostProcess,这是BeanFactory的处理器,针对每个bean的初始化都要经过的处理器;

核心方法调用链:

(0)第一步调用invokeAwareMethods方法

if (bean instanceof BeanNameAware) {//传递bean名称
((BeanNameAware) bean).setBeanName(beanName);
}
if (bean instanceof BeanClassLoaderAware) {//传递类加载器
((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
}
if (bean instanceof BeanFactoryAware) {//传递beanFactory
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}

(1)postProcessBeforeInitialization,这里一般不做什么。

(2)在调用init-method(当然是和容器关闭时的destroy方法是同样的)初始化方法,进行初始化赋值。

(3)最后postprocessAfterInitialization方法,这个方法最重要

如果我们bean需要被aop,则spring会在postprocessAfterInitialization阶段进行代理对象的生成

@Override
    public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
            throws BeansException {

        Object result = existingBean;
//下面方法中循环的bean处理器有这几个

        ApplicationContextAwareProcessor
        PostProcessRegistrationDelegate
        AspectJAwareAdvisorAutoProxyCreator//这才是“代理对象生成的后置处理器”。如果有接口用jdk动态代理,如果没有接口或显示指定了使用目标类产生代理则使用cglib代理
        ApplicationListenerDetector

for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
            result = beanProcessor.postProcessAfterInitialization(result, beanName);
            if (result == null) {
                return result;
            }
        }
        return result;
    }

======================================== 

创建bean的几种方式:(1)@Bean注解,(2)@Component,(3)FactoryBean,(4)@Import的三种方式

bean的初始化方式:

(1)通过init-method和destroy-method方法来处理(@Bean注解的bean可以这样使用)

(2)通过注解@PostConstruct和@PreDestroy(@Component这种bean可以这样使用)

(3)也可以通过实现InitializationBean接口重写固定方法进行初始化

原文地址:https://www.cnblogs.com/zzq-include/p/12219507.html