Spring的启动过程

Spring的启动过程_第1张图片

Spring的启动过程

    • Spring的启动过程
      • 1、新建我们的IOC容器
      • 2、调用refresh();方法,初始化我们的IOC容器
      • 3、第一步:准备上下文环境;prepareRefresh();
      • 4、第二步:得到一个beanFactory对象:ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
      • 5、第三步:预处理beanFactory组件:prepareBeanFactory(beanFactory);
        • 5.1 首先告诉bean factory 用的上下文类加载器
        • 5.3 设置environment=StandardEnvironment
        • 5.4 设置 systemProperties= 系统变量
        • 5.5 设置系统的环境 systemEnvironment
      • 6、第四步:给子实现类一个机会 对 beanFactory组件进行后处理
      • 7、第五步:调用bean工厂的后置处理器:invokeBeanFactoryPostProcessors(beanFactory);
      • 8、第六步:注册所有的bean组件的后置处理器:registerBeanPostProcessors(beanFactory);
      • 9、第七步:为上下文初始化 消息源 initMessageSource();
      • 10、第八步:初始化ApplicationEventMulticaste:initApplicationEventMulticaster()
      • 11、第九步:初始化其他的特殊的bean,子类为我们提供的:onRefresh();
      • 12、第十步:检查listenner并且注册他们: registerListeners();
      • 13、第十一步:初始化剩余的bean:finishBeanFactoryInitialization(beanFactory);
      • 14、第十二步:结束刷新,发布一些事件:finishRefresh();

Spring的启动过程

Spring的启动过程:描述Spring容器的启动的过程;涵盖了启动时候的所有的过程,自己的学习记录一下;

1、新建我们的IOC容器

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);

2、调用refresh();方法,初始化我们的IOC容器

public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
		this();
		register(annotatedClasses);
		refresh();
}

3、第一步:准备上下文环境;prepareRefresh();

@Override
	protected void prepareRefresh() {
    // 清理我们的扫描对象
		this.scanner.clearCache();
		super.prepareRefresh();
}

这里的sanner是ClassPathBeanDefinitionScanner 组件,主要的功能是根据我们的路径以及给定的bean的注册起注册我们的bean组件。也就是发现@Component、@Repository、@Service、@Controller这些注解的组件;

4、第二步:得到一个beanFactory对象:ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
    // 刷bean的对象
		refreshBeanFactory();
  	//得到beanfactory组件
		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
		if (logger.isDebugEnabled()) {
			logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
		}
		return beanFactory;
}

得到的beanFactory的类型是:DefaultListableBeanFactory,这就是我们的bean的工厂,创建我们的接下来的bean组件。

5、第三步:预处理beanFactory组件:prepareBeanFactory(beanFactory);

5.1 首先告诉bean factory 用的上下文类加载器

// 设置类加载器
beanFactory.setBeanClassLoader(getClassLoader());
// 设置EL表达式的解析器
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
// 设置ResourceEditorRegistrar注册器
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

5.2 配置bean factory的回掉,也就是XXXXAware,

		// 添加后置处理器
		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);

5.3 设置environment=StandardEnvironment

beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());

@Override
	public ConfigurableEnvironment getEnvironment() {
		if (this.environment == null) {
			this.environment = createEnvironment();
		}
		return this.environment;
}

5.4 设置 systemProperties= 系统变量

beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());

5.5 设置系统的环境 systemEnvironment

6、第四步:给子实现类一个机会 对 beanFactory组件进行后处理

postProcessBeanFactory(beanFactory);

/**
	 * Modify the application context's internal bean factory after its standard
	 * initialization. All bean definitions will have been loaded, but no beans
	 * will have been instantiated yet. This allows for registering special
	 * BeanPostProcessors etc in certain ApplicationContext implementations.
	 * @param beanFactory the bean factory used by the application context
	 */
	protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
	}

这个时候改变的时候,是所有的bean的定义已经加载完毕,但是全部都是没有初始化的,这个时候,我们可以修改里面的基本属性。这个允许注册特殊的BeanPostProcessors 后置处理器。

7、第五步:调用bean工厂的后置处理器:invokeBeanFactoryPostProcessors(beanFactory);

/**
	 * Instantiate and invoke all registered BeanFactoryPostProcessor beans,
	 * respecting explicit order if given.
	 * 

Must be called before singleton instantiation. */ protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { // 具体的实现,是这个方法帮助咱们实现的 PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()); // Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime // (e.g. through an @Bean method registered by ConfigurationClassPostProcessor) if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) { beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory)); beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader())); } }

初始化以及调用所有 BeanFactoryPostProcessor 的对象,根据跟定的顺序

7.1 首先,在IOC容器中获取到所有的beanFactory的后置处理器;BeanDefinitionRegistryPostProcessor定义的后置处理器;

// 首先获取到后置处理器的名字
String[] postProcessorNames =beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);

之后根据优先级进行分类:

PriorityOrdered:实现该接口的后置处理器先执行;

Ordered:实现该接口的后置处理器中间执行;

没有任何实现的,最后执行;

/**
	 * Invoke the given BeanDefinitionRegistryPostProcessor beans.
	 */
	private static void invokeBeanDefinitionRegistryPostProcessors(
			Collection<? extends BeanDefinitionRegistryPostProcessor> postProcessors, BeanDefinitionRegistry registry) {

		for (BeanDefinitionRegistryPostProcessor postProcessor : postProcessors) {
			postProcessor.postProcessBeanDefinitionRegistry(registry);
		}
}

之后调用postProcessBeanFactory的回掉:

invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);

7.2 其次:在IOC容器中获取到所有的BeanFactoryPostProcessor后置处理器:

String[] postProcessorNames =
				beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

它的处理的过程与上面的BeanDefinitionRegistryPostProcessor是类似的;

也是对于实现不同优先级的接口分别执行;

调用执行的过程:

/**
	 * Invoke the given BeanFactoryPostProcessor beans.
	 */
	private static void invokeBeanFactoryPostProcessors(
			Collection<? extends BeanFactoryPostProcessor> postProcessors, ConfigurableListableBeanFactory beanFactory) {

		for (BeanFactoryPostProcessor postProcessor : postProcessors) {
			postProcessor.postProcessBeanFactory(beanFactory);
		}
}

总结:

在调用 invokeBeanFactoryPostProcessors 的处理的很过程中:BeanDefinitionRegistryPostProcessor的处理是优先于BeanFactoryPostProcessor进行调用的;

8、第六步:注册所有的bean组件的后置处理器:registerBeanPostProcessors(beanFactory);

/**
	 * Instantiate and register all BeanPostProcessor beans,
	 * respecting explicit order if given.
	 * 

Must be called before any instantiation of application beans. */ protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this); }

8.1 从IOC容器中国获取到所有的BeanPostProcessor的后置处理器名字;

String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

8.2 将这些后置处理器进行分类:与上面的bean工厂的后置处理器类似

		// Separate between BeanPostProcessors that implement PriorityOrdered,
		// Ordered, and the rest.
		List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
		// 会存储 MergedBeanDefinitionPostProcessor 这样的后置处理器
		List<BeanPostProcessor> internalPostProcessors = new ArrayList<BeanPostProcessor>();
		List<String> orderedPostProcessorNames = new ArrayList<String>();
		List<String> nonOrderedPostProcessorNames = new ArrayList<String>();

8.3 之后根据排序以及优先级,分别注册bean的后置处理器:

sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

注册的过程:

/**
	 * Register the given BeanPostProcessor beans.
	 */
	private static void registerBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) {

		for (BeanPostProcessor postProcessor : postProcessors) {
      // 注册的过程 也就是 将 后置处理器增加到 工厂中
			beanFactory.addBeanPostProcessor(postProcessor);
		}
}

添加的过程:

@Override
	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;
		}
	}

其实也就是一个ArrayList:

Spring的启动过程_第2张图片

8.4 注册完之前所有的bean的后置处理器之后,进行注册MergedBeanDefinitionPostProcessor的后置处理器:

// Finally, re-register all internal BeanPostProcessors.
sortPostProcessors(internalPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, internalPostProcessors);

注册的过程与上面的相同

8.5 最后加入 ApplicationListenerDetector 后置处理器:

Re-register post-processor for detecting inner beans as ApplicationListeners

beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));

9、第七步:为上下文初始化 消息源 initMessageSource();

默认使用的是 DelegatingMessageSource

/**
	 * Initialize the MessageSource.
	 * Use parent's if none defined in this context.
	 */
	protected void initMessageSource() {
		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
		if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
			this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
			// Make MessageSource aware of parent MessageSource.
			if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
				HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
				if (hms.getParentMessageSource() == null) {
					// Only set parent context as parent MessageSource if no parent MessageSource
					// registered already.
					hms.setParentMessageSource(getInternalParentMessageSource());
				}
			}
			if (logger.isDebugEnabled()) {
				logger.debug("Using MessageSource [" + this.messageSource + "]");
			}
		}
		else {
			// Use empty MessageSource to be able to accept getMessage calls.
			DelegatingMessageSource dms = new DelegatingMessageSource();
			dms.setParentMessageSource(getInternalParentMessageSource());
			this.messageSource = dms;
			beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
			if (logger.isDebugEnabled()) {
				logger.debug("Unable to locate MessageSource with name '" + MESSAGE_SOURCE_BEAN_NAME +
						"': using default [" + this.messageSource + "]");
			}
		}
	}

10、第八步:初始化ApplicationEventMulticaste:initApplicationEventMulticaster()

/**
	 * Initialize the ApplicationEventMulticaster.
	 * Uses SimpleApplicationEventMulticaster if none defined in the context.
	 * @see org.springframework.context.event.SimpleApplicationEventMulticaster
	 */
	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 + "]");
			}
		}
	}

如果自己没有定义:ApplicationEventMulticaste ,Spring会帮咱们创建一个默认的SimpleApplicationEventMulticaster提供使用。

11、第九步:初始化其他的特殊的bean,子类为我们提供的:onRefresh();

**
	 * Template method which can be overridden to add context-specific refresh work.
	 * Called on initialization of special beans, before instantiation of singletons.
	 * <p>This implementation is empty.
	 * @throws BeansException in case of errors
	 * @see #refresh()
	 */
	protected void onRefresh() throws BeansException {
		// For subclasses: do nothing by default.
}

12、第十步:检查listenner并且注册他们: registerListeners();

/**
	 * Add beans that implement ApplicationListener as listeners.
	 * Doesn't affect other listeners, which can be added without being beans.
	 */
	protected void registerListeners() {
		// Register statically specified listeners first.
		for (ApplicationListener<?> listener : getApplicationListeners()) {
			getApplicationEventMulticaster().addApplicationListener(listener);
		}

		// Do not initialize FactoryBeans here: We need to leave all regular beans
		// uninitialized to let post-processors apply to them!
    // 获取到我们自定义的ApplicationListener并且注册他们
		String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
		for (String listenerBeanName : listenerBeanNames) {
			getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
		}

		// Publish early application events now that we finally have a multicaster...
		Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
		this.earlyApplicationEvents = null;
		if (earlyEventsToProcess != null) {
			for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
				getApplicationEventMulticaster().multicastEvent(earlyEvent);
			}
		}
	}

13、第十一步:初始化剩余的bean:finishBeanFactoryInitialization(beanFactory);

这一步会初始化我们的其他单例的、非懒加载的bean

13.1 组件的构建过程:beanFactory.preInstantiateSingletons();

org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons()

13.1.1 获取到所有bean的名字

List<String> beanNames = new ArrayList<String>(this.beanDefinitionNames);

循环遍历,依次初始化bean组件:

首先:判断是否是FactoryBean组件,如果是的话,那么就使用FactoryBean的getObject初始化bean组件

如果不是的话,那么就进行bean工厂创建我们的组件:

getBean(beanName);

获取

@Override
	public Object getBean(String name) throws BeansException {
		return doGetBean(name, null, null, false);
}

1):获取到beanName : final String beanName = transformedBeanName(name);

2):从缓存中查找:Object sharedInstance = getSingleton(beanName);没有找到的话,执行下一步

3):根据名字找到bean的定义

4):查看是否创建的这个bean依赖于其他的bean ,如果依赖,那么就先创建其他的bean,他的bean创建完成后,继续创建当前的bean;

5):接下来会创建bean;

其实这里面有很多类型的bean。比如:singleton、prototype、实现scope的bean,当前我们会创建singleton bean

首先根据:org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(String, ObjectFactory)

这个方法创建单实例的bean;

1.根据缓存中是否存在:Object singletonObject = this.singletonObjects.get(beanName);

2.不存在的时候:singletonObject = singletonFactory.getObject(); 创建bean

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(String, RootBeanDefinition, Object[])

3.在创建bean组件的之前,会给beanPostProcessor一个机会创建我们组件,如果返回null,那么继续执行bean的创建的过程

// // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
  	// 	直接返回
		return bean;
}

这里也是实现AOP的原理所在,我们可以用后置处理器返回代理对象

4.执行创建对象:Object beanInstance = doCreateBean(beanName, mbdToUse, args);

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(String, RootBeanDefinition, Object[])

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
			throws BeanCreationException {

		// 对象的包装类
		BeanWrapper instanceWrapper = null;
		if (mbd.isSingleton()) {
			instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
		}
		if (instanceWrapper == null) {
      // 创建bean实例
			instanceWrapper = createBeanInstance(beanName, mbd, args);
		}
		final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null);
		Class<?> beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null);
		mbd.resolvedTargetType = beanType;

		// Allow post-processors to modify the merged bean definition.
		synchronized (mbd.postProcessingLock) {
			if (!mbd.postProcessed) {
				try {
          // 调用 MergedBeanDefinitionPostProcessors 后置处理器
					applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
				}
				catch (Throwable ex) {
					throw new BeanCreationException(mbd.getResourceDescription(), beanName,
							"Post-processing of merged bean definition failed", ex);
				}
				mbd.postProcessed = true;
			}
		}

		// Eagerly cache singletons to be able to resolve circular references
		// even when triggered by lifecycle interfaces like BeanFactoryAware.
		boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
				isSingletonCurrentlyInCreation(beanName));
		if (earlySingletonExposure) {
			if (logger.isDebugEnabled()) {
				logger.debug("Eagerly caching bean '" + beanName +
						"' to allow for resolving potential circular references");
			}
			addSingletonFactory(beanName, new ObjectFactory<Object>() {
				@Override
				public Object getObject() throws BeansException {
					return getEarlyBeanReference(beanName, mbd, bean);
				}
			});
		}

		// Initialize the bean instance.
		Object exposedObject = bean;
		try {
      // 给对象进行赋值
			populateBean(beanName, mbd, instanceWrapper);
			if (exposedObject != null) {
        // 初始化bean组件
				exposedObject = initializeBean(beanName, exposedObject, mbd);
			}
		}
		catch (Throwable ex) {
			if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
				throw (BeanCreationException) ex;
			}
			else {
				throw new BeanCreationException(
						mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
			}
		}

		if (earlySingletonExposure) {
			Object earlySingletonReference = getSingleton(beanName, false);
			if (earlySingletonReference != null) {
				if (exposedObject == bean) {
					exposedObject = earlySingletonReference;
				}
				else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
					String[] dependentBeans = getDependentBeans(beanName);
					Set<String> actualDependentBeans = new LinkedHashSet<String>(dependentBeans.length);
					for (String dependentBean : dependentBeans) {
						if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
							actualDependentBeans.add(dependentBean);
						}
					}
					if (!actualDependentBeans.isEmpty()) {
						throw new BeanCurrentlyInCreationException(beanName,
								"Bean with name '" + beanName + "' has been injected into other beans [" +
								StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
								"] in its raw version as part of a circular reference, but has eventually been " +
								"wrapped. This means that said other beans do not use the final version of the " +
								"bean. This is often the result of over-eager type matching - consider using " +
								"'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
					}
				}
			}
		}

		// Register bean as disposable.
		try {
      // 注bean的销毁的方法
			registerDisposableBeanIfNecessary(beanName, bean, mbd);
		}
		catch (BeanDefinitionValidationException ex) {
			throw new BeanCreationException(
					mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
		}

		return exposedObject;
	}

在上面的方法中,主要看:

// 创建一个bean组件
instanceWrapper = createBeanInstance(beanName, mbd, args);
// 调用MergedBeanDefinitionPostProcessors后置处理器
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
// 给组件进行初始化、赋值
populateBean(beanName, mbd, instanceWrapper);
// 初始化对象
exposedObject = initializeBean(beanName, exposedObject, mbd);
protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {
		for (BeanPostProcessor bp : getBeanPostProcessors()) {
			if (bp instanceof MergedBeanDefinitionPostProcessor) {
				MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
				bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
			}
		}
	}

InstantiationAwareBeanPostProcessor

/**
	 * Initialize the given bean instance, applying factory callbacks
	 * as well as init methods and bean post processors.
	 * 

Called from {@link #createBean} for traditionally defined beans, * and from {@link #initializeBean} for existing bean instances. * @param beanName the bean name in the factory (for debugging purposes) * @param bean the new bean instance we may need to initialize * @param mbd the bean definition that the bean was created with * (can also be {@code null}, if given an existing bean instance) * @return the initialized bean instance (potentially wrapped) * @see BeanNameAware * @see BeanClassLoaderAware * @see BeanFactoryAware * @see #applyBeanPostProcessorsBeforeInitialization * @see #invokeInitMethods * @see #applyBeanPostProcessorsAfterInitialization */ protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) { if (System.getSecurityManager() != null) { AccessController.doPrivileged(new PrivilegedAction<Object>() { @Override public Object run() { // 调用XXXXAware BeanNameAware\BeanClassLoaderAware\BeanFactoryAware invokeAwareMethods(beanName, bean); return null; } }, getAccessControlContext()); } else { invokeAwareMethods(beanName, bean); } Object wrappedBean = bean; if (mbd == null || !mbd.isSynthetic()) { // 调用 bean的后置处理器的before方法 // BeanPostProcessor.postProcessBeforeInitialization() wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); } try { // 初始化 invokeInitMethods(beanName, wrappedBean, mbd); } catch (Throwable ex) { throw new BeanCreationException( (mbd != null ? mbd.getResourceDescription() : null), beanName, "Invocation of init method failed", ex); } if (mbd == null || !mbd.isSynthetic()) { // 调用 bean的后置处理器的After方法 // BeanPostProcessor.postProcessAfterInitialization() wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); } return wrappedBean; }

invokeInitMethods(beanName, wrappedBean, mbd);

/**
	 * Give a bean a chance to react now all its properties are set,
	 * and a chance to know about its owning bean factory (this object).
	 * This means checking whether the bean implements InitializingBean or defines
	 * a custom init method, and invoking the necessary callback(s) if it does.
	 * @param beanName the bean name in the factory (for debugging purposes)
	 * @param bean the new bean instance we may need to initialize
	 * @param mbd the merged bean definition that the bean was created with
	 * (can also be {@code null}, if given an existing bean instance)
	 * @throws Throwable if thrown by init methods or by the invocation process
	 * @see #invokeCustomInitMethod
	 */
	protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)
			throws Throwable {
		// 判断是否实现了InitializingBean的对象
		boolean isInitializingBean = (bean instanceof InitializingBean);
		if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
			if (logger.isDebugEnabled()) {
				logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
			}
			if (System.getSecurityManager() != null) {
				try {
					AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
						@Override
						public Object run() throws Exception {
							((InitializingBean) bean).afterPropertiesSet();
							return null;
						}
					}, getAccessControlContext());
				}
				catch (PrivilegedActionException pae) {
					throw pae.getException();
				}
			}
			else {
        // 这个时候会调用设置一些初始化的参数
				((InitializingBean) bean).afterPropertiesSet();
			}
		}

		if (mbd != null) {
			String initMethodName = mbd.getInitMethodName();
			if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
					!mbd.isExternallyManagedInitMethod(initMethodName)) {
        // 调用一些其他的方法
        也就是 init-method 等等
				invokeCustomInitMethod(beanName, bean, mbd);
			}
		}
	}

上面的这个过程就是创建一个组件的过程:

如果是新创建的,那么还要将这个组件添加到IOC容器中;

创建完bean的组件后

根据名字遍历所有的组件是否实现 SmartInitializingSingleton 的对象,如果是,执行

smartSingleton.afterSingletonsInstantiated();

14、第十二步:结束刷新,发布一些事件:finishRefresh();

/**
	 * Finish the refresh of this context, invoking the LifecycleProcessor's
	 * onRefresh() method and publishing the
	 * {@link org.springframework.context.event.ContextRefreshedEvent}.
	 */
	protected void finishRefresh() {
		// Initialize lifecycle processor for this context.
		initLifecycleProcessor();

		// Propagate refresh to lifecycle processor first.
		getLifecycleProcessor().onRefresh();

		// Publish the final event.
		publishEvent(new ContextRefreshedEvent(this));

		// Participate in LiveBeansView MBean, if active.
		LiveBeansView.registerApplicationContext(this);
}

至此,我们的spring容器就已经启动起来了,我们可以愉快的使用我们的容器为所欲为了。

你可能感兴趣的:(Spring)