spring4.3.6源代码 - context - Processor

37 篇文章 0 订阅
21 篇文章 0 订阅

 

 



org.springframework.context.annotation.ConfigurationClassPostProcessor
{
	1、public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
	{
		1、获取所有 <已经注册的bean列表>
		2、获取配置候选人
			for(迭代所有 <已经注册的bean列表>)
			{
				if 如bean类有声明@Configuration注解,那么BeanDefinition
				{
					beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_FULL); // full
				}
				else 类有声明 @Component、@ComponentScan、@Import、@ImportResource注解、或者 <类中有方法声明@Bean注解>
				{
					beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_LITE); // lite
				}

				if 类有声明@Order注解
				{
					beanDef.setAttribute(ORDER_ATTRIBUTE, orderAttributes.get(AnnotationUtils.VALUE));
				}

				return true;
			}
		3、do { // 会一直循环,指定没有bean需要解析
			parser.parse(configCandidates)
			{
				processConfigurationClass(ConfigurationClass configClass)
				{
					SourceClass sourceClass = doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass)
					{
						1、处理内部类,内部类上有声明 @Configuration 或者 【 @Component、@ComponentScan、@Import、@ImportResource注解、或者 <类中有方法声明@Bean注解> 】
							递归执行

						2、类上有@PropertySource注解
							解析并添加到 environment 对象

						3、类上有@ComponentScan注解
							根据 @ComponentScan配置的属性,扫描 @Component,功能同 <context:component-scan ... />

						4、类上有@Import注解
							// 根据@Import配置的属性,处理导入,功能同 <import>
							if 导入的类继承 ImportSelector
							{
								this.deferredImportSelectors.add(new DeferredImportSelectorHolder(configClass, (DeferredImportSelector) selector));
							}
							else if 导入的类继承 ImportBeanDefinitionRegistrar
							{
								configClass.addImportBeanDefinitionRegistrar(registrar, currentSourceClass.getMetadata());
							}

						5、类上有@ImportResource注解
							configClass.addImportedResource(resolvedResource, readerClass);

						6、带有@Bean注解的方法列表
							configClass.addBeanMethod(new BeanMethod(methodMetadata, configClass));

						7、读取父类的带有@Bean注解的方法列表
							configClass.addBeanMethod(new BeanMethod(methodMetadata, configClass));
					}

					this.configurationClasses.put(configClass, configClass); //!!! 存储配置类
				}
			}

			parser.validate();

			this.reader.loadBeanDefinitions(configClasses); // 注册BeanDefinition
			{
				for (迭代 ConfigurationClass 列表) {
					if (configClass.isImported()) { // 是被导入的(即:本configClass是在内部类声明的注解,解析出来的;即本注解声明在内部类上)
						registerBeanDefinitionForImportedConfigurationClass(configClass); // 注册BeanDefinition,要进入第二解析
						{
							1、用AnnotatedGenericBeanDefinition包装注解
							2、解析通用注解  @Lazy、@Primary、@DependsOn、@Role、@Description
							3、注册AnnotatedGenericBeanDefinition到registry
						}
					}

					for (BeanMethod beanMethod : configClass.getBeanMethods()) {
						loadBeanDefinitionsForBeanMethod(beanMethod); // 注册BeanDefinition,用工厂模式包装
						{
							1、获取声明@bean的所在的ConfigClass对象
							2、用ConfigurationClassBeanDefinition对象包装bean对象
							3、读取@Bean的属性,设置到ConfigurationClassBeanDefinition(@Bean(autowire="",initMethod="",destroyMethod=""))
							4、读取@Scope的属性,设置到ConfigurationClassBeanDefinition
							5、注ConfigurationClassBeanDefinition到registry
						}
					}

					loadBeanDefinitionsFromImportedResources(configClass.getImportedResources()); // 注册BeanDefinition
					{
						1、创建资源读取器(支持的类型有 .groovy 和 .xml 后缀的文件)
						2、执行解析 reader.loadBeanDefinitions(resource);
					}

					loadBeanDefinitionsFromRegistrars(configClass.getImportBeanDefinitionRegistrars())
					{
						for (Map.Entry<ImportBeanDefinitionRegistrar, AnnotationMetadata> entry : registrars.entrySet()) {
							// entry.getKey() == ImportBeanDefinitionRegistrar对象
							// entry.getValue() == 声明Import注解类的元信息对象
							entry.getKey().registerBeanDefinitions(entry.getValue(),this.registry);
						}
					}
				}
			}
		}
	}

	2、public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
	{
		// !!!  使用了@Configuration注解的类,生成子类,
		// 子类实现 org.springframework.context.annotation.ConfigurationClassEnhancer.EnhancedConfiguration 接口,
		// EnhancedConfiguration实现了BeanFactoryAware接口,所以“使用了@Configuration注解的类”能感知BeanFactory
		enhanceConfigurationClasses(beanFactory); //

		// 添加BeanPostProcessor
		beanFactory.addBeanPostProcessor(new ImportAwareBeanPostProcessor(beanFactory)); // 添加BeanPostProcessor
	}
}

org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor
{

	// 检查候选构造函数
	1、determineCandidateConstructors(Class<?> beanClass, final String beanName)
	{
		1、检查方法上包含注解@Lookup方法,配置addOverride,用途同:<lookup-method>
		2、获取所有构造函数
		3、过滤出候选的构造函数
			for(迭代所有构造函数){
				1、如果有@Autowired注解 、 @Value注解、@Inject注解,获取注解的属性
					if 注解属性为null
					{
						1、检查是否是cglib类包装过,如果是,那么获取父类(即实际类)
						2、获取实际的类的构造函数
					}
					else
					{
						1、检查是否有标记required
						2、如果required,则判断构造函数有且只能有一个标记为required,否则抛错误
					}
			}
	}

	// 合并BeanDefinition(创建bean实例后调用)
	2、postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName)
	{
		if (beanType != null) {
			1、如果字段上有@Autowired注解 、 @Value注解、@Inject注解,获取注解的属性
			2、如果方法上有@Autowired注解 、 @Value注解、@Inject注解,获取注解的属性
		}
	}

	// 在《居于 autowireByName 或者 autowireByType 方式装配》后执行
	3、postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)
	{
		1、根据字段上有@Autowired注解 、 @Value注解、@Inject注解,注入相应的依赖
		2、根据方法上有@Autowired注解 、 @Value注解、@Inject注解,注入相应的依赖
	}
}


org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor
{
	1、postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)
	{
		for(迭代类里的所有方法)
		{
			“有@Required注解,但是没有配置值”,那么抛出异常
		}
	}
}

org.springframework.beans.factory.annotation.CommonAnnotationBeanPostProcessor
{
	1、postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName)
	{
		识别方法上的 @PostConstruct,用途相当于 init-method=""
		识别方法上的 @PreDestroy注解,用途相当于 destroy-method=""
		处理字段上的@WebServiceRef、@EJB、@Resource 注解
		处理方法上的@WebServiceRef、@EJB、@Resource 注解
	}

	2、postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)
	{
		处理字段上的@WebServiceRef、@EJB、@Resource 注解,注入相应的依赖
		处理方法上的@WebServiceRef、@EJB、@Resource 注解,注入相应的依赖
	}

	3、postProcessBeforeInitialization(Object bean, String beanName)
	{
		根据方法上的 @PostConstruct,调用 init 方法,用途相当于 init-method=""
	}

	4、postProcessBeforeDestruction(Object bean, String beanName)
	{
		根据方法上的 @PreDestroy注解,调用 destroy 方法,用途相当于 destroy-method=""
	}
}

org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor
{
	postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName)
	{
		处理字段上的@PersistenceContext、@PersistenceUnit 注解
		处理方法上的@PersistenceContext、@PersistenceUnit 注解
	}

	postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)
	{
		处理字段上的@PersistenceContext、@PersistenceUnit 注解,注入相应的依赖
		处理方法上的@PersistenceContext、@PersistenceUnit 注解,注入相应的依赖
	}

	postProcessBeforeDestruction(Object bean, String beanName)
	{
		销毁 EntityManager
	}
}

org.springframework.context.event.EventListenerMethodProcessor
{
	// 上下文refresh最后,预先实例化单例对象后,调用本方法
	afterSingletonsInstantiated()
	{
		1、扫描单例对象上包含@EventListener注解的方法
		2、用 ApplicationListenerMethodAdapter 适配目标方法,并注册到 context。
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值