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接口重写固定方法进行初始化