Spring源码解析入门

 Srping入口

BeanFactory bf = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));

Test test = (Test)bf.getBean("test");

XmlBeanFactory类图

 从上往下,从左到右,依次为:

  1. AliasRegistry:定义对alias的简单增删改查(alias指的是别名)
  2. BeanDefinitionRegistry:定义对BeanDefinition的各种增删改查(BeanDefinition存储着配置文件中Bean的信息)
  3. SimpleAliasRegistry:实现AliasRegistry,使用map作为alias的缓存
  4. SingletonBeanRegistry:定义对单例的注册及获取
  5. BeanFactory:定义获取Bean及Bean的各种属性
  6. DefaultSingletonBeanRegistry:对SingletonBeanRegistry函数的实现
  7. HierarchicalBeanFactory:继承BeanFactory,也就是在BeanFactory定义的功能的基础上增加了对parentFactory的支持
  8. ListableBeanFactory:根据各种条件获取bean的配置清单
  9. FactoryBeanRegistrySupport:在DefaultSingletonBeanRegistry基础上增加了对FactoryBean的特殊处理功能
  10. ConfigurableBeanFactory:提供配置Factory的各种方法(类似ClassLoader、类型转换器等等)
  11. AbstractBeanFactory:实现FactoryBeanRegistrySupport和ConfigurableBeanFactory的功能
  12. AutowireCapableBeanFactory:提供创建Bean、自动注入、初始化以及应用Bean的后处理器
  13. AbstractAutowireCapableBeanFactory:综合AbstractBeanFactory并且实现AutowireCapableBeanFactory

上面的解释很枯燥,而且看起来很庞大,我们先不管上面的类有什么用,大概知道体系是这样就行了。

Spring执行的顺序是 读取配置文件 把配置信息填充到 BeanDefinition(包括别名、类的全限命名、属性、id等等)  然后根据BeanDefinition的信息进行创建Bean。

按道理我们应该按顺序分析源码时应该从读取配置文件开始,但是如果我们假定这个过程已经完成,就像是我们在配置文件中配置一个Bean,如下:

<bean id="test" class="com.spring.test" />

并且这个bean标签中的id属性、class属性已经填充到BeanDefinition,实际上这是一个解析XML文件的过程,我们可以跳过,我们应该专注到点上--Spring是如何利用这些信息创建加载Bean。

如果现在Spring没有被设计出来或者不存在,单靠class的全限命名,通过反射就可以获取一个实例,假设这个bean有个属性,通过set的方式注入这个属性,这是我认为的最本质的东西,从这个角度上来讲,也就实现了解耦了,因为当class改变了之后,生成的实例也会跟着变,而java代码没有发生变动。但是Spring做的东西太多太多,例如配置文件以字符串的形式存着,而这个属性是整数型,在这个过程中也需要进行类型转换,当然还有其他功能像AOP。

虽然我们跳过了读取配置文件的过程中,但我先总结一下这个过程,把这个文件封装到ClassPathResource文件,然后将该文件转换成流,通过dom4j去解析这个流,从root节点往下解析,然后按照标签分别填充到BeanDefinition属性当中。来执行这个过程的类是XmlBeanDefinitionReader。

直接探索Bean加载过程:

bf.getBean("test");

getBean 

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

doGetBean 

protected <T> T doGetBean(
			final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)
			throws BeansException {

     //假设a是b的别名,b是c的别名,这个函数是将a转换到c
	final String beanName = transformedBeanName(name);
	Object bean;

	//尝试从缓存获取该bean(这里的缓存指的是三级缓存 分别是singletonObjects、earlySingletonObjects、singletonFactories)
	Object sharedInstance = getSingleton(beanName);
	if (sharedInstance != null && args == null) {
		if (logger.isDebugEnabled()) {
			if (isSingletonCurrentlyInCreation(beanName)) {
				logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +
						"' that is not fully initialized yet - a consequence of a circular reference");
			}
			else {
				logger.debug("Returning cached instance of singleton bean '" + beanName + "'");
			}
		}
        
           
        //返回对象的实例,有时候存在诸如BeanFactory的情况并不是直接返回实例本身而是返回指定方法返回的实例
		bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
	}

	else {
        //如果该beanName处于创建当中或者完成但是从缓存中获取不到
        //我们可以假定是在循环引用当中
		if (isPrototypeCurrentlyInCreation(beanName)) {
			throw new BeanCurrentlyInCreationException(beanName);
		}

		//如果该beanName在该beanFactory获取不到,我们可以尝试从parentBeanFactory中获取
		BeanFactory parentBeanFactory = getParentBeanFactory();
       
		if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
			// Not found -> check parent.
			String nameToLookup = originalBeanName(name);
			if (args != null) {
				// Delegation to parent with explicit args.
				return (T) parentBeanFactory.getBean(nameToLookup, args);
			}
			else {
				// No args -> delegate to standard getBean method.
				return parentBeanFactory.getBean(nameToLookup, requiredType);
			}
		}
        
        //如果不是仅仅做类型检查则创建bean,并且要进行记录
		if (!typeCheckOnly) {
			markBeanAsCreated(beanName);
		}

		try {
            //合并主要是和父类BeanDefinition合并
            //首先获取父类的Beanfinition
            //然后override父类的方法
            //然而某些属性保留父类 像scope
			final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);

            //检查mbd是否为abstract,因为抽象类不能实例化
			checkMergedBeanDefinition(mbd, beanName, args);

			// 保证初始化当前bean所依赖的bean.
			String[] dependsOn = mbd.getDependsOn();
			if (dependsOn != null) {
				for (String dependsOnBean : dependsOn) {
					if (isDependent(beanName, dependsOnBean)) {
						throw new BeanCreationException(mbd.getResourceDescription(), beanName,
								"Circular depends-on relationship between '" + beanName + "' and '" + dependsOnBean + "'");
					}
					registerDependentBean(dependsOnBean, beanName);
                    //这里getBean是将该Bean存在缓存当中,等到注入的时候从缓存中获取
					getBean(dependsOnBean);
				}
			}

			// 如果从缓存中获取不到而且不存在循环依赖则开始创建.
			if (mbd.isSingleton()) {
                //这里实现匿名内部类和匿名对象 实现ObjectFactory中的getObject方法
                //并且将createBean作为回调函数
				sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
					@Override
					public Object getObject() throws BeansException {
						try {
							return createBean(beanName, mbd, args);
						}
						catch (BeansException ex) {
							// Explicitly remove instance from singleton cache: It might have been put there
							// eagerly by the creation process, to allow for circular reference resolution.
							// Also remove any beans that received a temporary reference to the bean.
							destroySingleton(beanName);
							throw ex;
						}
					}
				});
				bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
			}

			else if (mbd.isPrototype()) {
				// It's a prototype -> create a new instance.
				Object prototypeInstance = null;
				try {
                    //原型模式下由于不需要缓存可以直接创建createBean
                    //这里需要记录下状态,因为原型状态下不能解决循环依赖
                    //若出现循环依赖并且检测到状态为原型则抛出异常
					beforePrototypeCreation(beanName);
					prototypeInstance = createBean(beanName, mbd, args);
				}
				finally {
					afterPrototypeCreation(beanName);
				}
				bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
			}

			else {
                //其他scope的情况
				String scopeName = mbd.getScope();
				final Scope scope = this.scopes.get(scopeName);
				if (scope == null) {
					throw new IllegalStateException("No Scope registered for scope '" + scopeName + "'");
				}
				try {
					Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() {
						@Override
						public Object getObject() throws BeansException {
							beforePrototypeCreation(beanName);
							try {
								return createBean(beanName, mbd, args);
							}
							finally {
								afterPrototypeCreation(beanName);
							}
						}
					});
					bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
				}
				catch (IllegalStateException ex) {
					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",
							ex);
				}
			}
		}
		catch (BeansException ex) {
			cleanupAfterBeanCreationFailure(beanName);
			throw ex;
		}
	}

从上面一段代码我们总结一下这个函数的流程,如果是单例,则访问单例缓存是否存在,如果存在则返回,如果不存在则从ParentBeanFactory获取,如果仍然不存在则根据Scope来创建实例。

上面代码中多次出现的代码

bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);

 getObjectForBeanInstance

protected Object getObjectForBeanInstance(
        Object beanInstance, String name, String beanName, RootBeanDefinition mbd) {

    //如果指定的name是工厂相关的(以&为前缀)且beanInstance又不是Factory类型则抛出异常.
    if (BeanFactoryUtils.isFactoryDereference(name) && !(beanInstance instanceof FactoryBean)) {
        throw new BeanIsNotAFactoryException(transformedBeanName(name), beanInstance.getClass());
    }

    // 现在我们已经有bean实例,这个实例有可能是正常的bean或者是FactoryBean.
    // 如果是FactoryBean我们使用它创建实例,如果用户用户想要直接获取工厂实例而不是工厂的getObject方法对应的实例那么传入的name应该加入前缀&
    
    //这个方法如果不是Factory 或者 要直接返回工厂实例 则return
    if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
        return beanInstance;
    }

    //那么下面的情况是通过FactoryBean间接获取实例
    Object object = null;
    if (mbd == null) {
        //尝试从缓存中获取
        object = getCachedObjectForFactoryBean(beanName);
    }
    if (object == null) {
        
        FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
        //将存储XML配置文件的GernericBeanDefinition转换为RootBeanDefinition 如果指定BeanName是子bean的话则同时合并父类的属性.
        if (mbd == null && containsBeanDefinition(beanName)) {
            mbd = getMergedLocalBeanDefinition(beanName);
        }
        //是否是用户定义的而不是应用程序本身定义的
        boolean synthetic = (mbd != null && mbd.isSynthetic());
        object = getObjectFromFactoryBean(factory, beanName, !synthetic);
    }
    return object;
}

getObjectFromFactoryBean 

protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName, boolean shouldPostProcess) {
    //这里两个条件分别判断factory生成的实例是否是单例的 以及 factory本身是否是单例
    //因为如果factory生成的实例是单例而factory本身不是单例
    if (factory.isSingleton() && containsSingleton(beanName)) {
        synchronized (getSingletonMutex()) {
            Object object = this.factoryBeanObjectCache.get(beanName);
            if (object == null) {

                //这里是最关键的地方 调用FactoryBean接口的getObject()方法
                object = doGetObjectFromFactoryBean(factory, beanName);

                //alreadyThere的出现有可能是doGetObjectFromFactoryBean
                //调用了factoryBeanObjectCache的get方法
                Object alreadyThere = this.factoryBeanObjectCache.get(beanName);
                if (alreadyThere != null) {
                    object = alreadyThere;
                }
                else {
                    if (object != null && shouldPostProcess) {
                        try {
                            //BeanPostProcessor后置处理器postProcessAfterInitialization                          
                            object = postProcessObjectFromFactoryBean(object, beanName);
                        }
                        catch (Throwable ex) {
                            throw new BeanCreationException(beanName,
                                    "Post-processing of FactoryBean's singleton object failed", ex);
                        }
                    }
                    //缓存单例实例
                    this.factoryBeanObjectCache.put(beanName, (object != null ? object : NULL_OBJECT));
                }
            }
            return (object != NULL_OBJECT ? object : null);
        }
    }
    else {
        Object object = doGetObjectFromFactoryBean(factory, beanName);
        if (object != null && shouldPostProcess) {
            try {
                object = postProcessObjectFromFactoryBean(object, beanName);
            }
            catch (Throwable ex) {
                throw new BeanCreationException(beanName, "Post-processing of FactoryBean's object failed", ex);
            }
        }
        return object;
    }
}

doGetObjectFromFactoryBean 

private Object doGetObjectFromFactoryBean(final FactoryBean<?> factory, final String beanName)
        throws BeanCreationException {

    Object object;
    try {
        if (System.getSecurityManager() != null) {
            AccessControlContext acc = getAccessControlContext();
            try {
                object = AccessController.doPrivileged((PrivilegedExceptionAction<Object>) factory::getObject, acc);
            }
            catch (PrivilegedActionException pae) {
                throw pae.getException();
            }
        }
        else {
            object = factory.getObject();
        }
    }
    catch (FactoryBeanNotInitializedException ex) {
        throw new BeanCurrentlyInCreationException(beanName, ex.toString());
    }
    catch (Throwable ex) {
        throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);
    }

    // Do not accept a null value for a FactoryBean that's not fully
    // initialized yet: Many FactoryBeans just return null then.
    if (object == null) {
        if (isSingletonCurrentlyInCreation(beanName)) {
            throw new BeanCurrentlyInCreationException(
                    beanName, "FactoryBean which is currently in creation returned null from getObject");
        }
        object = new NullBean();
    }
    return object;
}

接下来下面我们来重点关注一下单例模式下创建Bean的过程

当从三级缓存以及ParentBeanFactory找不到该实例时,则开始创建Bean

if (mbd.isSingleton()) {
	sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
	@Override
	public Object getObject() throws BeansException {
		try {
            //将createBean作为回调函数return
			return createBean(beanName, mbd, args);
		}
		catch (BeansException ex) {
			// Explicitly remove instance from singleton cache: It might have been put there
		    // eagerly by the creation process, to allow for circular reference resolution.
			// Also remove any beans that received a temporary reference to the bean.
			destroySingleton(beanName);
			throw ex;
		}
	}
});
	bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}

getSingleton(String beanName, ObjectFactory<?> singletonFactory)

public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
    Assert.notNull(beanName, "'beanName' must not be null");
    synchronized (this.singletonObjects) {
        
        //第二次从一级缓存中获取
        Object singletonObject = this.singletonObjects.get(beanName);
        if (singletonObject == null) {
            
            if (this.singletonsCurrentlyInDestruction) {
                throw new BeanCreationNotAllowedException(beanName,
                        "Singleton bean creation not allowed while the 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 + "'");
            }
            //记录SingleCreation状态
            beforeSingletonCreation(beanName);
            boolean newSingleton = false;
            
            boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
            if (recordSuppressedExceptions) {
                this.suppressedExceptions = new LinkedHashSet<Exception>();
            }
            try {
                //调用getObject方法,从而调用回调函数createBean
                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) {
                addSingleton(beanName, singletonObject);
            }
        }
        return (singletonObject != NULL_OBJECT ? singletonObject : null);
    }
}

createBean 

protected abstract Object createBean(String beanName, RootBeanDefinition mbd, Object[] args)
        throws BeanCreationException;
@Override
protected Object createBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
        throws BeanCreationException {

    if (logger.isDebugEnabled()) {
        logger.debug("Creating instance of bean '" + beanName + "'");
    }
    // 确保此时bean类已经被实际解析.
    // 由于class在BeanDefinition以String的方式存储,而真正的Class<?>类型的beanClass属性需要用
    // classLoader来loadClass来返回Class<?>对象
    resolveBeanClass(mbd, beanName);

    //准备MethodOverride.
    try {
        mbd.prepareMethodOverrides();
    }
    catch (BeanDefinitionValidationException ex) {
        throw new BeanDefinitionStoreException(mbd.getResourceDescription(),
                beanName, "Validation of method overrides failed", ex);
    }

    try {

        //给后置处理器一个机会来返回一个代理对象并替换目标对象
        Object bean = resolveBeforeInstantiation(beanName, mbd);
        if (bean != null) {
            return bean;
        }
    }
    catch (Throwable ex) {
        throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                "BeanPostProcessor before instantiation of bean failed", ex);
    }
    //开始真正创建bean
    Object beanInstance = doCreateBean(beanName, mbd, args);
    if (logger.isDebugEnabled()) {
        logger.debug("Finished creating instance of bean '" + beanName + "'");
    }
    return beanInstance;
}

resolveBeforeInstantiation

@Nullable
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
    Object bean = null;
    if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
        // mbd是非合成的 并且有InstantiationAwareBeanPostProcessors的情况下
        if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
            //确定TargetType
            Class<?> targetType = determineTargetType(beanName, mbd);
            if (targetType != null) {
                bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
                if (bean != null) {
                    bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
                }
            }
        }
        mbd.beforeInstantiationResolved = (bean != null);
    }
    return bean;
}

determineTargetType

@Nullable
protected Class<?> determineTargetType(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) {
    //首先从targetType target为bean最终的目标class
    Class<?> targetType = mbd.getTargetType();
    if (targetType == null) {
        //如果为targetType为空 可以从factorymethod中获取返回的type
        //或者解析mbd获取BeanClass
        targetType = (mbd.getFactoryMethodName() != null ?
                getTypeForFactoryMethod(beanName, mbd, typesToMatch) :
                resolveBeanClass(mbd, beanName, typesToMatch));
        if (ObjectUtils.isEmpty(typesToMatch) || getTempClassLoader() == null) {
            mbd.resolvedTargetType = targetType;
        }
    }
    return targetType;
}

resolveBeanClass

@Nullable
protected Class<?> resolveBeanClass(final RootBeanDefinition mbd, String beanName, final Class<?>... typesToMatch)
        throws CannotLoadBeanClassException {

    try {
        //如果mbd已经解析了beanclass直接return
        if (mbd.hasBeanClass()) {
            return mbd.getBeanClass();
        }
        if (System.getSecurityManager() != null) {
            return AccessController.doPrivileged((PrivilegedExceptionAction<Class<?>>) () ->
                    doResolveBeanClass(mbd, typesToMatch), getAccessControlContext());
        }
        //如果没有解析 则开始解析
        else {
            return doResolveBeanClass(mbd, typesToMatch);
        }
    }
    catch (PrivilegedActionException pae) {
        ClassNotFoundException ex = (ClassNotFoundException) pae.getException();
        throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), ex);
    }
    catch (ClassNotFoundException ex) {
        throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), ex);
    }
    catch (LinkageError err) {
        throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), err);
    }
}

doResolveBeanClass

@Nullable
private Class<?> doResolveBeanClass(RootBeanDefinition mbd, Class<?>... typesToMatch)
        throws ClassNotFoundException {
    // 这里首先获取 对应的ClassLoader ,从 当前的Thread级别->class级别->system级别 获取
    ClassLoader beanClassLoader = getBeanClassLoader();
    ClassLoader dynamicLoader = beanClassLoader;
    boolean freshResolve = false;

    if (!ObjectUtils.isEmpty(typesToMatch)) {
        // When just doing type checks (i.e. not creating an actual instance yet),
        // use the specified temporary class loader (e.g. in a weaving scenario).
        //如果仅仅做类型检查 则使用特定的临时的类加载器
        ClassLoader tempClassLoader = getTempClassLoader();
        if (tempClassLoader != null) {
            dynamicLoader = tempClassLoader;
            freshResolve = true;
            if (tempClassLoader instanceof DecoratingClassLoader) {
                DecoratingClassLoader dcl = (DecoratingClassLoader) tempClassLoader;
                for (Class<?> typeToMatch : typesToMatch) {
                    //排除该class
                    //如果你不想你的类被自定义的类加载器管理,可以把它添加到集合当中
                    //这样就是使用jdk默认的类加载机制
                    dcl.excludeClass(typeToMatch.getName());
                }
            }
        }
    }
    
    //获取mbd中String类型的beanclassname
    String className = mbd.getBeanClassName();
    if (className != null) {
        //这里用到了SPEL表达式解析器 是因为这个String类型的beanClassName可能用到该表达式
        Object evaluated = evaluateBeanDefinitionString(className, mbd);
        if (!className.equals(evaluated)) {
            // A dynamically resolved expression, supported as of 4.2...
            //如果解析成功并且解析的值为Class类型直接返回
            if (evaluated instanceof Class) {
                return (Class<?>) evaluated;
            }
            else if (evaluated instanceof String) {
                //如果仍为String类型 需要loadClass
                className = (String) evaluated;
                freshResolve = true;
            }
            else {
                throw new IllegalStateException("Invalid class name expression result: " + evaluated);
            }
        }
        //freshResolve为true的条件有两个
        //第一个temporary class loader不为空
        //第二个通过spel解析器解析的值仍为String类型时
        if (freshResolve) {
            // When resolving against a temporary class loader, exit early in order
            // to avoid storing the resolved Class in the bean definition.
                      
            //符合第一个条件
            if (dynamicLoader != null) {
                try {
                    return dynamicLoader.loadClass(className);
                }
                catch (ClassNotFoundException ex) {
                    if (logger.isTraceEnabled()) {
                        logger.trace("Could not load class [" + className + "] from " + dynamicLoader + ": " + ex);
                    }
                }
            }
            //符合第二个条件(这时dynamicLoader虽然为空 但是进入函数后会获取默认的类加载器)
            return ClassUtils.forName(className, dynamicLoader);
        }
    }

    // 如果beanclassname为null 正常处理beanclass
    return mbd.resolveBeanClass(beanClassLoader);
}

如果有错误指出,下一节分析如何真正创建bean。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring源码解析是指对Spring框架的源代码进行深入分析和解读的过程。Spring框架是一个开源的Java企业级应用程序框架,提供了高度灵活和可扩展的开发环境。 Spring框架的源代码解析涉及了众多的模块和组件,包括核心容器、AOP(面向切面编程)、数据访问、Web开发等。通过对这些模块和组件的源代码进行解析,我们可以更加深入地了解Spring框架的工作原理和设计思想。 Spring源码解析的好处在于,可以帮助我们更好地理解Spring框架的各种功能和特性,并且能够帮助开发人员更加高效地使用和定制Spring框架,解决实际项目开发中的问题。 在进行Spring源码解析时,我们可以关注一些关键的概念和类,比如BeanFactory、ApplicationContext、BeanPostProcessor、AOP代理等。这些核心类和概念是理解Spring框架工作机制的重要基础。 进行Spring源码解析时,我们可以使用一些常见的工具和方法,比如IDE(集成开发环境)的调试功能、查看和分析源代码的注释和文档、调试和运行项目的示例代码等。 通过Spring源码解析,我们可以学到很多有关软件开发的知识和经验,比如面向对象编程、设计模式、依赖注入、控制反转等。这些知识和经验对于我们提升自己的技术水平和解决实际项目中的问题都有很大的帮助。 总之,Spring源码解析是一项非常有价值的学习和研究工作,可以帮助我们更好地理解和应用Spring框架,提高自己的技术能力和软件开发水平。希望以上的回答能够满足您的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值