BeanFactoryPostProcessor和BeanDefinitionPostProcessor和ApplicationListener
BeanDefinitionPostProcessor: Spring的接口类用于处理对Bean的定义注册
GenericBeanDefinition:用于定义Bean的信息
FactoryBean: 用于处理Bean工厂的类
一:Spring是如何发布事件的? ApplicationListener
1.1)自己写一个TulingApplicationListener 实现ApplicationListener接口,并且把该组件加入到容器中.
/*** 创建一个监听器**/@Componentpublic class TulingApplicationListener implements ApplicationListener {@Overridepublic void onApplicationEvent(ApplicationEvent event) {System.out.println("TulingApplicationListener 接受到了一个事件"+event);}}
public class MainClass {public static void main(String[] args) {AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfig.class);ctx.publishEvent(new ApplicationEvent("我手动发布了一个事件") {@Overridepublic 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]
进入类AnnotationConfigApplicationContext的构造函数
/*** Create a new AnnotationConfigApplicationContext that needs to be populated* through {@link #register} calls and then manually {@linkplain #refresh refreshed}.*/public AnnotationConfigApplicationContext() {// 往容器中放入一些列的后置处理器this.reader = new AnnotatedBeanDefinitionReader(this);// 指定扫描策略this.scanner = new ClassPathBeanDefinitionScanner(this);}/*** Create a new AnnotationConfigApplicationContext, deriving bean definitions* from the given annotated classes and automatically refreshing the context.* @param annotatedClasses one or more annotated classes,* e.g. {@link Configuration @Configuration} classes*/public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {this();// 把配置类注册容器中【把我们的MainConfig记录到容器中去】register(annotatedClasses);//容器刷新。极其重要,核心refresh();}
如下图,在执行到this.scanner = new ClassPathBeanDefinitionScanner(this);时,容器中会有六个默认的bean
而走完register(annotatedClasses);之后,会将我们的MainConfig(自己定义的组件)记录到容器中去
@Configuration@ComponentScan(basePackages = "com.tuling.testbeanfacotoryPostProcessor")public class MainConfig {}

如下为AbstractApplicationContext.refresh()方法
@Overridepublic void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.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.// 调用bean工厂的后置处理器invokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.registerBeanPostProcessors(beanFactory);// 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();// 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();}}}
源码解析:
i1>org.springframework.context.support.AbstractApplicationContext#refresh
i2>org.springframework.context.support.AbstractApplicationContext#initApplicationEventMulticaster(初始化事件多播器)
i3>org.springframework.context.support.AbstractApplicationContext#registerListeners(把事件监听器注册到多播器上去)
i2(初始化事件多播器源码解析)
AbstractApplicationContext.initApplicationEventMulticaster()
protected void initApplicationEventMulticaster() {ConfigurableListableBeanFactory beanFactory = getBeanFactory();//判断IOC容器中包含applicationEventMulticaster 事件多播器的Bean的nameif (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {//创建一个applicationEventMulticaster的bean放在IOC 容器中,bean的name 为applicationEventMulticasterthis.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:把容器中的监听器注册到多播器上去 源码解析
AbstractApplicationContext.registerListeners()
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);}}}
在看一眼AbstractApplicationContext.refresh()方法,多播器的早期与后期界线点为:AbstractApplicationContext.registerListeners();
在运行查看源码的时候发现没有早期事件,先存起来,程序过了registerListeners()后在 AbstractApplicationContext.finishRefresh();里面进行出发;其原因是因为防止onRefresh()中有事件[SpringBoot启动调用tomcat]
------------------------------如何发布事件------------------------------------------------------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() {@Overridepublic 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实例还没有被初始化。
@Componentpublic class TulingBeanDefinationRegisterPostProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic 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);}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {System.out.println("TulingBeanDefinationRegisterPostProcessor的postProcessBeanFactory方法");System.out.println(beanFactory.getBeanDefinitionCount());}}
三:BeanFactoryPostProcessor 处理流程
执行时间:所有的Bean定义信息已经加载到容器中,但是Bean实例还没有被初始化.
@Componentpublic class TulingBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic 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标记处源码解析 #invokeBeanFactoryPostProcessors
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类型的listList<BeanDefinitionRegistryPostProcessor> registryProcessors = new LinkedList<BeanDefinitionRegistryPostProcessor>();//处理容器硬编码(new 出来的)带入的beanFacotryPostProcessorsfor (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {//判断是不是BeanDefinitionRegistryPostProcessorif (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {BeanDefinitionRegistryPostProcessor registryProcessor =(BeanDefinitionRegistryPostProcessor) postProcessor;//调用BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistryregistryProcessor.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源码解析
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定义信息 configCandidatesfor (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 foundif (configCandidates.isEmpty()) {return;}//检查配置类排序,看哪一个先起作用Collections.sort(configCandidates, new Comparator<BeanDefinitionHolder>() {@Overridepublic 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;// importBean生成器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 contentif (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);//把系统解析过我们自己的组件放在alreadyParsedalreadyParsed.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 classesif (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#parseorg.springframework.context.annotation.ConfigurationClassParser#processConfigurationClassprotected 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#doProcessConfigurationClassprotected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass)throws IOException {// Recursively process any member (nested) classes firstprocessMemberClasses(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的setfor (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 annotationsif (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 methodsSet<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 recursereturn sourceClass.getSuperClass();}}// No superclass -> processing is completereturn null;}//通过组件扫描器进行真正的解析org.springframework.context.annotation.ComponentScanAnnotationParser#parseSet<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) {@Overrideprotected 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的 @AspectJthis.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#doScanprotected Set<BeanDefinitionHolder> doScan(String... basePackages) {Assert.notEmpty(basePackages, "At least one base package must be specified");//创建一个Bean定义 holder的 setSet<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定义是否有冲突//把候选的组件封装成BeanDefinitionHolderBeanDefinitionHolder 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/**/*.classString 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)) { //是候选的组件//把类元信息读取器封装成一个ScannedGenericBeanDefinitionScannedGenericBeanDefinition 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#isCandidateComponentprotected 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#isConditionMatchprivate boolean isConditionMatch(MetadataReader metadataReader) {if (this.conditionEvaluator == null) {this.conditionEvaluator = new ConditionEvaluator(getRegistry(), getEnvironment(), getResourceLoader());}return !this.conditionEvaluator.shouldSkip(metadataReader.getAnnotationMetadata());}

