Spring源码解析之初始化上下文
2018-01-09 10:48
405 查看
阅读须知
Spring源码版本:4.3.8注释规则:
//单行注释做普通注释
/**/多行注释做深入分析
建议配合Spring源码阅读
正文
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
这句代码相信大家都很熟悉,我们用这句代码加载配置文件来初始化Spring,下面我们就以这句代码作为入口来看一下Spring初始化都做了哪些工作:
ClassPathXmlApplicationContext:
public ClassPathXmlApplicationContext(String configLocation) throws BeansException { /*调用重载构造方法*/ this(new String[] {configLocation}, true, null); }
ClassPathXmlApplicationContext:
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException { super(parent); //设置父级环境对象,这里传入的是null setConfigLocations(configLocations); /*设置配置文件路径*/ if (refresh) { refresh(); /*刷新环境*/ } }
AbstractRefreshableConfigApplicationContext:
public void setConfigLocations(String... locations) { if (locations != null) { Assert.noNullElements(locations, "Config locations must not be null"); this.configLocations = new String[locations.length]; for (int i = 0; i < locations.length; i++) { //解析配置文件路径中的特殊符号(如${}等)并设置配置文件路径 this.configLocations[i] = resolvePath(locations[i]).trim(); } } else { this.configLocations = null; } }
AbstractApplicationContext:
public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { prepareRefresh(); /*为刷新做准备工作*/ ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); /*初始化BeanFactory,并解析配置*/ prepareBeanFactory(beanFactory); /*为BeanFactory填充功能*/ try { /*子类扩展对BeanFactory进行额外处理*/ postProcessBeanFactory(beanFactory); /*调用注册的BeanFactoryPostProcessors的postProcessBeanFactory方法*/ invokeBeanFactoryPostProcessors(beanFactory); /*注册BeanPostProcessors*/ registerBeanPostProcessors(beanFactory); /*初始化MessageSource,用于国际化处理*/ initMessageSource(); /*初始化应用事件广播器*/ initApplicationEventMulticaster(); /*子类扩展初始化一些个性化的bean*/ onRefresh(); /*找到ApplicationListener bean,并注册*/ registerListeners(); /*初始化剩下的所有非lazy-init的单例bean*/ finishBeanFactoryInitialization(beanFactory); /*初始化LifecycleProcessor(生命周期处理器),发步对应的事件通知,如果配置了JMX,则注册MBean*/ finishRefresh(); } catch (BeansException ex) { if (logger.isWarnEnabled()) { logger.warn("Exception encountered during context initialization - " + "cancelling refresh attempt: " + ex); } /*销毁已经创建的单例Bean*/ destroyBeans(); /*重置active标记为false*/ cancelRefresh(ex); throw ex; } finally { resetCommonCaches(); } } }
AbstractApplicationContext:
protected void prepareRefresh() { //设置初始化开始时间 this.startupDate = System.currentTimeMillis(); this.closed.set(false); this.active.set(true); if (logger.isInfoEnabled()) { logger.info("Refreshing " + this); } initPropertySources(); //初始化设置属性,留给子类扩展,默认空实现 //校验必须的属性,用户也可以根据个性化需求扩展必要属性的校验 getEnvironment().validateRequiredProperties(); this.earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>(); }
在进入下面的分析之前简单介绍一下BeanFactory,BeanFactory提供Spring的IoC功能的基础,字面理解就是bean工厂,用来定义和创建bean。
AbstractApplicationContext:
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { refreshBeanFactory(); /*刷新BeanFactory*/ ConfigurableListableBeanFactory beanFactory = getBeanFactory(); //获取BeanFactory if (logger.isDebugEnabled()) { logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory); } return beanFactory; }
AbstractRefreshableApplicationContext:
protected final void refreshBeanFactory() throws BeansException { //如果有BeanFactory,则销毁已经创建的bean并关闭掉BeanFactory(将其置为null) if (hasBeanFactory()) { destroyBeans(); closeBeanFactory(); } try { //创建BeanFactory(DefaultListableBeanFactory) DefaultListableBeanFactory beanFactory = createBeanFactory(); beanFactory.setSerializationId(getId()); //设置序列化id customizeBeanFactory(beanFactory); /*定制BeanFactory*/ loadBeanDefinitions(beanFactory); /*加载BeanDefinition*/ synchronized (this.beanFactoryMonitor) { this.beanFactory = beanFactory; } } catch (IOException ex) { throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex); } }
AbstractRefreshableApplicationContext:
protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) { //设置是否允许覆盖同名称不同定义的对象 if (this.allowBeanDefinitionOverriding != null) { beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding); } //设置是否允许bean之间的循环依赖 if (this.allowCircularReferences != null) { beanFactory.setAllowCircularReferences(this.allowCircularReferences); } }
加载BeanDefinition的流程也就是标签解析的流程我们会在后面的文章进行单独分析。
AbstractApplicationContext:
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { beanFactory.setBeanClassLoader(getClassLoader()); //设置SPEL表达式处理器,在bean初始化填充属性时会用到 beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader())); //添加属性编辑器注册器 beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment())); //添加Aware接口的BeanPostProcessor beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)); //设置几个忽略自动装配的接口 beanFactory.ignoreDependencyInterface(EnvironmentAware.class); beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class); beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class); beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class); beanFactory.ignoreDependencyInterface(MessageSourceAware.class); beanFactory.ignoreDependencyInterface(ApplicationContextAware.class); //注册几个自动装配的接口 beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory); beanFactory.registerResolvableDependency(ResourceLoader.class, this); beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this); beanFactory.registerResolvableDependency(ApplicationContext.class, this); //添加用于发现ApplicationListener的BeanPostProcessor beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this)); //增加对静态AOP的支持 if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) { beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory)); beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader())); } //添加几个默认的系统环境bean if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) { beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment()); } if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) { beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties()); } if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) { beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment()); } }
这里提到了属性编辑器和自动装配的概念,这些我们会在bean创建的文章中进行讲解,这里先留一个悬念。简单介绍一下方法中注册的ApplicationContextAwareProcessor,它实现了BeanPostProcessor,Spring会保证所有bean在实例化的时候都会调用其postProcessAfterInitialization方法,我们可以使用这个方法包装和改变bean,我们来看一下这个方法:
ApplicationContextAwareProcessor:
public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException { AccessControlContext acc = null; if (System.getSecurityManager() != null && (bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware || bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware || bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)) { acc = this.applicationContext.getBeanFactory().getAccessControlContext(); } if (acc != null) { AccessController.doPrivileged(new PrivilegedAction<Object>() { @Override public Object run() { invokeAwareInterfaces(bean); /*调用Aware接口*/ return null; } }, acc); } else { invokeAwareInterfaces(bean); /*调用Aware接口*/ } return bean; }
ApplicationContextAwareProcessor:
private void invokeAwareInterfaces(Object bean) { if (bean instanceof Aware) { if (bean instanceof EnvironmentAware) { ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment()); } if (bean instanceof EmbeddedValueResolverAware) { ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver); } if (bean instanceof ResourceLoaderAware) { ((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext); } if (bean instanceof ApplicationEventPublisherAware) { ((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext); } if (bean instanceof MessageSourceAware) { ((MessageSourceAware) bean).setMessageSource(this.applicationContext); } if (bean instanceof ApplicationContextAware) { ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext); } } }
当我们的bean实现了某个Aware接口,这里就会调用相关的set方法为我们的bean设置相关资源。下一步的postProcessBeanFactory默认为空实现,留给子类扩展做BeanFactory初始化后的后置处理。接下来就是调用所有注册的BeanFactoryPostProcessor的相关方法,我们以一个例子来说明一下BeanFactoryPostProcessor的用法,我们在使用Spring整合Mybatis的时候会配置一个类MapperScannerConfigurer,用来扫描我们工程中定义的所有Mapper接口,我们来看一下它的层次结构:
这里就会调用它的postProcessBeanDefinitionRegistry方法来扫描我们配置的包完成Mapper相关的BeanDefinition的注册,我们会在Spring整合Mybatis的文章中进行详细描述。
AbstractApplicationContext:
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { /*调用注册的所有BeanFactoryPostProcessor的相关方法*/ PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()); //再次确认是否需要增加对静态AOP的支持,这段逻辑在prepareBeanFactory方法中已经执行过,这里因为有可能有新的BeanDefinition注册,所以需要再次确认 if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) { beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory)); beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader())); } }
PostProcessorRegistrationDelegate:
public static void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) { Set<String> processedBeans = new HashSet<String>(); if (beanFactory instanceof BeanDefinitionRegistry) { BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; List<BeanFactoryPostProcessor> regularPostProcessors = new LinkedList<BeanFactoryPostProcessor>(); List<BeanDefinitionRegistryPostProcessor> registryPostProcessors = new LinkedList<BeanDefinitionRegistryPostProcessor>(); for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) { //首先调用BeanDefinitionRegistryPostProcessor if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) { BeanDefinitionRegistryPostProcessor registryPostProcessor = (BeanDefinitionRegistryPostProcessor) postProcessor; //执行postProcessBeanDefinitionRegistry方法 registryPostProcessor.postProcessBeanDefinitionRegistry(registry); registryPostProcessors.add(registryPostProcessor); } else { regularPostProcessors.add(postProcessor); } } //从所有注册的BeanDefinition中获取BeanDefinitionRegistryPostProcessor String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); List<BeanDefinitionRegistryPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanDefinitionRegistryPostProcessor>(); for (String ppName : postProcessorNames) { //首先执行实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } sortPostProcessors(beanFactory, priorityOrderedPostProcessors); //排序 registryPostProcessors.addAll(priorityOrderedPostProcessors); invokeBeanDefinitionRegistryPostProcessors(priorityOrderedPostProcessors, registry); //执行postProcessBeanDefinitionRegistry方法 postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); List<BeanDefinitionRegistryPostProcessor> orderedPostProcessors = new ArrayList<BeanDefinitionRegistryPostProcessor>(); for (String ppName : postProcessorNames) { //接下来执行实现Ordered接口的BeanDefinitionRegistryPostProcessor if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } sortPostProcessors(beanFactory, orderedPostProcessors); //排序 registryPostProcessors.addAll(orderedPostProcessors); invokeBeanDefinitionRegistryPostProcessors(orderedPostProcessors, registry); //执行 boolean reiterate = true; while (reiterate) { reiterate = false; postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { //执行剩余的BeanDefinitionRegistryPostProcessor if (!processedBeans.contains(ppName)) { BeanDefinitionRegistryPostProcessor pp = beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class); registryPostProcessors.add(pp); processedBeans.add(ppName); pp.postProcessBeanDefinitionRegistry(registry); reiterate = true; } } } //BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor,执行完postProcessBeanDefinitionRegistry方法之后还要执行postProcessBeanFactory方法 invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory); invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory); } else { invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory); } String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false); //剩余的BeanFactoryPostProcessor同样按照实现PriorityOrdered --> 实现Ordered --> 其他的顺序执行 List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>(); List<String> orderedPostProcessorNames = new ArrayList<String>(); List<String> nonOrderedPostProcessorNames = new ArrayList<String>(); for (String ppName : postProcessorNames) { //上面已经将所有的BeanDefinitionRegistryPostProcessor都执行完了,这里要将它们排除掉,执行剩余的BeanFactoryPostProcessor if (processedBeans.contains(ppName)) { } else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class)); } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessorNames.add(ppName); } else { nonOrderedPostProcessorNames.add(ppName); } } sortPostProcessors(beanFactory, priorityOrderedPostProcessors); invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory); List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>(); for (String postProcessorName : orderedPostProcessorNames) { orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class)); } sortPostProcessors(beanFactory, orderedPostProcessors); invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory); List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>(); for (String postProcessorName : nonOrderedPostProcessorNames) { nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class)); } invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory); beanFactory.clearMetadataCache(); }
下一步是注册BeanPostProcessor:
AbstractApplicationContext:
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) { /*注册BeanPostProcessor*/ PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this); }
PostProcessorRegistrationDelegate:
public static void registerBeanPostProcessors( ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) { //获取所有BeanPostProcessor的beanName String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length; //注册BeanPostProcessorChecker的作用是在BeanPostProcessor初始化期间有bean被创建了就会打印日志 beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount)); //和上面BeanFactoryPostProcessor执行的过程非常相似,同样是按照PriorityOrdered --> Ordered --> 其他的顺序进行注册,区别是这里最后加了MergedBeanDefinitionPostProcessor类型的BeanPostProcessor的注册,并且这里不会执行相关方法,BeanPostProcessor的相关方法在bean创建时才会执行。这里看起来有重复注册的问题,不过beanFactory.addBeanPostProcessor是先移除在添加,所以不会重复 List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanPostProcessor>(); List<BeanPostProcessor> internalPostProcessors = new ArrayList<BeanPostProcessor>(); List<String> orderedPostProcessorNames = new ArrayList<String>(); List<String> nonOrderedPostProcessorNames = new ArrayList<String>(); for (String ppName : postProcessorNames) { if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); priorityOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessorNames.add(ppName); } else { nonOrderedPostProcessorNames.add(ppName); } } sortPostProcessors(beanFactory, priorityOrderedPostProcessors); registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); List<BeanPostProcessor> orderedPostProcessors = new ArrayList<BeanPostProcessor>(); for (String ppName : orderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); orderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } sortPostProcessors(beanFactory, orderedPostProcessors); registerBeanPostProcessors(beanFactory, orderedPostProcessors); List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanPostProcessor>(); for (String ppName : nonOrderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); nonOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors); sortPostProcessors(beanFactory, internalPostProcessors); registerBeanPostProcessors(beanFactory, internalPostProcessors); beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext)); }
AbstractBeanFactory:
public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) { Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null"); this.beanPostProcessors.remove(beanPostProcessor); //先移除 this.beanPostProcessors.add(beanPostProcessor); //再添加 if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) { this.hasInstantiationAwareBeanPostProcessors = true; } if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) { this.hasDestructionAwareBeanPostProcessors = true; } }
下一步是初始化MessageSource,用于国际化处理,关于Spring的国际化处理,有兴趣的读者可以查阅相关资料进行学习,这里就不做描述了。接下来我们来看应用事件广播器的初始化:
AbstractApplicationContext:
protected void initApplicationEventMulticaster() { ConfigurableListableBeanFactory beanFactory = getBeanFactory(); //用户自定义事件广播器 if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) { this.applicationEventMulticaster = beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class); if (logger.isDebugEnabled()) { logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]"); } } else { /*默认事件广播器*/ this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory); beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster); if (logger.isDebugEnabled()) { logger.debug("Unable to locate ApplicationEventMulticaster with name '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "': using default [" + this.applicationEventMulticaster + "]"); } } }
我们以默认事件广播器SimpleApplicationEventMulticaster为例看一下它是如何广播事件的:
public void multicastEvent(final ApplicationEvent event, ResolvableType eventType) { ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event)); for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) { Executor executor = getTaskExecutor(); if (executor != null) { executor.execute(new Runnable() { @Override public void run() { /*通知监听器*/ invokeListener(listener, event); } }); } else { /*通知监听器*/ invokeListener(listener, event); } } }
SimpleApplicationEventMulticaster:
protected void invokeListener(ApplicationListener listener, ApplicationEvent event) { ErrorHandler errorHandler = getErrorHandler(); if (errorHandler != null) { try { //将应用事件通知监听器 listener.onApplicationEvent(event); } catch (Throwable err) { errorHandler.handleError(err); } } else { try { //将应用事件通知监听器 listener.onApplicationEvent(event); } catch (ClassCastException ex) { String msg = ex.getMessage(); if (msg == null || msg.startsWith(event.getClass().getName())) { Log logger = LogFactory.getLog(getClass()); if (logger.isDebugEnabled()) { logger.debug("Non-matching event type for listener: " + listener, ex); } } else { throw ex; } } } }
很简单,通知监听器就是调用所有监听器的onApplicationEvent方法将事件传入,由监听器自己决定是否处理当前事件,这是一个典型的观察者模式的实现。而接下来就是监听器的注册:
AbstractApplicationContext:
protected void registerListeners() { //编码方式的监听器注册 for (ApplicationListener<?> listener : getApplicationListeners()) { getApplicationEventMulticaster().addApplicationListener(listener); } //配置方式的监听器注册 String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false); for (String listenerBeanName : listenerBeanNames) { getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName); } //将提前发布的应用事件通知给所有监听器 Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents; this.earlyApplicationEvents = null; if (earlyEventsToProcess != null) { for (ApplicationEvent earlyEvent : earlyEventsToProcess) { getApplicationEventMulticaster().multicastEvent(earlyEvent); } } }
接下来是初始化所有非lazy-init的bean:
AbstractApplicationContext:
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { //初始化类型转换器 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)); } //如果没有配置value处理器(例如PropertyPlaceholderConfigurer)则注册一个默认的value处理器,主要用于处理注解的value if (!beanFactory.hasEmbeddedValueResolver()) { beanFactory.addEmbeddedValueResolver(new StringValueResolver() { @Override public String resolveStringValue(String strVal) { return getEnvironment().resolvePlaceholders(strVal); } }); } //初始化实现LoadTimeWeaverAware的bean String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false); for (String weaverAwareName : weaverAwareNames) { getBean(weaverAwareName); } beanFactory.setTempClassLoader(null); //冻结BeanDefinition,到这里BeanDefinition就不能再修改了,下面就要初始化了 beanFactory.freezeConfiguration(); /*初始化非lazy-init的单例bean*/ beanFactory.preInstantiateSingletons(); }
这里提到的类型转换器我们可以通过配置ConversionServiceFactoryBean来注册我们自定义的类型转换器,就是在这里初始化的。
DefaultListableBeanFactory:
public void preInstantiateSingletons() throws BeansException { if (this.logger.isDebugEnabled()) { this.logger.debug("Pre-instantiating singletons in " + this); } //获取所有beanName List<String> beanNames = new ArrayList<String>(this.beanDefinitionNames); for (String beanName : beanNames) { RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); //非abstract、非lazy-init的单例bean if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { //FactoryBean的处理 if (isFactoryBean(beanName)) { final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName); boolean isEagerInit; if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) { isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() { @Override public Boolean run() { return ((SmartFactoryBean<?>) factory).isEagerInit(); } }, getAccessControlContext()); } else { isEagerInit = (factory instanceof SmartFactoryBean && ((SmartFactoryBean<?>) factory).isEagerInit()); } if (isEagerInit) { getBean(beanName); //初始化 } } else { //普通bean初始化 getBean(beanName); } } } //调用所有初始化的后的回调,Spring4.1的新特性,我们的bean实现了SmartInitializingSingleton后,会在初始化后调用实现的afterSingletonsInstantiated方法,我们可以在里面定义一些bean初始化后需要的逻辑 for (String beanName : beanNames) { Object singletonInstance = getSingleton(beanName); if (singletonInstance instanceof SmartInitializingSingleton) { final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance; if (System.getSecurityManager() != null) { AccessController.doPrivileged(new PrivilegedAction<Object>() { @Override public Object run() { smartSingleton.afterSingletonsInstantiated(); return null; } }, getAccessControlContext()); } else { smartSingleton.afterSingletonsInstantiated(); } } } }
bean初始化的过程我们会在后续的文章中进行详细阐述,下面就是最后一步啦:
AbstractApplicationContext:
protected void finishRefresh() { /*初始化LifecycleProcessor(生命周期处理器)*/ initLifecycleProcessor(); /*调用onRefresh*/ getLifecycleProcessor().onRefresh(); //发送Spring上下文初始化完成事件 publishEvent(new ContextRefreshedEvent(this)); //注册MBean LiveBeansView.registerApplicationContext(this); }
AbstractApplicationContext:
protected void initLifecycleProcessor() { ConfigurableListableBeanFactory beanFactory = getBeanFactory(); //用户自定义LifecycleProcessor if (beanFactory.containsLocalBean(LIFECYCLE_PROCESSOR_BEAN_NAME)) { this.lifecycleProcessor = beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME, LifecycleProcessor.class); if (logger.isDebugEnabled()) { logger.debug("Using LifecycleProcessor [" + this.lifecycleProcessor + "]"); } } else { /*默认LifecycleProcessor*/ DefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor(); defaultProcessor.setBeanFactory(beanFactory); this.lifecycleProcessor = defaultProcessor; beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor); if (logger.isDebugEnabled()) { logger.debug("Unable to locate LifecycleProcessor with name '" + LIFECYCLE_PROCESSOR_BEAN_NAME + "': using default [" + this.lifecycleProcessor + "]"); } } }
注册完LifecycleProcessor接着会调用它的onRefresh方法,我们以默认的DefaultLifecycleProcessor为例分析一下它的作用:
public void onRefresh() { /*实现了Lifecycle的bean处理*/ startBeans(true); this.running = true; }
DefaultLifecycleProcessor:
private void startBeans(boolean autoStartupOnly) { Map<String, Lifecycle> lifecycleBeans = getLifecycleBeans(); Map<Integer, LifecycleGroup> phases = new HashMap<Integer, LifecycleGroup>(); for (Map.Entry<String, ? extends Lifecycle> entry : lifecycleBeans.entrySet()) { Lifecycle bean = entry.getValue(); if (!autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) { int phase = getPhase(bean); LifecycleGroup group = phases.get(phase); if (group == null) { group = new LifecycleGroup(phase, this.timeoutPerShutdownPhase, lifecycleBeans, autoStartupOnly); phases.put(phase, group); } group.add(entry.getKey(), bean); } } if (!phases.isEmpty()) { List<Integer> keys = new ArrayList<Integer>(phases.keySet()); Collections.sort(keys); for (Integer key : keys) { phases.get(key).start(); } } }
实现了Lifecycle接口的bean,Spring会保证在启动时调用其start方法,在Spring关闭时调用其stop方法。到这里,整个Spring容器就初始化完成了。
相关文章推荐
- Spring初始化 Map 和 解析Json value
- web.xml中的初始化参数(init-param)与上下文参数(context-param)
- 标识符解析、作用域链、运行期上下文、原型链、闭包
- 解析Java中的类和对象的初始化过程
- Spring框架解析一【初始化】
- SD初始化过程以及Cmd解析
- nsq源码阅读笔记之nsqd(一)——nsqd的配置解析和初始化
- 注册中心 Eureka 源码解析 —— Eureka-Client 初始化(一)之 EurekaInstanceConfig
- C++直接初始化与复制初始化的区别深入解析
- 注册中心 Eureka 源码解析 —— Eureka-Client 初始化(二)之 EurekaClientConfig
- iOS 底层解析weak的实现原理(包含weak对象的初始化,引用,释放的分析)
- Android注解解析,注解用法,仿xUtils用注解初始化控件、点击事件(一)
- Memcached源码阅读之初始化参数解析
- 静态数据的初始化(Think in java P95页代码解析)
- 解析 Java 类和对象的初始化过程
- Sword框架解析——知识采集流程页面初始化
- 2013 Oracle技术嘉年华:深入解析Oracle-数据库的初始化
- Android 初始化脚本语法解析
- SPRING原理解析-Ioc容器初始化
- 嵌入式 Linux操作系统内存磁盘初始化技术详细解析