2020-08-31 spring源码解析之扩展原理BeanFactoryPostProcessor和BeanDefinitionPostProcessor和ApplicationListener

第二节:spring源码解析之扩展原理BeanFactoryPostProcessor和BeanDefinitionPostProcessor和ApplicationListener

一:Spring是如何发布事件的? ApplicationListener

1.1)自己写一个TulingApplicationListener 实现ApplicationListener​接口,并且把该组件加入到容器中.

@Component

public class TulingApplicationListener implements ApplicationListener {

    //接受到消息,回调该方法

    @Override

    public void onApplicationEvent(ApplicationEvent event) {

        System.out.println("TulingApplicationListener 接受到了一个事件"+event);

    }

}

    public static void main(String[] args) {

        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfig.class);

        //手动发布一个事件

        ctx.publishEvent(new ApplicationEvent("我手动发布了一个事件") {

            @Override

            public Object getSource() {

                return super.getSource();

            }

        });


        //容器关闭也发布事件

        ctx.close();

    }

测试结果:

TulingApplicationListener 接受到了一个事件org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.annotation.AnnotationConfigApplicationContext@37bba400: startup date [Mon May 27 21:42:51 CST 2019]; root of context hierarchy]

TulingApplicationListener 接受到了一个事件com.tuling.testapplicationlistener.MainClass$1[source=我手动发布了一个事件]

TulingApplicationListener 接受到了一个事件org.springframework.context.event.ContextClosedEvent[source=org.springframework.context.annotation.AnnotationConfigApplicationContext@37bba400: startup date [Mon May 27 21:42:51 CST 2019]; root of context hierarchy]


源码解析:

i1>org.springframework.context.support.AbstractApplicationContext#refresh

   i2>org.springframework.context.support.AbstractApplicationContext#initApplicationEventMulticaster(初始化事件多播器)

       i3>org.springframework.context.support.AbstractApplicationContext#registerListeners(把事件监听器注册到多播器上去)

i2(初始化事件多播器源码解析)

protected void initApplicationEventMulticaster() {

ConfigurableListableBeanFactory beanFactory = getBeanFactory();

/判断IOC容器中包含applicationEventMulticaster 事件多播器的Bean的name

if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {

    /创建一个applicationEventMulticaster的bean放在IOC 容器中,bean的name 为applicationEventMulticaster

this.applicationEventMulticaster =beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);

if (logger.isDebugEnabled()) {

logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");

}

}

/容器中不包含一个beanName 为applicationEventMulticaster的多播器组件

else {

    //创建一个SimpleApplicationEventMulticaster 多播器

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 + "]");

}

}

}​

i3:把容器中的监听器注册到多播器上去 源码解析

protected void registerListeners() {

//去容器中把applicationListener 捞取出来注册到多播器上去(系统的)

for (ApplicationListener<?> listener : getApplicationListeners()) {

getApplicationEventMulticaster().addApplicationListener(listener);

}

        //我们自己实现了ApplicationListener 的组件

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);

}

}

}

--------------------------------------------------------------------如何发布事件------------------------------------------------------

public void multicastEvent(final ApplicationEvent event, ResolvableType eventType) {

ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));

//获取到所有的监听器

for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {

    //看spring 容器中是否支持线程池 异步发送事件

Executor executor = getTaskExecutor();

if (executor != null) {

executor.execute(new Runnable() {

@Override

public void run() {


invokeListener(listener, event);

}

});

}

else {  //同步发送事件

invokeListener(listener, event);

}

}

}

private void doInvokeListener(ApplicationListener listener, ApplicationEvent event) {

try {

    //调用对于listener的onApplicationEvent事件

listener.onApplicationEvent(event);

}

catch (ClassCastException ex) {

String msg = ex.getMessage();

if (msg == null || matchesClassCastMessage(msg, event.getClass())) {

// Possibly a lambda-defined listener which we could not resolve the generic event type for

// -> let's suppress the exception and just log a debug message.

Log logger = LogFactory.getLog(getClass());

if (logger.isDebugEnabled()) {

logger.debug("Non-matching event type for listener: " + listener, ex);

}

}

else {

throw ex;

}

}

}

二:BeanDefinitionRegistryPostProcessor​ 的处理源码流程

执行时机:所有的bean定义信息将要被加载到容器中,Bean实例还没有被初始化。

@Component

public class TulingBeanDefinationRegisterPostProcessor implements BeanDefinitionRegistryPostProcessor {

    @Override

    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {

        System.out.println("TulingBeanDefinationRegisterPostProcessor的postProcessBeanDefinitionRegistry方法");

        System.out.println("bean定义的数据量:"+registry.getBeanDefinitionCount());

        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(TulingLog.class);

        registry.registerBeanDefinition("tulingLog",rootBeanDefinition);

    }

    @Override

    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

        System.out.println("TulingBeanDefinationRegisterPostProcessor的postProcessBeanFactory方法");

        System.out.println(beanFactory.getBeanDefinitionCount());

    }

}​

三:BeanFactoryPostProcessor 处理流程

执行时间:所有的Bean定义信息已经加载到容器中,但是Bean实例还没有被初始化.

@Component

public class TulingBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override

    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

        System.out.println("IOC 容器调用了TulingBeanFactoryPostProcessor的postProcessBeanFactory方法");

        for(String name:beanFactory.getBeanDefinitionNames()) {

            if("tulingLog".equals(name)) {

                BeanDefinition beanDefinition = beanFactory.getBeanDefinition(name);

                beanDefinition.setLazyInit(true);

            }

        }

    }

}

调用链:

i1:org.springframework.context.support.AbstractApplicationContext#refresh

>i2:org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors

   >i3:org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors

     >i4:org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors

       >i5:org.springframework.context.annotation.ConfigurationClassPostProcessor#processConfigBeanDefinitions

        > i6:org.springframework.context.annotation.ConfigurationClassParser#parse

           >i7:org.springframework.context.annotation.ConfigurationClassParser#processConfigurationClass

              >i8:org.springframework.context.annotation.ConfigurationClassParser#doProcessConfigurationClass

i4标记处源码解析org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors

public static void invokeBeanFactoryPostProcessors(

ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

// Invoke BeanDefinitionRegistryPostProcessors first, if any.

Set<String> processedBeans = new HashSet<String>();


        //判断IOC 容器是不是BeanDefinitionRegistry的?

if (beanFactory instanceof BeanDefinitionRegistry) {

    //把IOC容器 强制转为BeanDefinitionRegistry类型的

BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;

//创建一个普通的PostProcessors的list的组件

List<BeanFactoryPostProcessor> regularPostProcessors = new LinkedList<BeanFactoryPostProcessor>();

//创建一个BeanDefinitionRegistryPostProcessor类型的list

List<BeanDefinitionRegistryPostProcessor> registryProcessors = new LinkedList<BeanDefinitionRegistryPostProcessor>();


            //处理容器硬编码(new 出来的)带入的beanFacotryPostProcessors

for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {

    //判断是不是BeanDefinitionRegistryPostProcessor

if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {


BeanDefinitionRegistryPostProcessor registryProcessor =

(BeanDefinitionRegistryPostProcessor) postProcessor;

//调用BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry

registryProcessor.postProcessBeanDefinitionRegistry(registry);

//加入到list集合中

registryProcessors.add(registryProcessor);

}

else {//判断不是BeanDefinitionRegistryPostProcessor

    //加入到集合中

regularPostProcessors.add(postProcessor);

}

}

            //创建一个当前注册的RegistryProcessors的集合

List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<BeanDefinitionRegistryPostProcessor>();

第一步:去容器中查询是否有BeanDefinitionRegistryPostProcessor类型的

String[] postProcessorNames =

beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);

for (String ppName : postProcessorNames) {

    //判断是不是实现了PriorityOrdered接口的

if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {

    //添加到currentRegistryProcessors的集合中

currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));

//添加到processedBeans的集合中

processedBeans.add(ppName);

}

}

//进行排序

sortPostProcessors(currentRegistryProcessors, beanFactory);

registryProcessors.addAll(currentRegistryProcessors);

//调用BeanDefinitionRegistryPostProcessors的postProcessBeanDefinitionRegistry方法

invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);

currentRegistryProcessors.clear();

// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.

第二步:去容器中查询是否有BeanDefinitionRegistryPostProcessor类型的

for (String ppName : postProcessorNames) {

    //排除被处理过的,并且实现了Ordered接口的

if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {

currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));

//加到以处理的list中

processedBeans.add(ppName);

}

}

sortPostProcessors(currentRegistryProcessors, beanFactory);

registryProcessors.addAll(currentRegistryProcessors);

//调用BeanDefinitionRegistryPostProcessors的postProcessBeanDefinitionRegistry方法

invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);

currentRegistryProcessors.clear();

//调用普通的BeanDefinitionRegistryPostProcessors没用实现 PriorithOrdered和Ordered接口

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();

}

//调用上诉实现了也实现了BeanFactoryPostProcessors的接口

invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);

invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);

}

else {

// Invoke factory processors registered with the context instance.

invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);

}

        //去IOC 容器中获取BeanFactoryPostProcessor 类型的

String[] postProcessorNames =

beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

        //分离实现了PriorityOrdered接口的 Ordered 接口的   普通的

List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();

List<String> orderedPostProcessorNames = new ArrayList<String>();

List<String> nonOrderedPostProcessorNames = new ArrayList<String>();

for (String ppName : postProcessorNames) {

if (processedBeans.contains(ppName)) {

// skip - already processed in first phase above

}

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);

}

}

调用 PriorityOrdered.

sortPostProcessors(priorityOrderedPostProcessors, beanFactory);

invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

//调用 Ordered.

List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();

for (String postProcessorName : orderedPostProcessorNames) {

orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));

}

sortPostProcessors(orderedPostProcessors, beanFactory);

invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

    //调用普通的

List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();

for (String postProcessorName : nonOrderedPostProcessorNames) {

nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));

}

invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);

// Clear cached merged bean definitions since the post-processors might have

// modified the original metadata, e.g. replacing placeholders in values...

beanFactory.clearMetadataCache();

}

 源码解析:  i5:org.springframework.context.annotation.ConfigurationClassPostProcessor#processConfigBeanDefinitions 


public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {

List<BeanDefinitionHolder> configCandidates = new ArrayList<BeanDefinitionHolder>();

//去IOC容器中的获取Bean定义的名称

// private volatile List<String> beanDefinitionNames = new ArrayList<String>(256);


        //没有解析之前,系统候选的bean定义配置(有自己的 有系统自带的)

String[] candidateNames = registry.getBeanDefinitionNames();


        //循环Bean定义的名称 找出自己的传入的主配置类的bean定义信息  configCandidates

for (String beanName : candidateNames) {

    //去bean定义的map中获取对应的Bean定义对象

    // private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(256);

BeanDefinition beanDef = registry.getBeanDefinition(beanName);

//检查该bean定义对象是不是用来描述配置类

if (ConfigurationClassUtils.isFullConfigurationClass(beanDef) ||

ConfigurationClassUtils.isLiteConfigurationClass(beanDef)) {

if (logger.isDebugEnabled()) {

logger.debug("Bean definition has already been processed as a configuration class: " + beanDef);

}

}

else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) {

configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));

}

}

// Return immediately if no @Configuration classes were found

if (configCandidates.isEmpty()) {

return;

}

//检查配置类排序

Collections.sort(configCandidates, new Comparator<BeanDefinitionHolder>() {

@Override

public int compare(BeanDefinitionHolder bd1, BeanDefinitionHolder bd2) {

int i1 = ConfigurationClassUtils.getOrder(bd1.getBeanDefinition());

int i2 = ConfigurationClassUtils.getOrder(bd2.getBeanDefinition());

return (i1 < i2) ? -1 : (i1 > i2) ? 1 : 0;

}

});

// bean的名称生成策略

SingletonBeanRegistry sbr = null;

if (registry instanceof SingletonBeanRegistry) {

sbr = (SingletonBeanRegistry) registry;

if (!this.localBeanNameGeneratorSet && sbr.containsSingleton(CONFIGURATION_BEAN_NAME_GENERATOR)) {

BeanNameGenerator generator = (BeanNameGenerator) sbr.getSingleton(CONFIGURATION_BEAN_NAME_GENERATOR);

this.componentScanBeanNameGenerator = generator;

this.importBeanNameGenerator = generator;

}

}

/***创建一个配置类解析器

1)元数据读取器工厂

this.metadataReaderFactory = metadataReaderFactory;

2)问题报告器

this.problemReporter = problemReporter;

//设置环境

this.environment = environment;

3)资源加载器

this.resourceLoader = resourceLoader;

4)创建了一个组件扫描器

this.componentScanParser = new ComponentScanAnnotationParser(

environment, resourceLoader, componentScanBeanNameGenerator, registry);

this.conditionEvaluator = new ConditionEvaluator(registry, environment, resourceLoader);

****/

ConfigurationClassParser parser = new ConfigurationClassParser(

this.metadataReaderFactory, this.problemReporter, this.environment,

this.resourceLoader, this.componentScanBeanNameGenerator, registry);



        //将要被解析的配置类(把自己的configCandidates加入到 候选的)

Set<BeanDefinitionHolder> candidates = new LinkedHashSet<BeanDefinitionHolder>(configCandidates);

//已经被解析的配置类(由于do while 那么mainclass就一定会被解析,被解析的size为1)

Set<ConfigurationClass> alreadyParsed = new HashSet<ConfigurationClass>(configCandidates.size());

do {

    //通过配置解析器真正的解析配置类

parser.parse(candidates);

//进行校验

parser.validate();


            //获取ConfigClass (把解析过的配置bean定义信息获取出来)

Set<ConfigurationClass> configClasses = new LinkedHashSet<ConfigurationClass>(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());

}

//@CompentScan是直接注册Bean定义信息的    但是通过获取@Import,@Bean这种的注解还没有注册的bean定义,

this.reader.loadBeanDefinitions(configClasses);

//把系统解析过我们自己的组件放在alreadyParsed

alreadyParsed.addAll(configClasses);

            //清除解析过的 配置文件 

candidates.clear();

//已经注册的bean定义个数大于最新 开始系统+主配置类的(发生过解析)

if (registry.getBeanDefinitionCount() > candidateNames.length) {

    //获取系统+自己解析的+mainconfig的bean定义信息

String[] newCandidateNames = registry.getBeanDefinitionNames();

//系统的+mainconfig的bean定义信息

Set<String> oldCandidateNames = new HashSet<String>(Arrays.asList(candidateNames));

//已经解析过的自己的组件

Set<String> alreadyParsedClasses = new HashSet<String>();

for (ConfigurationClass configurationClass : alreadyParsed) {

alreadyParsedClasses.add(configurationClass.getMetadata().getClassName());

}

for (String candidateName : newCandidateNames) {

    //老的(系统+mainconfig) 不包含解析的

if (!oldCandidateNames.contains(candidateName)) {

    //把当前bean定义获取出来

BeanDefinition bd = registry.getBeanDefinition(candidateName);

//检查是否为解析过的

if (ConfigurationClassUtils.checkConfigurationClassCandidate(bd, this.metadataReaderFactory) &&

!alreadyParsedClasses.contains(bd.getBeanClassName())) {

//若不是解析过且通过检查的     把当前的bean定义 加入到candidates中     

candidates.add(new BeanDefinitionHolder(bd, candidateName));

}

}

}

把解析过的赋值给原来的 

candidateNames = newCandidateNames;

}

}

while (!candidates.isEmpty());  //还存主没有解析过的  再次解析

// Register the ImportRegistry as a bean in order to support ImportAware @Configuration classes

if (sbr != null) {

if (!sbr.containsSingleton(IMPORT_REGISTRY_BEAN_NAME)) {

sbr.registerSingleton(IMPORT_REGISTRY_BEAN_NAME, parser.getImportRegistry());

}

}

if (this.metadataReaderFactory instanceof CachingMetadataReaderFactory) {

((CachingMetadataReaderFactory) this.metadataReaderFactory).clearCache();

}

}​

 i6源码解析 :org.springframework.context.annotation.ConfigurationClassParser#parse


public void parse(Set<BeanDefinitionHolder> configCandidates) {

this.deferredImportSelectors = new LinkedList<DeferredImportSelectorHolder>();

for (BeanDefinitionHolder holder : configCandidates) {

BeanDefinition bd = holder.getBeanDefinition();

try {

    //注解形式的bean定义信息

if (bd instanceof AnnotatedBeanDefinition) {

    //解析配置类的bean定义

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);

}

}

processDeferredImportSelectors();

}​

org.springframework.context.annotation.ConfigurationClassParser#parse

org.springframework.context.annotation.ConfigurationClassParser#processConfigurationClass

protected void processConfigurationClass(ConfigurationClass configClass) throws IOException {

if (this.conditionEvaluator.shouldSkip(configClass.getMetadata(), ConfigurationPhase.PARSE_CONFIGURATION)) {

return;

}

ConfigurationClass existingClass = this.configurationClasses.get(configClass);

if (existingClass != null) {

if (configClass.isImported()) {

if (existingClass.isImported()) {

existingClass.mergeImportedBy(configClass);

}

// Otherwise ignore new imported config class; existing non-imported class overrides it.

return;

}

else {

// Explicit bean definition found, probably replacing an import.

// Let's remove the old one and go with the new one.

this.configurationClasses.remove(configClass);

for (Iterator<ConfigurationClass> it = this.knownSuperclasses.values().iterator(); it.hasNext();) {

if (configClass.equals(it.next())) {

it.remove();

}

}

}

}

递归处理配置类及其超类层次结构。

SourceClass sourceClass = asSourceClass(configClass);

do {

sourceClass = doProcessConfigurationClass(configClass, sourceClass);

}

while (sourceClass != null);

this.configurationClasses.put(configClass, configClass);

}

org.springframework.context.annotation.ConfigurationClassParser#doProcessConfigurationClass

protected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass)

throws IOException {

// Recursively process any member (nested) classes first

processMemberClasses(configClass, sourceClass);

//处理@PropertySource注解

for (AnnotationAttributes propertySource : AnnotationConfigUtils.attributesForRepeatable(

sourceClass.getMetadata(), PropertySources.class,

org.springframework.context.annotation.PropertySource.class)) {

if (this.environment instanceof ConfigurableEnvironment) {

processPropertySource(propertySource);

}

else {

logger.warn("Ignoring @PropertySource annotation on [" + sourceClass.getMetadata().getClassName() +

"]. Reason: Environment must implement ConfigurableEnvironment");

}

}

//处理@ComponentScan注解

//解析@ComponentScans注解的属性 封装成一个一个的componentscan对象

Set<AnnotationAttributes> componentScans = AnnotationConfigUtils.attributesForRepeatable(sourceClass.getMetadata(), ComponentScans.class, ComponentScan.class);

if (!componentScans.isEmpty() &&!this.conditionEvaluator.shouldSkip(sourceClass.getMetadata(), ConfigurationPhase.REGISTER_BEAN)) {

//循环componentScans的set

for (AnnotationAttributes componentScan : componentScans) {

// 立即执行扫描解析

Set<BeanDefinitionHolder> scannedBeanDefinitions =this.componentScanParser.parse(componentScan, sourceClass.getMetadata().getClassName());

//检查任何其他配置类的扫描定义集,并在需要时递归解析

for (BeanDefinitionHolder holder : scannedBeanDefinitions) {

    //获取原始的bean定义信息

BeanDefinition bdCand = holder.getBeanDefinition().getOriginatingBeanDefinition();

if (bdCand == null) {

bdCand = holder.getBeanDefinition();

}

//检查当前的bean定义信息是不是配置类  比如MainConfig的bean定义信息

if (ConfigurationClassUtils.checkConfigurationClassCandidate(bdCand, this.metadataReaderFactory)) {

    //递归调用来解析MainConfig,解析出来配置类的中导入的bean定义信息

parse(bdCand.getBeanClassName(), holder.getBeanName());

}

}

}

}

//处理@Import注解   解析Import 注解的ImportSelector  ImportBeanDefinitionRegister,@Bean这种

//存放在ConfigClass中

processImports(configClass, sourceClass, getImports(sourceClass), true);

//处理 @ImportResource annotations

if (sourceClass.getMetadata().isAnnotated(ImportResource.class.getName())) {

AnnotationAttributes importResource =

AnnotationConfigUtils.attributesFor(sourceClass.getMetadata(), ImportResource.class);

String[] resources = importResource.getStringArray("locations");

Class<? extends BeanDefinitionReader> readerClass = importResource.getClass("reader");

for (String resource : resources) {

String resolvedResource = this.environment.resolveRequiredPlaceholders(resource);

configClass.addImportedResource(resolvedResource, readerClass);

}

}

// 处理  @Bean methods

Set<MethodMetadata> beanMethods = retrieveBeanMethodMetadata(sourceClass);

for (MethodMetadata methodMetadata : beanMethods) {

configClass.addBeanMethod(new BeanMethod(methodMetadata, configClass));

}

//处理接口

processInterfaces(configClass, sourceClass);

// 处理超类的

if (sourceClass.getMetadata().hasSuperClass()) {

String superclass = sourceClass.getMetadata().getSuperClassName();

if (!superclass.startsWith("java") && !this.knownSuperclasses.containsKey(superclass)) {

this.knownSuperclasses.put(superclass, configClass);

// Superclass found, return its annotation metadata and recurse

return sourceClass.getSuperClass();

}

}

// No superclass -> processing is complete

return null;

}

//通过组件扫描器进行真正的解析

org.springframework.context.annotation.ComponentScanAnnotationParser#parse

Set<BeanDefinitionHolder>

public Set<BeanDefinitionHolder> parse(AnnotationAttributes componentScan, final String declaringClass) {

Assert.state(this.environment != null, "Environment must not be null");

Assert.state(this.resourceLoader != null, "ResourceLoader must not be null");


        //创建一个类路径下的bean定义扫描器

ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(this.registry,

componentScan.getBoolean("useDefaultFilters"), this.environment, this.resourceLoader);


        //为扫描器设置一个bean 名称的生成器

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);

}

}

boolean lazyInit = componentScan.getBoolean("lazyInit");

if (lazyInit) {

scanner.getBeanDefinitionDefaults().setLazyInit(true);

}

Set<String> basePackages = new LinkedHashSet<String>();

String[] basePackagesArray = componentScan.getStringArray("basePackages");

for (String pkg : basePackagesArray) {

String[] tokenized = StringUtils.tokenizeToStringArray(this.environment.resolvePlaceholders(pkg),

ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS);

basePackages.addAll(Arrays.asList(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));

}

//创建类路径下的bean定义扫描器

public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters,

Environment environment, ResourceLoader resourceLoader) {

Assert.notNull(registry, "BeanDefinitionRegistry must not be null");

this.registry = registry;


        //使用默认的扫描规则

if (useDefaultFilters) {

registerDefaultFilters();

}

//设置环境变量

setEnvironment(environment);

//设置资源加载器

setResourceLoader(resourceLoader);

}

//默认的扫描规则

protected void registerDefaultFilters() {

    //添加了Componet的解析,这就是我们为啥@Componet @Respository @Service @Controller的  @AspectJ

this.includeFilters.add(new AnnotationTypeFilter(Component.class));

ClassLoader cl = ClassPathScanningCandidateComponentProvider.class.getClassLoader();

try {

    //添加Jsr 250规范的注解

this.includeFilters.add(new AnnotationTypeFilter(

((Class<? extends Annotation>) ClassUtils.forName("javax.annotation.ManagedBean", cl)), false));

logger.debug("JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning");

}

catch (ClassNotFoundException ex) {

// JSR-250 1.1 API (as included in Java EE 6) not available - simply skip.

}

try {

    //JSR330的注解

this.includeFilters.add(new AnnotationTypeFilter(

((Class<? extends Annotation>) ClassUtils.forName("javax.inject.Named", cl)), false));

logger.debug("JSR-330 'javax.inject.Named' annotation found and supported for component scanning");

}

catch (ClassNotFoundException ex) {

// JSR-330 API not available - simply skip.

}

}

使用扫描器去真正的扫描类,返回Set<BeanDefinitionHolder>

org.springframework.context.annotation.ClassPathBeanDefinitionScanner#doScan

protected Set<BeanDefinitionHolder> doScan(String... basePackages) {

Assert.notEmpty(basePackages, "At least one base package must be specified");

//创建一个Bean定义 holder的 set

Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet<BeanDefinitionHolder>();

//循环扫描路径

for (String basePackage : basePackages) {

    //找到候选的组件集合

Set<BeanDefinition> candidates = findCandidateComponents(basePackage);

//循环候选组件集合

for (BeanDefinition candidate : candidates) {

ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(candidate);

candidate.setScope(scopeMetadata.getScopeName());

//生成bean的名称

String beanName = this.beanNameGenerator.generateBeanName(candidate, this.registry);

//判断是不是抽象的beand定义

if (candidate instanceof AbstractBeanDefinition) {

postProcessBeanDefinition((AbstractBeanDefinition) candidate, beanName);

}

//注解的bean定义西悉尼

if (candidate instanceof AnnotatedBeanDefinition) {

AnnotationConfigUtils.processCommonDefinitionAnnotations((AnnotatedBeanDefinition) candidate);

}

if (checkCandidate(beanName, candidate)) { //检查当前的和存主的bean定义是否有冲突

    //把候选的组件封装成BeanDefinitionHolder

BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(candidate, beanName);

definitionHolder =AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);

//加入到bean定义的集合中

beanDefinitions.add(definitionHolder);

//注册当前的bean定义信息

registerBeanDefinition(definitionHolder, this.registry);

}

}

}

return beanDefinitions;

}


org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#findCandidateComponents 

    找到候选的组件 返回Set<BeanDefinition>的集合

public Set<BeanDefinition> findCandidateComponents(String basePackage) {

//候选的bean定义信息

Set<BeanDefinition> candidates = new LinkedHashSet<BeanDefinition>();

try {

    //拼接需要扫描包下面的类的路径   classpath*:com/tuling/testapplicationlistener/**/*.class

String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +

resolveBasePackage(basePackage) + '/' + this.resourcePattern;

//把路径解析成一个个.class文件

Resource[] resources = this.resourcePatternResolver.getResources(packageSearchPath);

boolean traceEnabled = logger.isTraceEnabled();

boolean debugEnabled = logger.isDebugEnabled();

//循环.class文件的resource对象

for (Resource resource : resources) {

if (traceEnabled) {

logger.trace("Scanning " + resource);

}

//判断class文件是否可读

if (resource.isReadable()) {

try {

    //把resource对象 变为一个类的原信息读取器

MetadataReader metadataReader = this.metadataReaderFactory.getMetadataReader(resource);

//判断类的源信息读取器是否为候选的组件

if (isCandidateComponent(metadataReader)) {  //是候选的组件

    //把类元信息读取器封装成一个ScannedGenericBeanDefinition

ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader);

sbd.setResource(resource);

sbd.setSource(resource);

//是候选的组件

if (isCandidateComponent(sbd)) {

if (debugEnabled) {

logger.debug("Identified candidate component class: " + resource);

}

//把当前解析出来的定义的加入到 BeanDefinition的集合中

candidates.add(sbd);

}

else {

if (debugEnabled) {

logger.debug("Ignored because not a concrete top-level class: " + resource);

}

}

}

else {

if (traceEnabled) {

logger.trace("Ignored because not matching any filter: " + resource);

}

}

}

catch (Throwable ex) {

throw new BeanDefinitionStoreException(

"Failed to read candidate component class: " + resource, ex);

}

}

else {

if (traceEnabled) {

logger.trace("Ignored because not readable: " + resource);

}

}

}

}

catch (IOException ex) {

throw new BeanDefinitionStoreException("I/O failure during classpath scanning", ex);

}

return candidates;

}

是不是需要扫描的组件

org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#isCandidateComponent

protected boolean isCandidateComponent(MetadataReader metadataReader) throws IOException {

//是不是被排除的

for (TypeFilter tf : this.excludeFilters) {

if (tf.match(metadataReader, this.metadataReaderFactory)) {

return false;

}

}

//在被包含的组件

for (TypeFilter tf : this.includeFilters) {

if (tf.match(metadataReader, this.metadataReaderFactory)) {

return isConditionMatch(metadataReader);

}

}

return false;

}

是否能够进行@Conditional判断

    org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#isConditionMatch

private boolean isConditionMatch(MetadataReader metadataReader) {

if (this.conditionEvaluator == null) {

this.conditionEvaluator = new ConditionEvaluator(getRegistry(), getEnvironment(), getResourceLoader());

}

return !this.conditionEvaluator.shouldSkip(metadataReader.getAnnotationMetadata());

}

BeanFactoryPostProcessor

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335