<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、执行扫描、注册BeanDefinition1、根据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到beanFactory1、如果没有设置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 事件