title: 【学习之路】SpringIoC源码简单解析
draft: true
tags:
- 学习之路
- Java
- Spring
categories: - Java框架
- SSM
cover: https://cdn.jsdelivr.net/gh/CodeZixuan/Blog_Images/SpringIoCSource/bg.jpg
description: SpringIoC简单解析
date: 2021-03-15 16:13:30
创建Spring HelloWrold
public class IocTest {public static void main(String[] args) {// 在这行代码上上打上断点ApplicationContext ioc = new ClassPathXmlApplicationContext("conf/ioc.xml");Object person = ioc.getBean("person");System.out.println(person);}}
创建Person实体类
@AllArgsConstructor@ToString@Datapublic class Person {private String lastName;private Integer age;private String sex;public Person(){System.out.println("person创建了");}}
创建IoC配置文件
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="person" class="com.zixuan.my_spring.Person"><property name="lastName" value="张三"></property><property name="age" value="18"></property><property name="sex" value="男"></property></bean><bean id="person2" class="com.zixuan.my_spring.Person"><property name="lastName" value="李四"></property><property name="age" value="30"></property><property name="sex" value="男"></property></bean><bean id="person3" class="com.zixuan.my_spring.Person"><property name="lastName" value="王五"></property><property name="age" value="29"></property><property name="sex" value="男"></property></bean><bean id="person4" class="com.zixuan.my_spring.Person"></bean></beans>
源码解析
运行主方法,这时进入了ClassPathXmlApplicationContext这个类的构造器
public ClassPathXmlApplicationContext(String configLocation) throws BeansException {// 点击this进入当前方法this(new String[] {configLocation}, true, null);}
基本上所有的构造器都是调用this

点击this后进入当前方法
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)throws BeansException {// 可以试着放行方法,并且看控制台是否有打印super(parent);setConfigLocations(configLocations);if (refresh) {// 如果放行此方法,那么控制台就会打印所有创建Bean的信息refresh();}}
DeBug模式下按F7进入该方法,这时跳转到了AbstractApplicationContext这个类中
@Overridepublic void refresh() throws BeansException, IllegalStateException {// 同步锁保证多线程状态下IoC线程只会创建一次synchronized (this.startupShutdownMonitor) {// 准备容器刷新// Prepare this context for refreshing.prepareRefresh();// 创建一个ConfigurableListableBeanFactory打开当前类的继承树是BeanFactory的实现接口// Tell the subclass to refresh the internal bean factory.// 当前方法用于解析SpringIoC的XML文件,将XML文件中的Bean保存ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// Prepare the bean factory for use in this context.prepareBeanFactory(beanFactory);try {// Allows post-processing of the bean factory in context subclasses.postProcessBeanFactory(beanFactory);// Spring初始化自己所需的组件// Invoke factory processors registered as beans in the context.invokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.registerBeanPostProcessors(beanFactory);// Spring国际化功能// Initialize message source for this context.initMessageSource();// Initialize event multicaster for this context.initApplicationEventMulticaster();// 留给子类的方法,方法内部是一个空方法// Initialize other special beans in specific context subclasses.onRefresh();// Check for listener beans and register them.registerListeners();// 初始化所有没有懒加载的单列Bean,所有Bean加载内容在这个方法进行创建,进入当前方法查看Bean创建过程// Instantiate all remaining (non-lazy-init) singletons.finishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.finishRefresh();}catch (BeansException ex) {if (logger.isWarnEnabled()) {logger.warn("Exception encountered during context initialization - " +"cancelling refresh attempt: " + ex);}// Destroy already created singletons to avoid dangling resources.destroyBeans();// Reset 'active' flag.cancelRefresh(ex);// Propagate exception to caller.throw ex;}finally {// Reset common introspection caches in Spring's core, since we// might not ever need metadata for singleton beans anymore...resetCommonCaches();}}}
进入finishBeanFactoryInitialization(beanFactory);
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {// Initialize conversion service for this context.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));}// Register a default embedded value resolver if no bean post-processor// (such as a PropertyPlaceholderConfigurer bean) registered any before:// at this point, primarily for resolution in annotation attribute values.if (!beanFactory.hasEmbeddedValueResolver()) {beanFactory.addEmbeddedValueResolver(new StringValueResolver() {@Overridepublic String resolveStringValue(String strVal) {return getEnvironment().resolvePlaceholders(strVal);}});}// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);for (String weaverAwareName : weaverAwareNames) {getBean(weaverAwareName);}// Stop using the temporary ClassLoader for type matching.beanFactory.setTempClassLoader(null);// Allow for caching all bean definition metadata, not expecting further changes.beanFactory.freezeConfiguration();// 初始化所有的单列Bean,再次进入当前方法查看Bean创建过程// Instantiate all remaining (non-lazy-init) singletons.beanFactory.preInstantiateSingletons();}
再次进入beanFactory.preInstantiateSingletons();又跳转到了DefaultListableBeanFactory类中
@Overridepublic void preInstantiateSingletons() throws BeansException {if (logger.isDebugEnabled()) {logger.debug("Pre-instantiating singletons in " + this);}// Iterate over a copy to allow for init methods which in turn register new bean definitions.// While this may not be part of the regular factory bootstrap, it does otherwise work fine.// 拿到所有要创建Bean的名称并加锁List<String> beanNames = new ArrayList<String>(this.beanDefinitionNames);// 通过增强for循环依次创建Bean// Trigger initialization of all non-lazy singleton beans...for (String beanName : beanNames) {// 获取Bean的详细信息,判断当前Bean是否是抽象,是否是单列,是否是懒加载RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {if (isFactoryBean(beanName)) { // 判断当前Bean是否是工厂Bean,是否实现了FactoryBean接口的Beanfinal FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);boolean isEagerInit;if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {@Overridepublic Boolean run() {return ((SmartFactoryBean<?>) factory).isEagerInit();}}, getAccessControlContext());}else {isEagerInit = (factory instanceof SmartFactoryBean &&((SmartFactoryBean<?>) factory).isEagerInit());}if (isEagerInit) {getBean(beanName);}}else {// 当前方法如果放行就会创建一个Bean,这个方法中又Bean的具体实现getBean(beanName);}}}// Trigger post-initialization callback for all applicable beans...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>() {@Overridepublic Object run() {smartSingleton.afterSingletonsInstantiated();return null;}}, getAccessControlContext());}else {smartSingleton.afterSingletonsInstantiated();}}}}
进入getBean(beanName)跳转到AbstractBeanFactory类中
public Object getBean(String name) throws BeansException {return this.doGetBean(name, (Class)null, (Object[])null, false);}
再次进入doGetBean中
protected <T> T doGetBean(String name, Class<T> requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException {final String beanName = this.transformedBeanName(name);// 从已经注册的单实例Bean中检查是否有没有当前BeanObject sharedInstance = this.getSingleton(beanName);Object bean;if (sharedInstance != null && args == null) {if (this.logger.isDebugEnabled()) {if (this.isSingletonCurrentlyInCreation(beanName)) {this.logger.debug("Returning eagerly cached instance of singleton bean '" + beanName + "' that is not fully initialized yet - a consequence of a circular reference");} else {this.logger.debug("Returning cached instance of singleton bean '" + beanName + "'");}}bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, (RootBeanDefinition)null);} else {if (this.isPrototypeCurrentlyInCreation(beanName)) {throw new BeanCurrentlyInCreationException(beanName);}BeanFactory parentBeanFactory = this.getParentBeanFactory();if (parentBeanFactory != null && !this.containsBeanDefinition(beanName)) {String nameToLookup = this.originalBeanName(name);if (args != null) {return parentBeanFactory.getBean(nameToLookup, args);}return parentBeanFactory.getBean(nameToLookup, requiredType);}// 标记Bean已经创建if (!typeCheckOnly) {this.markBeanAsCreated(beanName);}try {// 获取Bean的定义信息final RootBeanDefinition mbd = this.getMergedLocalBeanDefinition(beanName);this.checkMergedBeanDefinition(mbd, beanName, args);// 拿到创建当前需要创建的Bean,depends-on属性,如果有就循环创建String[] dependsOn = mbd.getDependsOn();String[] var11;if (dependsOn != null) {var11 = dependsOn;int var12 = dependsOn.length;for(int var13 = 0; var13 < var12; ++var13) {String dep = var11[var13];if (this.isDependent(beanName, dep)) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");}this.registerDependentBean(dep, beanName);try {this.getBean(dep);} catch (NoSuchBeanDefinitionException var24) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "'" + beanName + "' depends on missing bean '" + dep + "'", var24);}}}// 如果mbd是单列的就创建Bean实列if (mbd.isSingleton()) {// 获取当前Bean,进入当前方法sharedInstance = this.getSingleton(beanName, new ObjectFactory<Object>() {public Object getObject() throws BeansException {try {// 创建Bean过程return AbstractBeanFactory.this.createBean(beanName, mbd, args);} catch (BeansException var2) {AbstractBeanFactory.this.destroySingleton(beanName);throw var2;}}});bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, mbd);} else if (mbd.isPrototype()) {var11 = null;Object prototypeInstance;try {this.beforePrototypeCreation(beanName);prototypeInstance = this.createBean(beanName, mbd, args);} finally {this.afterPrototypeCreation(beanName);}bean = this.getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);} else {String scopeName = mbd.getScope();Scope scope = (Scope)this.scopes.get(scopeName);if (scope == null) {throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");}try {Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() {public Object getObject() throws BeansException {AbstractBeanFactory.this.beforePrototypeCreation(beanName);Object var1;try {var1 = AbstractBeanFactory.this.createBean(beanName, mbd, args);} finally {AbstractBeanFactory.this.afterPrototypeCreation(beanName);}return var1;}});bean = this.getObjectForBeanInstance(scopedInstance, name, beanName, mbd);} catch (IllegalStateException var23) {throw new BeanCreationException(beanName, "Scope '" + scopeName + "' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton", var23);}}} catch (BeansException var26) {this.cleanupAfterBeanCreationFailure(beanName);throw var26;}}if (requiredType != null && bean != null && !requiredType.isInstance(bean)) {try {return this.getTypeConverter().convertIfNecessary(bean, requiredType);} catch (TypeMismatchException var25) {if (this.logger.isDebugEnabled()) {this.logger.debug("Failed to convert bean '" + name + "' to required type '" + ClassUtils.getQualifiedName(requiredType) + "'", var25);}throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}} else {return bean;}}
进入到getSingleton(beanName, new ObjectFactory<Object>())
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {Assert.notNull(beanName, "'beanName' must not be null");synchronized (this.singletonObjects) {// 先从singletonObjects中通过bean的名称获取bean对象,// singletonObjects是当前类定义的一个Map,也就是Bean存储在一个Map中Object singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null) {if (this.singletonsCurrentlyInDestruction) {throw new BeanCreationNotAllowedException(beanName,"Singleton bean creation not allowed while singletons of this factory are in destruction " +"(Do not request a bean from a BeanFactory in a destroy method implementation!)");}if (logger.isDebugEnabled()) {logger.debug("Creating shared instance of singleton bean '" + beanName + "'");}beforeSingletonCreation(beanName);boolean newSingleton = false;boolean recordSuppressedExceptions = (this.suppressedExceptions == null);if (recordSuppressedExceptions) {this.suppressedExceptions = new LinkedHashSet<Exception>();}try {// 通过反射创建Bean对象singletonObject = singletonFactory.getObject();newSingleton = true;}catch (IllegalStateException ex) {// Has the singleton object implicitly appeared in the meantime ->// if yes, proceed with it since the exception indicates that state.singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null) {throw ex;}}catch (BeanCreationException ex) {if (recordSuppressedExceptions) {for (Exception suppressedException : this.suppressedExceptions) {ex.addRelatedCause(suppressedException);}}throw ex;}finally {if (recordSuppressedExceptions) {this.suppressedExceptions = null;}afterSingletonCreation(beanName);}if (newSingleton) {// 添加单实例Bean存储到singletonObject中addSingleton(beanName, singletonObject);}}return (singletonObject != NULL_OBJECT ? singletonObject : null);}}
singletonObject是一个Map,当前bean的名字为key,value为当前存储的Bean对象

进入addSingleton(beanName, singletonObject);
protected void addSingleton(String beanName, Object singletonObject) {synchronized (this.singletonObjects) {// 将Bean对象加入到Map中this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT));this.singletonFactories.remove(beanName);this.earlySingletonObjects.remove(beanName);this.registeredSingletons.add(beanName);}}
