一、AbstractApplicationContext类
@Override
public void refresh( ) throws BeansException, IllegalStateException {
synchronized ( this.startupShutdownMonitor) {
// Prepare this context for refreshing.
//准备工作 包括:设置启动时间,释放激活标志位,初始化属性源( property source) 配置
prepareRefresh( ) ;
// Tell the subclass to refresh the internal bean factory.
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) ;
// Invoke factory processors registered as beans in the context.
//在spring中执行已经注册的Factory Processors,
//类的扫描就是在这里进行的,它的作用是在bean初始化之前做一些干预
//设置执行自定义的ProcessBeanFactory和spring内部自定义的
invokeBeanFactoryPostProcessors( beanFactory) ;
// Register bean processors that intercept bean creation.
//注册BeanPostProcessors,BeanPostProcessors的作用是
//在bean初始化的时候进行干预,比如说进行AOP,这里只是注册,并不会执行
registerBeanPostProcessors( beanFactory) ;
// Initialize message source for this context.
//为上下文初始化Message源,即不同的语言的消息体,国际化处理
initMessageSource( ) ;
// Initialize event multicaster for this context.
//初始化应用消息广播器,并放入 applicationEventMulticaster
initApplicationEventMulticaster( ) ;
// Initialize other special beans in specific context subclasses.
//留给子类初始化其他的bean
onRefresh( ) ;
// Check for listener beans and register them.
//在所有注册的bean中查找Listener bean,注册到消息广播器中
registerListeners( ) ;
// Instantiate all remaining ( non-lazy-init) singletons.
//这个方法非常重要,依赖注入和AOP就是在这里进行的
finishBeanFactoryInitialization( beanFactory) ;
// Last step: publish corresponding event.
//完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent通知别人
finishRefresh( ) ;
}
catch ( BeansException ex) {
.. .. ..
}
finally {
.. .. ..
}
}
}
二、AbstractApplicationContext类
protected void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory) {
//getBeanFactoryPostProcessors( ) 得到自己定义的(就是程序员自己写的,并且没有交给spring管理,就是没有加上@Component)
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors( beanFactory, getBeanFactoryPostProcessors( )) ;
.. .. ..
}
三、PostProcessorRegistrationDelegate类
public static void invokeBeanFactoryPostProcessors(
ConfigurableListableBeanFactory beanFactory, List< BeanFactoryPostProcessor> beanFactoryPostProcessors) {
// Invoke BeanDefinitionRegistryPostProcessors first, if any.
Set< String> processedBeans = new HashSet< > ( ) ;
if ( beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = ( BeanDefinitionRegistry) beanFactory;
List< BeanFactoryPostProcessor> regularPostProcessors = new ArrayList< > ( ) ;
List< BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList< > ( ) ;
//自定义的BeanFactoryPostProcessor( BeanFactoryPostProcessor,BeanDefinitionRegistryPostProcessor继承关系的两个类)
for ( BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
if ( postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryProcessor =
( BeanDefinitionRegistryPostProcessor) postProcessor;
registryProcessor.postProcessBeanDefinitionRegistry( registry) ;
registryProcessors.add( registryProcessor) ;
}
else {
regularPostProcessors.add( postProcessor) ;
}
}
// Do not initialize FactoryBeans here: We need to leave all regular beans
// uninitialized to let the bean factory post-processors apply to them!
// Separate between BeanDefinitionRegistryPostProcessors that implement
// PriorityOrdered, Ordered, and the rest.
//存放的是spring内部自己实现了BeanDefinitionRegistryPostProcessor接口的
List< BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList< > ( ) ;
// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
//根据bean的类型获取bean的名字
String[ ] postProcessorNames =
beanFactory.getBeanNamesForType( BeanDefinitionRegistryPostProcessor.class, true, false) ;
//这个地方可以得到一个BeanFactoryPostProcessor,因为是spring默认在最开始自己注册的
//为什么要在最开始注册这个呢
//因为spring的工厂需要解析去扫描等等功能
//而这些功能都是需要在spring工厂初始化完成之前经行
//要么在工厂最开始的时候,要么在工厂初始化之中,反正不能再之后
//因为如果在之后就没有意义,因为那个时候需要使用工厂了
//所以这里spring在一开始就注册了一个这个地方可以得到一个BeanFactoryPostProcessor,用来插手springFactory的实例化过程
//在这个地方断点可以知道这个类型叫做ConfigurationClassPostProcessor
for ( String ppName : postProcessorNames) {
if ( beanFactory.isTypeMatch( ppName, PriorityOrdered.class)) {
currentRegistryProcessors.add( beanFactory.getBean( ppName, BeanDefinitionRegistryPostProcessor.class)) ;
processedBeans.add( ppName) ;
}
}
//排序,不重要
sortPostProcessors( currentRegistryProcessors, beanFactory) ;
//合并list,不重要
registryProcessors.addAll( currentRegistryProcessors) ;
//很重要,主要这里是方法调用
//执行所有BeanDefinitionRegistryPostProcessor
invokeBeanDefinitionRegistryPostProcessors( currentRegistryProcessors, registry) ;
//清除临时变量
currentRegistryProcessors.clear( ) ;
// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
postProcessorNames = beanFactory.getBeanNamesForType( BeanDefinitionRegistryPostProcessor.class, true, false) ;
for ( String ppName : postProcessorNames) {
if ( ! processedBeans.contains( ppName) && beanFactory.isTypeMatch( ppName, Ordered.class)) {
currentRegistryProcessors.add( beanFactory.getBean( ppName, BeanDefinitionRegistryPostProcessor.class)) ;
processedBeans.add( ppName) ;
}
}
sortPostProcessors( currentRegistryProcessors, beanFactory) ;
registryProcessors.addAll( currentRegistryProcessors) ;
invokeBeanDefinitionRegistryPostProcessors( currentRegistryProcessors, registry) ;
currentRegistryProcessors.clear( ) ;
// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
boolean reiterate = true ;
while ( reiterate) {
reiterate = false ;
postProcessorNames = beanFactory.getBeanNamesForType( BeanDefinitionRegistryPostProcessor.class, true, false) ;
for ( String ppName : postProcessorNames) {
if ( ! processedBeans.contains( ppName)) {
currentRegistryProcessors.add( beanFactory.getBean( ppName, BeanDefinitionRegistryPostProcessor.class)) ;
processedBeans.add( ppName) ;
reiterate = true ;
}
}
sortPostProcessors( currentRegistryProcessors, beanFactory) ;
registryProcessors.addAll( currentRegistryProcessors) ;
invokeBeanDefinitionRegistryPostProcessors( currentRegistryProcessors, registry) ;
currentRegistryProcessors.clear( ) ;
}
// Now, invoke the postProcessBeanFactory callback of all processors handled so far.
//执行BeanFactoryPostProcessor的回调
//前面执行的是BeanFactoryPostProcessor的子类BeanDefinitionRegistryPostProcessor的回调
//这里执行的是BeanFactoryPostProcessor的回调
invokeBeanFactoryPostProcessors( registryProcessors, beanFactory) ;
//执行自定义的BeanFactoryPostProcessor
invokeBeanFactoryPostProcessors( regularPostProcessors, beanFactory) ;
}
else {
// Invoke factory processors registered with the context instance.
invokeBeanFactoryPostProcessors( beanFactoryPostProcessors, beanFactory) ;
}
.. .. ..
}
四、PostProcessorRegistrationDelegate类
private static void invokeBeanDefinitionRegistryPostProcessors(
Collection< ? extends BeanDefinitionRegistryPostProcessor> postProcessors, BeanDefinitionRegistry registry) {
for ( BeanDefinitionRegistryPostProcessor postProcessor : postProcessors) {
postProcessor.postProcessBeanDefinitionRegistry( registry) ;
}
}
五、ConfigurationClassPostProcessor类
@Override
public void postProcessBeanDefinitionRegistry( BeanDefinitionRegistry registry) {
.. .. ..
processConfigBeanDefinitions( registry) ;
}
六、ConfigurationClassPostProcessor类
public void processConfigBeanDefinitions( BeanDefinitionRegistry registry) {
//定义一个list,存放app提供的bean
List< BeanDefinitionHolder> configCandidates = new ArrayList< > ( ) ;
//获取容器中注册的所有bd名字
String[ ] candidateNames = registry.getBeanDefinitionNames( ) ;
/*
*/
for ( String beanName : candidateNames) {
BeanDefinition beanDef = registry.getBeanDefinition( beanName) ;
if ( ConfigurationClassUtils.isFullConfigurationClass( beanDef) ||
ConfigurationClassUtils.isLiteConfigurationClass( beanDef)) {
if ( logger.isDebugEnabled( )) {
logger.debug( "Bean definition has already been processed as a configuration class: " + beanDef) ;
}
}
//判断是否是Configuration类,如果加了Configuration,下面这几个注解就不在判断
//Component,ComponentScan,ImportResource,Import
else if ( ConfigurationClassUtils.checkConfigurationClassCandidate( beanDef, this.metadataReaderFactory)) {
//configCandidates可以看成是一个数据结构
configCandidates.add( new BeanDefinitionHolder( beanDef, beanName)) ;
}
}
// Return immediately if no @Configuration classes were found
if ( configCandidates.isEmpty( )) {
return ;
}
// Sort by previously determined @Order value, if applicable
configCandidates.sort(( bd1, bd2) - > {
int i1 = ConfigurationClassUtils.getOrder( bd1.getBeanDefinition( )) ;
int i2 = ConfigurationClassUtils.getOrder( bd2.getBeanDefinition( )) ;
return Integer.compare( i1, i2) ;
} ) ;
// Detect any custom bean name generation strategy supplied through the enclosing application context
SingletonBeanRegistry sbr = null;
//如果BeanDefinitionRegistry是SingletonBeanRegistry子类的话
//由于我们当前传入的是DefaultListableBeanFactory,是SingletonBeanRegistry的子类
//因此registry会将强制转换为SingletonBeanRegistry
if ( registry instanceof SingletonBeanRegistry) {
sbr = ( SingletonBeanRegistry) registry;
if ( ! this.localBeanNameGeneratorSet) { //是否有自定义的
BeanNameGenerator generator = ( BeanNameGenerator) sbr.getSingleton( CONFIGURATION_BEAN_NAME_GENERATOR) ;
//如果有则利用他的,否则利用spring默认的
if ( generator != null) {
this.componentScanBeanNameGenerator = generator;
this.importBeanNameGenerator = generator;
}
}
}
if ( this.environment == null) {
this.environment = new StandardEnvironment( ) ;
}
// Parse each @Configuration class
//实例化ConfigurationClassParser,为了解析各个配置类
ConfigurationClassParser parser = new ConfigurationClassParser(
this.metadataReaderFactory, this.problemReporter, this.environment,
this.resourceLoader, this.componentScanBeanNameGenerator, registry) ;
//实例化2个set,candidates用于将之前加入的configCandidates去重
//因为可能有多少配置类重复了
//alreadyParsed判断是否处理过
Set< BeanDefinitionHolder> candidates = new LinkedHashSet< > ( configCandidates) ;
Set< ConfigurationClass> alreadyParsed = new HashSet< > ( configCandidates.size( )) ;
do {
parser.parse( candidates) ;
parser.validate( ) ;
Set< ConfigurationClass> configClasses = new LinkedHashSet< > ( parser.getConfigurationClasses( )) ;
configClasses.removeAll( alreadyParsed) ;
// Read the model and create bean definitions based on its content
if ( this.reader == null) {
this.reader = new ConfigurationClassBeanDefinitionReader(
registry, this.sourceExtractor, this.resourceLoader, this.environment,
this.importBeanNameGenerator, parser.getImportRegistry( )) ;
}
/*
这里值得注意的是扫描出来的bean当中可能包含了特殊类
比如ImportBeanDefinitionRegistrar也在这个方法里面处理
但是并不是包含在configClasses中
configClasses中主要包含的是importSelector
因为ImportBeanDefinitionRegistrar在扫描出来的时候已经被添加到一个list当中去
*/
this.reader.loadBeanDefinitions( configClasses) ;
alreadyParsed.addAll( configClasses) ;
candidates.clear( ) ;
//由于我们这里进行了扫描,把扫描出来的BeanDefinition注册给了factory
if ( registry.getBeanDefinitionCount( ) > candidateNames.length) {
String[ ] newCandidateNames = registry.getBeanDefinitionNames( ) ;
Set< String> oldCandidateNames = new HashSet< > ( Arrays.asList( candidateNames)) ;
Set< String> alreadyParsedClasses = new HashSet< > ( ) ;
for ( ConfigurationClass configurationClass : alreadyParsed) {
alreadyParsedClasses.add( configurationClass.getMetadata( ) .getClassName( )) ;
}
for ( String candidateName : newCandidateNames) {
if ( ! oldCandidateNames.contains( candidateName)) {
BeanDefinition bd = registry.getBeanDefinition( candidateName) ;
if ( ConfigurationClassUtils.checkConfigurationClassCandidate( bd, this.metadataReaderFactory) &&
! alreadyParsedClasses.contains( bd.getBeanClassName( )) ) {
candidates.add( new BeanDefinitionHolder( bd, candidateName)) ;
}
}
}
candidateNames = newCandidateNames;
}
}
.. .. ..
}
七、ConfigurationClassParser类
public void parse( Set< BeanDefinitionHolder> configCandidates) {
for ( BeanDefinitionHolder holder : configCandidates) {
BeanDefinition bd = holder.getBeanDefinition( ) ;
try {
if ( bd instanceof AnnotatedBeanDefinition) {
//解析注解对象,并把解析出来的bd放到map,但是这里的bd指的是普通的
//什么是不普通的呢?比如@Bean和各种beanFactoryPostProcessor得到的bean不普通
//但是是这里解析,只是不put而已
parse(( ( AnnotatedBeanDefinition) bd) .getMetadata( ) , holder.getBeanName( )) ;
}
else if ( bd instanceof AbstractBeanDefinition && (( AbstractBeanDefinition) bd) .hasBeanClass( )) {
parse(( ( AbstractBeanDefinition) bd) .getBeanClass( ) , holder.getBeanName( )) ;
}
else {
parse( bd.getBeanClassName( ) , holder.getBeanName( )) ;
}
}
catch ( BeanDefinitionStoreException ex) {
throw ex;
}
catch ( Throwable ex) {
throw new BeanDefinitionStoreException(
"Failed to parse configuration class [" + bd.getBeanClassName( ) + "]" , ex) ;
}
}
this.deferredImportSelectorHandler.process( ) ;
}
八、ConfigurationClassParser类
protected final void parse( AnnotationMetadata metadata, String beanName) throws IOException {
processConfigurationClass( new ConfigurationClass( metadata, beanName)) ;
}
九、ConfigurationClassParser类
protected void processConfigurationClass( ConfigurationClass configClass) throws IOException {
.. .. ..
SourceClass sourceClass = asSourceClass( configClass) ;
do {
sourceClass = doProcessConfigurationClass( configClass, sourceClass) ;
}
while ( sourceClass != null) ;
//一个map,用来存放扫描出来的bean( 注意这里的bean不是对象,仅仅是bean的信息,因为还没到实例化这一步)
this.configurationClasses.put( configClass, configClass) ;
}
十、ConfigurationClassParser类
@Nullable
protected final SourceClass doProcessConfigurationClass( ConfigurationClass configClass, SourceClass sourceClass)
throws IOException {
.. .. ..
// Process any @ComponentScan annotations
Set< AnnotationAttributes> componentScans = AnnotationConfigUtils.attributesForRepeatable(
sourceClass.getMetadata( ) , ComponentScans.class, ComponentScan.class) ;
if ( ! componentScans.isEmpty( ) &&
! this.conditionEvaluator.shouldSkip( sourceClass.getMetadata( ) , ConfigurationPhase.REGISTER_BEAN)) {
for ( AnnotationAttributes componentScan : componentScans) {
// The config class is annotated with @ComponentScan -> perform the scan immediately
//扫描普通类
//扫描所有@Component
Set< BeanDefinitionHolder> scannedBeanDefinitions =
this.componentScanParser.parse( componentScan, sourceClass.getMetadata( ) .getClassName( )) ;
// Check the set of scanned definitions for any further config classes and parse recursively if needed
//检查扫描出来的类中是否有Configuration
for ( BeanDefinitionHolder holder : scannedBeanDefinitions) {
BeanDefinition bdCand = holder.getBeanDefinition( ) .getOriginatingBeanDefinition( ) ;
if ( bdCand == null) {
bdCand = holder.getBeanDefinition( ) ;
}
if ( ConfigurationClassUtils.checkConfigurationClassCandidate( bdCand, this.metadataReaderFactory)) {
parse( bdCand.getBeanClassName( ) , holder.getBeanName( )) ;
}
}
}
}
//这里和内部递归调用适合的情况不同
// Process any @Import annotations
//处理import 三种情况
//①ImportSelector( 参考springlearn项目com.example.chenspring.demo模块)
//②普通类
//③ImportBeanDefinitionRegistrar
/*
这里处理的import是需要判断我们的类当中是否有@Import注解
如果有就把@Import当中的值拿出来,是一个类
比如@Import( xxxx.class) ,那么这里便把xxxx传进去进行解析
在解析的过程中如果发觉是一个importSelector那么就回调selectImports的方法
返回一个字符串( 类名) ,通过这个字符串得到一个类,继而再递归调用本方法来处理这个类
判断一组对象/类是不是imports( 三种import)
*/
processImports( configClass, sourceClass, getImports( sourceClass) , true) ;
.. .. ..
}
十一、ComponentScanAnnotationParser类
public Set< BeanDefinitionHolder> parse( AnnotationAttributes componentScan, final String declaringClass) {
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner( this.registry,
componentScan.getBoolean( "useDefaultFilters" ) , this.environment, this.resourceLoader) ;
Class< ? extends BeanNameGenerator> generatorClass = componentScan.getClass( "nameGenerator" ) ;
boolean useInheritedGenerator = ( BeanNameGenerator.class == generatorClass) ;
scanner.setBeanNameGenerator( useInheritedGenerator ? this.beanNameGenerator :
BeanUtils.instantiateClass( generatorClass)) ;
//********非常重要
ScopedProxyMode scopedProxyMode = componentScan.getEnum( "scopedProxy" ) ;
if ( scopedProxyMode != ScopedProxyMode.DEFAULT) {
scanner.setScopedProxyMode( scopedProxyMode) ;
}
else {
Class< ? extends ScopeMetadataResolver> resolverClass = componentScan.getClass( "scopeResolver" ) ;
scanner.setScopeMetadataResolver( BeanUtils.instantiateClass( resolverClass)) ;
}
scanner.setResourcePattern( componentScan.getString( "resourcePattern" )) ;
//遍历当中的过滤
for ( AnnotationAttributes filter : componentScan.getAnnotationArray( "includeFilters" )) {
for ( TypeFilter typeFilter : typeFiltersFor( filter)) {
scanner.addIncludeFilter( typeFilter) ;
}
}
for ( AnnotationAttributes filter : componentScan.getAnnotationArray( "excludeFilters" )) {
for ( TypeFilter typeFilter : typeFiltersFor( filter)) {
scanner.addExcludeFilter( typeFilter) ;
}
}
//默认懒加载为false
boolean lazyInit = componentScan.getBoolean( "lazyInit" ) ;
if ( lazyInit) {
scanner.getBeanDefinitionDefaults( ) .setLazyInit( true) ;
}
Set< String> basePackages = new LinkedHashSet< > ( ) ;
String[ ] basePackagesArray = componentScan.getStringArray( "basePackages" ) ;
for ( String pkg : basePackagesArray) {
String[ ] tokenized = StringUtils.tokenizeToStringArray( this.environment.resolvePlaceholders( pkg) ,
ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS) ;
Collections.addAll( basePackages, tokenized) ;
}
for ( Class< ?> clazz : componentScan.getClassArray( "basePackageClasses" )) {
basePackages.add( ClassUtils.getPackageName( clazz)) ;
}
if ( basePackages.isEmpty( )) {
basePackages.add( ClassUtils.getPackageName( declaringClass)) ;
}
scanner.addExcludeFilter( new AbstractTypeHierarchyTraversingFilter( false, false) {
@Override
protected boolean matchClassName( String className) {
return declaringClass.equals( className) ;
}
} ) ;
return scanner.doScan( StringUtils.toStringArray( basePackages)) ;
}
十一、ConfigurationClassParser类
private void processImports( ConfigurationClass configClass, SourceClass currentSourceClass,
Collection< SourceClass> importCandidates, boolean checkForCircularImports) {
if ( importCandidates.isEmpty( )) {
return ;
}
if ( checkForCircularImports && isChainedImportOnStack( configClass)) {
this.problemReporter.error( new CircularImportProblem( configClass, this.importStack)) ;
}
else {
this.importStack.push( configClass) ;
try {
for ( SourceClass candidate : importCandidates) {
//ImportSelector
if ( candidate.isAssignable( ImportSelector.class)) {
// Candidate class is an ImportSelector -> delegate to it to determine imports
Class< ?> candidateClass = candidate.loadClass( ) ;
//反射实现一个对象
ImportSelector selector = BeanUtils.instantiateClass( candidateClass, ImportSelector.class) ;
ParserStrategyUtils.invokeAwareMethods(
selector, this.environment, this.resourceLoader, this.registry) ;
if ( selector instanceof DeferredImportSelector) {
this.deferredImportSelectorHandler.handle( configClass, ( DeferredImportSelector) selector) ;
}
else {
//***
String[ ] importClassNames = selector.selectImports( currentSourceClass.getMetadata( )) ;
Collection< SourceClass> importSourceClasses = asSourceClasses( importClassNames) ;
//递归,这里第二次调用processImports
//如果是一个普通类,会进else(普通类)
processImports( configClass, currentSourceClass, importSourceClasses, false) ;
}
}
//ImportBeanDefinitionRegistrar
else if ( candidate.isAssignable( ImportBeanDefinitionRegistrar.class)) {
// Candidate class is an ImportBeanDefinitionRegistrar ->
// delegate to it to register additional bean definitions
Class< ?> candidateClass = candidate.loadClass( ) ;
ImportBeanDefinitionRegistrar registrar =
BeanUtils.instantiateClass( candidateClass, ImportBeanDefinitionRegistrar.class) ;
ParserStrategyUtils.invokeAwareMethods(
registrar, this.environment, this.resourceLoader, this.registry) ;
//添加到一个list当中,和importSelector不同
configClass.addImportBeanDefinitionRegistrar( registrar, currentSourceClass.getMetadata( )) ;
}
//普通类
else {
// Candidate class not an ImportSelector or ImportBeanDefinitionRegistrar ->
// process it as an @Configuration class
//processConfigurationClass主要就是把类放到configurationClass
//configurationClass是一个集合,会在后面被拿出来解析成bd继而注册
//可以看到普通类在扫描出来的时候就被注册了
//如果是importSelector,会先放到ConfigurationClass后面进行处理注册
this.importStack.registerImport(
currentSourceClass.getMetadata( ) , candidate.getMetadata( ) .getClassName( )) ;
processConfigurationClass( candidate.asConfigClass( configClass)) ;
}
}
}
catch ( BeanDefinitionStoreException ex) {
throw ex;
}
catch ( Throwable ex) {
throw new BeanDefinitionStoreException(
"Failed to process import candidates for configuration class [" +
configClass.getMetadata( ) .getClassName( ) + "]" , ex) ;
}
finally {
this.importStack.pop( ) ;
}
}
}
七、ConfigurationClassBeanDefinitionReader类
public void loadBeanDefinitions( Set< ConfigurationClass> configurationModel) {
TrackedConditionEvaluator trackedConditionEvaluator = new TrackedConditionEvaluator( ) ;
for ( ConfigurationClass configClass : configurationModel) {
loadBeanDefinitionsForConfigurationClass( configClass, trackedConditionEvaluator) ;
}
}
八、ConfigurationClassBeanDefinitionReader类
private void loadBeanDefinitionsForConfigurationClass(
ConfigurationClass configClass, TrackedConditionEvaluator trackedConditionEvaluator) {
if ( trackedConditionEvaluator.shouldSkip( configClass)) {
String beanName = configClass.getBeanName( ) ;
if ( StringUtils.hasLength( beanName) && this.registry.containsBeanDefinition( beanName)) {
this.registry.removeBeanDefinition( beanName) ;
}
this.importRegistry.removeImportingClass( configClass.getMetadata( ) .getClassName( )) ;
return ;
}
//如果一个类是import,会被spring标注
//在这里完成注册
if ( configClass.isImported( )) {
registerBeanDefinitionForImportedConfigurationClass( configClass) ;
}
for ( BeanMethod beanMethod : configClass.getBeanMethods( )) {
loadBeanDefinitionsForBeanMethod( beanMethod) ;
}
//xml
loadBeanDefinitionsFromImportedResources( configClass.getImportedResources( )) ;
//注册Registrar
loadBeanDefinitionsFromRegistrars( configClass.getImportBeanDefinitionRegistrars( )) ;
}
四、PostProcessorRegistrationDelegate类
private static void invokeBeanFactoryPostProcessors(
Collection< ? extends BeanFactoryPostProcessor> postProcessors, ConfigurableListableBeanFactory beanFactory) {
for ( BeanFactoryPostProcessor postProcessor : postProcessors) {
postProcessor.postProcessBeanFactory( beanFactory) ;
}
}
五、ConfigurationClassPostProcessor类
public void postProcessBeanFactory( ConfigurableListableBeanFactory beanFactory) {
int factoryId = System.identityHashCode( beanFactory) ;
if ( this.factoriesPostProcessed.contains( factoryId)) {
throw new IllegalStateException(
"postProcessBeanFactory already called on this post-processor against " + beanFactory) ;
}
this.factoriesPostProcessed.add( factoryId) ;
if ( ! this.registriesPostProcessed.contains( factoryId)) {
// BeanDefinitionRegistryPostProcessor hook apparently not supported.. .
// Simply call processConfigurationClasses lazily at this point then.
processConfigBeanDefinitions(( BeanDefinitionRegistry) beanFactory) ;
}
/ / 产生cglib代理,为什么需要产生代理?
enhanceConfigurationClasses( beanFactory) ;
beanFactory.addBeanPostProcessor( new ImportAwareBeanPostProcessor( beanFactory)) ;
}
六、ConfigurationClassPostProcessor类
public void enhanceConfigurationClasses( ConfigurableListableBeanFactory beanFactory) {
Map< String, AbstractBeanDefinition> configBeanDefs = new LinkedHashMap< > ( ) ;
for ( String beanName : beanFactory.getBeanDefinitionNames( )) {
BeanDefinition beanDef = beanFactory.getBeanDefinition( beanName) ;
//判断是否是一个全注解
//扫描是全注解?full和lite的关系
if ( ConfigurationClassUtils.isFullConfigurationClass( beanDef)) {
if ( ! ( beanDef instanceof AbstractBeanDefinition)) {
throw new BeanDefinitionStoreException( "Cannot enhance @Configuration bean definition '" +
beanName + "' since it is not stored in an AbstractBeanDefinition subclass" ) ;
}
else if ( logger.isInfoEnabled( ) && beanFactory.containsSingleton( beanName)) {
logger.info( "Cannot enhance @Configuration bean definition '" + beanName +
"' since its singleton instance has been created too early. The typical cause " +
"is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor " +
"return type: Consider declaring such methods as 'static'." ) ;
}
configBeanDefs.put( beanName, ( AbstractBeanDefinition) beanDef) ;
}
}
if ( configBeanDefs.isEmpty( )) {
// nothing to enhance -> return immediately
return ;
}
ConfigurationClassEnhancer enhancer = new ConfigurationClassEnhancer( ) ;
for ( Map.Entry< String, AbstractBeanDefinition> entry : configBeanDefs.entrySet( )) {
AbstractBeanDefinition beanDef = entry.getValue( ) ;
// If a @Configuration class gets proxied, always proxy the target class
beanDef.setAttribute( AutoProxyUtils.PRESERVE_TARGET_CLASS_ATTRIBUTE, Boolean.TRUE) ;
try {
// Set enhanced subclass of the user-specified bean class
Class< ?> configClass = beanDef.resolveBeanClass( this.beanClassLoader) ;
if ( configClass != null) {
//完成对全注解类的cglib代理
Class< ?> enhancedClass = enhancer.enhance( configClass, this.beanClassLoader) ;
if ( configClass != enhancedClass) {
if ( logger.isTraceEnabled( )) {
logger.trace( String.format( "Replacing bean definition '%s' existing class '%s' with " +
"enhanced class '%s'" , entry.getKey( ) , configClass.getName( ) , enhancedClass.getName( )) ) ;
}
beanDef.setBeanClass( enhancedClass) ;
}
}
}
catch ( Throwable ex) {
throw new IllegalStateException( "Cannot load configuration class: " + beanDef.getBeanClassName( ) , ex) ;
}
}
}