spring4.3.6源代码 - context - 命名空间处理器

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

 

<context:component-scan ... />

<context:component-scan ... />
	org.springframework.context.config.ContextNamespaceHandler.parse(...)
	{
		org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(...)
		{
			1、创建扫描器
				配置默认过滤器( use-default-filters 为true,用于过滤注解 @Component、@ManagedBean、@Named)  --- 可选,默认为true
				配置 BeanDefinition 的默认值 (setBeanDefinitionDefaults)
				配置 <自动装配候选人识别表达式>(setAutowireCandidatePatterns)
				配置资源匹配表达式(resource-pattern="")--- 可选
				配置类名生成器(name-generator="")--- 可选
				配置scope元信息解析器(scope-resolver="")--- 可选
				配置scope代理属性(scoped-proxy="")--- 可选
				配置自定义过滤器(根据<context:include-filter>、<context:exclude-filter>配置)

			2、执行扫描、注册BeanDefinition
				1、根据basePackages配置,读取 *.class 文件,读取字节码文件,根据如下判断,返回BeanDefinition候选列表
					1、符合过滤条件(不能在“排除列表”里面,并且在“接受列表”里面“至少有一个”)

				2、迭代识别到的BeanDefinition候选列表
					for (BeanDefinition candidate : candidates)
					{
						用ScannedGenericBeanDefinition包装被识别的bean元信息
						解析bean的元信息,并设置到<BeanDefinition的scope>
						使用<beanName生成器>,生成bean的名称
						把<全局的BeanDefinition默认值>设置到<识别到的BeanDefinition>
						根据 <自动装配候选人识别表达式>检查生成的bean名称是否符合条件,决定是否设置为自动装配候选人
						解析通用注解,设置到 <识别到的BeanDefinition>(@Lazy、@Primary、@DependsOn、@Role、@Description)
						如果scope配置为代理模式,那么执行如下,否则不执行
							用<RootBeanDefinition>包装 <识别到的BeanDefinition>
							用ScopedProxyFactoryBean代理目标bean
							把 <识别到的BeanDefinition> 的属性拷贝到 RootBeanDefinition
							生成 <识别到的BeanDefinition> 的名称 “scopedTarget.beanName0”,并注册到registry
							返回RootBeanDefinition
						注册 <BeanDefinition> 到registry (BeanDefinition可能为ScannedGenericBeanDefinition,或因为scopeProxy改变的RootBeanDefinition)
					}
			3、根据annotation-config="true",决定是否启用注解配置,功能同 <context:annotation-config />
			4、触发componentRegistered事件
		}
	}

<context:annotation-config />

<context:annotation-config />
	1、触发pushContainingComponent事件
	2、注册一下hooker到beanFactory
		1、如果没有设置AnnotationAwareOrderComparator到beanFactory,设置setDependencyComparator到beanFactory,用于当出现多<自动装配候选人>时比较bean的优先级
		2、如果没有设置ContextAnnotationAutowireCandidateResolver到beanFactory,设置setAutowireCandidateResolver到beanFactory,用于处理@Qualifier注解的类
		3、注册ConfigurationClassPostProcessor到beanFactory,处理 @Configuration注解的类
		4、注册AutowiredAnnotationBeanPostProcessor到beanFactory,处理 字段或方法上 @Autowired注解 、 @Value注解、@Inject注解
		5、注册RequiredAnnotationBeanPostProcessor到beanFactory,处理 “有@Required注解,但是没有配置值”,那么抛出异常
		6、注册CommonAnnotationBeanPostProcessor到beanFactory,处理 字段或方法上 @WebServiceRef、@EJB、@Resource 注解
		7、如果环境支持javax.persistence.EntityManagerFactory类,那么注册org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor,处理 字段或方法上 @PersistenceContext、@PersistenceUnit注解
		8、注册EventListenerMethodProcessor到beanFactory,处理 方法上 @EventListener 注解
		9、注册DefaultEventListenerFactory到beanFactory,处理 注册“监听器工厂”对象
	3、触发 popAndRegisterContainingComponent 事件

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值