Spring IOC——源码分析

Spring 容器的 refresh() 创建容器


 1 //下面每一个方法都会单独提出来进行分析
 2 @Override
 3 public void refresh() throws BeansException, IllegalStateException {
 4     synchronized (this.startupShutdownMonitor) {
 5     // 刷新前的预处理
 6     prepareRefresh();
 7         // 获取 Bean工厂,默认的 DefaultListableBeanFactory
 8         ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
 9         // 准备bean工厂以供在此上下文中使用(对刚创建的bean工厂进行设置)
10     prepareBeanFactory(beanFactory);
11     try {
12             // 允许在子类中对bean工厂进行后处理。目前是一个空实现 
13                 //beanFactory 准备工作完成后进行的后置处理工作。
14         postProcessBeanFactory(beanFactory);
15                 // 调用 BeanFactoryPostProcessors,
16                 //BeanFactoryPostProcessor:在 beanFactory 标准初始化完成之后执行的
17                 //两个接口 BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor
18         invokeBeanFactoryPostProcessors(beanFactory);
19                 // 注册bean的处理器,拦截bean的创建过程
20         registerBeanPostProcessors(beanFactory);
21                 // 初始化messagesource 组件,做国际化功能、消息绑定、消息解析.
22         initMessageSource();
23         // 初始化事件派发器
24         initApplicationEventMulticaster();
25                 // 初始化特定子类中的其他特殊bean。留给子容器(子类)是一个空的实现
26                 // 子类重写这个方法,在容器刷新的时候可以自定义逻辑
27         onRefresh();
28                 // 将容器中将所有项目里面的 applicationLister 注册进来
29         registerListeners();
30                 // 初始化所有剩下的单实例bean singletons.
31         finishBeanFactoryInitialization(beanFactory);
32                 // 最后一步:刷新Bean工厂容器。
33         finishRefresh();
34 }

【1】prepareRefresh 刷新前的预处理源码分析:

 1 protected void prepareRefresh() {
 2     // 记录当前时间和容器的状态
 3     this.startupDate = System.currentTimeMillis();
 4     this.closed.set(false);
 5     this.active.set(true);
 6     // 在上下文环境中初始化属性设置,其底层是个空方法,由具体的子类定义其实现。
 7     initPropertySources();
 8     // 验证属性的合法性
 9     getEnvironment().validateRequiredProperties();
10         //保存一些早期的容器事件
11     this.earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>();
12 }

【2】obtainFreshBeanFactory 获取 Bean工厂源码分析

 1 protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
 2         //创建 beanFactory
 3     refreshBeanFactory();
 4         //获取 beanFactory
 5     return getBeanFactory();
 6 }
 7 
 8 //refreshBeanFactory 源码展示,位于GenericApplicationContext类
 9 //创建 GenericApplicationContext 类的时候,默认会创建一个 bean 工厂。
10 public GenericApplicationContext() {
11     this.beanFactory = new DefaultListableBeanFactory();
12 }
13 @Override
14 protected final void refreshBeanFactory() throws IllegalStateException {
15     if (!this.refreshed.compareAndSet(false, true)) {
16         throw new IllegalStateException(
17                 "GenericApplicationContext ... once");
18     }
19         //*** 给 bean工厂中创建一个序列化ID
20     this.beanFactory.setSerializationId(getId());
21 }
22 
23 //获取一个 bean 工厂
24 @Override
25 public final ConfigurableListableBeanFactory getBeanFactory() {
26     return this.beanFactory;
27 }

【3】prepareBeanFactory 对刚创建的bean工厂进行设置,源码分析:

 1 protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
 2     // 告诉内部bean工厂使用上下文的类加载器等。
 3     beanFactory.setBeanClassLoader(getClassLoader());
 4     //设置表达式解析器等
 5     beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
 6     beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
 7 
 8     // 添加部分后置处理器 ApplicationContextAwareProcessor
 9     beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
10     //设置忽略的自动装配的接口
11     beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
12     beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
13     beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
14     beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
15     beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
16     beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
17 
18     // BeanFactory接口未在普通工厂中注册可解析类型
19     // 注册可以解析的自动装配,我们能直接在任何组件中自动注入
20     beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
21     beanFactory.registerResolvableDependency(ResourceLoader.class, this);
22     beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
23     beanFactory.registerResolvableDependency(ApplicationContext.class, this);
24 
25     // 注册早期的后处理器,以便将内部bean检测为applicationlisteners。
26     beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
27 
28     // 添加编译时的 AspectJ
29     if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
30         beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
31         // 为类型匹配设置临时类加载器。
32         beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
33     }
34 
35     // 给 beanfactory 中注册能用的一些组件。
36     if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
37         beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
38     }
39     if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
40         beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
41     }
42     if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
43         beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
44     }
45 }

【4】invokeBeanFactoryPostProcessors 源码分析

 1 protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
 2     PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
 3 
 4     // Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
 5     // (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
 6     if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
 7         beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
 8         beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
 9     }
10 }

【4.1】invokeBeanFactoryPostProcessors 源码分析

  1 public static void invokeBeanFactoryPostProcessors(
  2         ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
  3 
  4     // 如果有,请先调用BeanDefinitionRegistryPostProcessors。 
  5     Set<String> processedBeans = new HashSet<>();
  6         //当前的 beanFactory == BeanDefinitionRegistry
  7     if (beanFactory instanceof BeanDefinitionRegistry) {
  8         BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
  9         List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
 10         List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
 11                 //获取所有的 BeanFactoryPostProcessor 
 12         for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
 13             if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
 14                 BeanDefinitionRegistryPostProcessor registryProcessor =
 15                         (BeanDefinitionRegistryPostProcessor) postProcessor;
 16                 registryProcessor.postProcessBeanDefinitionRegistry(registry);
 17                 registryProcessors.add(registryProcessor);
 18             }
 19             else {
 20                 regularPostProcessors.add(postProcessor);
 21             }
 22         }
 23 
 24         // 首先执行实现了 priority 接口的后置处理器
 25         String[] postProcessorNames =
 26                 beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
 27         for (String ppName : postProcessorNames) {
 28             if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
 29                 currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
 30                 processedBeans.add(ppName);
 31             }
 32         }
 33                 //限制性实现了 priorityOrdered 优先级接口的后置处理器
 34         sortPostProcessors(currentRegistryProcessors, beanFactory);
 35         registryProcessors.addAll(currentRegistryProcessors);
 36         invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
 37         currentRegistryProcessors.clear();
 38 
 39         // 接下来,调用实现ordered接口的后置处理器
 40         postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
 41         for (String ppName : postProcessorNames) {
 42             if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
 43                 currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
 44                 processedBeans.add(ppName);
 45             }
 46         }
 47         sortPostProcessors(currentRegistryProcessors, beanFactory);
 48         registryProcessors.addAll(currentRegistryProcessors);
 49         invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
 50         currentRegistryProcessors.clear();
 51 
 52         // 最后,调用所有其他没有实现任何接口的后置处理器
 53         boolean reiterate = true;
 54         while (reiterate) {
 55             reiterate = false;
 56             postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
 57             for (String ppName : postProcessorNames) {
 58                 if (!processedBeans.contains(ppName)) {
 59                     currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
 60                     processedBeans.add(ppName);
 61                     reiterate = true;
 62                 }
 63             }
 64             sortPostProcessors(currentRegistryProcessors, beanFactory);
 65             registryProcessors.addAll(currentRegistryProcessors);
 66             invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
 67             currentRegistryProcessors.clear();
 68         }
 69 
 70         // 现在,调用到目前为止处理的所有处理器的postprocessebeanfactory回调。
 71         invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
 72         invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
 73     }
 74 
 75     else {
 76         // 调用使用上下文实例注册的工厂处理器。
 77         invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
 78     }
 79 
 80     // 不要在这里初始化factorybeans:我们需要保留所有常规bean
 81     // 获取所有的的后置处理器
 82         //后续操作与前面相同,查看是否实现了priority、order接口和获取全部
 83     String[] postProcessorNames =
 84             beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
 85 
 86     // Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
 87     // Ordered, and the rest.
 88     List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
 89     List<String> orderedPostProcessorNames = new ArrayList<>();
 90     List<String> nonOrderedPostProcessorNames = new ArrayList<>();
 91     for (String ppName : postProcessorNames) {
 92         if (processedBeans.contains(ppName)) {
 93             // skip - already processed in first phase above
 94         }
 95         else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
 96             priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
 97         }
 98         else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
 99             orderedPostProcessorNames.add(ppName);
100         }
101         else {
102             nonOrderedPostProcessorNames.add(ppName);
103         }
104     }
105 
106     // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
107     sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
108     invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
109 
110     // Next, invoke the BeanFactoryPostProcessors that implement Ordered.
111     List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();
112     for (String postProcessorName : orderedPostProcessorNames) {
113         orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
114     }
115     sortPostProcessors(orderedPostProcessors, beanFactory);
116     invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
117 
118     // Finally, invoke all other BeanFactoryPostProcessors.
119     List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
120     for (String postProcessorName : nonOrderedPostProcessorNames) {
121         nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
122     }
123     invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
124 
125     // Clear cached merged bean definitions since the post-processors might have
126     // modified the original metadata, e.g. replacing placeholders in values...
127     beanFactory.clearMetadataCache();
128 }

【5】registerBeanPostProcessors 源码展示:注册BeanPostProcessor,不同的接口类型的 BeanPostProcessor;在bean 创建前后的执行时机是不一样的。
  ■  BeanPostProcessor:
  ■  DestructionAwareBeanPostProcessor
  ■  InstantiationAwareBeanPostProcessor
  ■  SmartInstantiationAwareBeanPostProcessor
  ■  MergedBeanDefinitionPostProcessor【internalPostProcessors】:优先记录:1

 1 protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
 2     //方法实现在外层
 3     PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
 4 }
 5 
 6 public static void registerBeanPostProcessors(
 7         ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
 8     //获取所有的 bean后置处理器
 9     String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
10 
11     // 检查和统计后置处理器
12     int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
13     beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
14 
15     // bean 的后置处理器也有实现 priority和order接口的后置处理器,用来指定优先级
16     List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
17     List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
18     List<String> orderedPostProcessorNames = new ArrayList<>();
19     List<String> nonOrderedPostProcessorNames = new ArrayList<>();
20     for (String ppName : postProcessorNames) {
21         if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
22             BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
23             priorityOrderedPostProcessors.add(pp);
24             //将实现了 MergedBeanDefinitionPostProcessor 接口的后置处理器加入到internalPostProcessors
25             if (pp instanceof MergedBeanDefinitionPostProcessor) {
26                 internalPostProcessors.add(pp);
27             }
28         }
29         else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
30             orderedPostProcessorNames.add(ppName);
31         }
32         else {
33             nonOrderedPostProcessorNames.add(ppName);
34         }
35     }
36 
37     // 首先,注册实现priorityordered接口的beanPostProcessors。
38     sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
39     //注册bean后置处理器到beanFactory    
40     //beanFactory.addBeanPostProcessor(postProcessor);
41     registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
42 
43     // 接下来,注册实现ordered接口的beanPostProcessors。
44     List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
45     for (String ppName : orderedPostProcessorNames) {
46         BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
47         orderedPostProcessors.add(pp);
48         if (pp instanceof MergedBeanDefinitionPostProcessor) {
49             internalPostProcessors.add(pp);
50         }
51     }
52     sortPostProcessors(orderedPostProcessors, beanFactory);
53     registerBeanPostProcessors(beanFactory, orderedPostProcessors);
54 
55     // 现在,注册所有常规beanpstprocessors。
56     List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
57     for (String ppName : nonOrderedPostProcessorNames) {
58         BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
59         nonOrderedPostProcessors.add(pp);
60         if (pp instanceof MergedBeanDefinitionPostProcessor) {
61             internalPostProcessors.add(pp);
62         }
63     }
64     registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
65 
66     // 最后,重新注册所有内部 beanpstprocessors。实现了 MergedBeanDefinitionPostProcessor 接口的后置处理器
67     sortPostProcessors(internalPostProcessors, beanFactory);
68     registerBeanPostProcessors(beanFactory, internalPostProcessors);
69 
70     // 注册一个ApplicationListenerDetector 来检查bean创建完成是否为侦听器,如果是将此bean 放入到容器中
71     // 将其移动到处理器链的末端(用于获取代理等)。
72     beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
73 }

【6】initMessageSource 源码解析:

 1 protected void initMessageSource() {
 2     //获取 bean工厂
 3     ConfigurableListableBeanFactory beanFactory = getBeanFactory();
 4     //查看beanFactory 中是否有 messsource 类型组件,有则赋值给messageSource
 5     if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
 6         this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
 7         if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
 8             HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
 9             if (hms.getParentMessageSource() == null) {
10                 hms.setParentMessageSource(getInternalParentMessageSource());
11             }
12         }
13         if (logger.isTraceEnabled()) {
14             logger.trace("Using MessageSource [" + this.messageSource + "]");
15         }
16     }
17     //不存在则创建一个 messageSource 主要作用:从配置文件中取出国际化等的值 
18     else {
19         DelegatingMessageSource dms = new DelegatingMessageSource();
20         dms.setParentMessageSource(getInternalParentMessageSource());
21         this.messageSource = dms;
22                 //将messageSource 注入到容器中
23         beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
24         if (logger.isTraceEnabled()) {
25             logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");
26         }
27     }
28 }

【7】initApplicationEventMulticaster 初始化事件派发器,源码分析:

 1 protected void initApplicationEventMulticaster() {
 2     //获取 BeanFactory 
 3     ConfigurableListableBeanFactory beanFactory = getBeanFactory();
 4     //从beanFactory 中获取 applicationEventMulticaster 的事件派发器
 5     if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
 6         this.applicationEventMulticaster =
 7                 beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
 8         if (logger.isTraceEnabled()) {
 9             logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
10         }
11     }
12     //否则创建一个简单的事件派发器 SimpleApplicationEventMulticaster
13     else {
14         this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
15         //并注册到容器中,以后其他组件直接注入。
16         beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
17         if (logger.isTraceEnabled()) {
18             logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +
19                     "[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");
20         }
21     }
22 }

【8】registerListeners 源码分析:

 1 protected void registerListeners() {
 2     // 首先注册静态指定的侦听器。
 3     for (ApplicationListener<?> listener : getApplicationListeners()) {
 4         //将监听器添加到事件派发器中
 5         getApplicationEventMulticaster().addApplicationListener(listener);
 6     }
 7 
 8     // 重容器中获取所有的 ApplicationListener
 9     String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
10     for (String listenerBeanName : listenerBeanNames) {
11         //添加到监听器事件派发器中
12         getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
13     }
14 
15     // 派发之前步骤产生的事件
16     Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
17     this.earlyApplicationEvents = null;
18     if (earlyEventsToProcess != null) {
19         for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
20             getApplicationEventMulticaster().multicastEvent(earlyEvent);
21         }
22     }
23 }

【9】初始化所有剩下的单实例bean 的方法 finishBeanFactoryInitialization(beanFactory); 源码展示:

 1 protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
 2     // 初始化上下文的转换服务。   (过)
 3     if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
 4             beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
 5         beanFactory.setConversionService(
 6                 beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
 7     }
 8 
 9     // 如果没有bean后处理器,则注册默认的嵌入式值解析器   (过)
10     // (例如propertyplaceholderconfigurer bean)在以下任何时间之前注册:
11     // 此时,主要用于注释属性值中的分辨率。
12     if (!beanFactory.hasEmbeddedValueResolver()) {
13         beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
14     }
15 
16     // 尽早初始化loadTimeWeaveraware bean,以便尽早注册其转换器。  (过)
17     String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
18     for (String weaverAwareName : weaverAwareNames) {
19         getBean(weaverAwareName);
20     }
21 
22     // 停止使用临时类加载器进行类型匹配。  (过)
23     beanFactory.setTempClassLoader(null);
24 
25     // 允许缓存所有bean定义元数据,不需要进一步更改。  (过)
26     beanFactory.freezeConfiguration();
27 
28     // *****实例化所有剩余的(非延迟初始化)单例。***  
29     beanFactory.preInstantiateSingletons();
30 }

【9.1】实例化所有剩余的(非延迟初始化)单例。beanFactory.preInstantiateSingletons() 方法源码如下:

 1 @Override
 2 public void preInstantiateSingletons() throws BeansException {
 3     if (logger.isTraceEnabled()) {
 4         logger.trace("Pre-instantiating singletons in " + this);
 5     }
 6 
 7     // 获取所有bean的定义信息
 8     List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
 9 
10     // 所有非惰性单例bean的触发器初始化…
11     for (String beanName : beanNames) {
12         //获取bean的定义信息
13         RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
14         //判断不是抽象的、是单实例的、不是懒加载的则创建
15         if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
16             //判断是否为 Factorybean:是否是实现了factoryBean接口的,通过getObject 获取实例
17             if (isFactoryBean(beanName)) {
18                 Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
19                 if (bean instanceof FactoryBean) {
20                     final FactoryBean<?> factory = (FactoryBean<?>) bean;
21                     boolean isEagerInit;
22                     if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
23                         isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)
24                                         ((SmartFactoryBean<?>) factory)::isEagerInit,
25                                 getAccessControlContext());
26                     }
27                     else {
28                         isEagerInit = (factory instanceof SmartFactoryBean &&
29                                 ((SmartFactoryBean<?>) factory).isEagerInit());
30                     }
31                     if (isEagerInit) {
32                         getBean(beanName);
33                     }
34                 }
35             }
36             /**如果不是工厂bean——>getBean(beanName)---> doGetBean()--->获取缓存中保存的单实例Bean,如果能
37  *singletonObjects.get(beanName); Map<String, Object> singletonObjects用来缓存所有的单实例bean
38  *-->缓存中获取不到,则创建对象:1、先标记当前bean 被创建(防止多线程)2、获取bean的定义信息
39  *3、获取当前bean依赖的其他bean(dependsOn),如果有按照getBean的方式,将依赖的bean先创建出来
40  *4、启动单实例bean的创建流程:通过beanFactory.getObject创建——>内部调用createBean创建bean——>
41  *拿到bean的定义信息,调用resolveBeforeInstantiation(beanName,mbdToUse):让beanPoseProcess提前
42  *拦截获取代理对象的机会。InstantiationAwareBeanPostProcessor:提前执行,
43  *先触发postProcessBeforeInstantiation();如果有返回值则触发postProcessAfterInitalization()
44  *如果没有返回代理对象,则执行 doCreateBean(beanName,mbdToUse,args)创建bean。
45  *创建bean的流程:
46  * 1)、createBeanInstance(beanName,mbdToUse,args)进入此方法:
47  *      1.1)通过工厂方法或者执行构造器解析执行即可:创建的对象是个空对象
48  * 2)、applyMergedBeanDefinitionPostProcessors(mbd,beanType,beanName);调用
49  *       MergedBeanDefinitionPostProcessor的bdp.postProcessMergedBeanDefinition(mbd,beanType,beanName)
50  * 3)、给bean实例赋值,populateBean(beanName,mbd,bw,pvs) 获取所有的属性信息,赋值之前获取所有的 InstantiationAwareBeanPostProcessor 后置处理器的postProcessAfterInstantiation()
51  * 第二次获取InstantiationAwareBeanPostProcessor后置处理器;执行 postProcessPropertyValues()
52  * 最后为应用 Bean属性赋值:为属性利用 setter 方法进行赋值 applyPropertyValues(beanName,mbd,bw,pvs)
53  * 4)、bean 初始化:initializeBean(beanName,bean,mbd)
54  *   ①、执行xxxAware接口的方法,调用实现了BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口的方法。
55  *   ②、执行后置处理器之前的方法:applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName)
56  *      所有后置处理器的 BeanPostProcessor.postProcessBeforeInitialization()
57  *   ③、执行初始化方法:invokeInitMethods(beanName, wrappedBean, mbd);
58  *        先判断是否实现了InitializingBean接口的实现;执行接口规定的初始化。
59  *      其次自定义初始化方法。
60  *   ④、applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);执行初始化之后的后置处理器的方法。
61  *       BeanPostProcessor.postProcessAfterInitialization(result, beanName);
62  * 5)、注册bean的销毁方法到容器中registerDisposableBeanIfNecessary(beanName, bean, mbd);
63  *
64  *5、将创建的bean 添加到缓存中singleObject(Map);其实IOC容器就是这些Map集合,很多Map里面保存了单实例Bean,环境信息等等。。。
65                          **/
66             else {
67                 getBean(beanName);
68             }
69         }
70     }
71 }

 【9.2】所有Bean 都利用getBean 创建完成之后,检查所有的 Bean是否实现了 SmartInitializingSingleton 接口,如果是,就执行 smartSingleton.afterSingletonsInstantiated();

 1 for (String beanName : beanNames) {
 2     Object singletonInstance = getSingleton(beanName);
 3     if (singletonInstance instanceof SmartInitializingSingleton) {
 4         final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
 5         if (System.getSecurityManager() != null) {
 6             AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
 7                 smartSingleton.afterSingletonsInstantiated();
 8                 return null;
 9             }, getAccessControlContext());
10         }
11         else {
12             smartSingleton.afterSingletonsInstantiated();
13         }
14     }
15 }

【10】finishRefresh:最后一步,完成 BeanFactory 的初始化创建工作;IOC容器创建完成。
用户可以实现 LifecycleProcessor 接口,可以在 BeanFactory 执行 void onRefresh(); 和 void onClose();时调用。默认从容器中找是否有 LifecycleProcessor  的组件。如果没有则创建一个默认的声明周期组件:new DefaultLifecycleProcessor();并注册到beanFactory 容器中。

 1 protected void finishRefresh() {
 2     // 清除上下文级资源缓存(例如扫描中的asm元数据)。
 3     clearResourceCaches();
 4     // 初始化与生命周期有关的后置处理器
 5     initLifecycleProcessor();
 6     //获取前面定义的声明周期处理器(BeanFactory)并调用回调方法 onRefresh
 7     getLifecycleProcessor().onRefresh();
 8     // 发布容器刷新完成事件
 9     publishEvent(new ContextRefreshedEvent(this));
10 
11     // 不重要。。。
12     LiveBeansView.registerApplicationContext(this);
13 }

Spring IOC 容器源码总结


 

1)、Spring 容器在启动的时候,先会保存所有注册来的 Bean 的定义信息;
    ■  Xml 注册bean:<bean>
    ■  注解注册Bean:@Service、@Component、@Bean等等
2)、Spring 容器会在合适的时机创建 bean;
    ■  用到这个 bean 的时候,利用 getBean 创建 bean创建好后保存在容器中
    ■  统一创建剩下所有bean 的时候,调用 finishBeanFactoryInitialization()
3)、后置处理器:BeanPostProcessor:每一个 bean 的创建完成,都会使用各种后置处理器进行处理,来增强bean 的功能:
    ■  AutowriteAnnotationBeanPostProcessor:处理自动注入;
    ■  AnnotationAwareAspectJAutoProxyCreator:来做AOP 功能;等等。。。
4)、事件驱动模型:ApplicationListener 事件监听。ApplicationEventMulticaster 事件派发。

posted @ 2020-11-22 00:34  Java程序员进阶  阅读(78)  评论(0编辑  收藏  举报