<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 事件