ComponentScanAnnotationParser 1. ComponentScanAnnotationParser属性解析 2. 一个重要方法---parse
1. ComponentScanAnnotationParser属性解析
private final Environment environment; private final ResourceLoader resourceLoader; private final BeanNameGenerator beanNameGenerator; private final BeanDefinitionRegistry registry;
2. 一个重要方法—parse
public Set < BeanDefinitionHolder > parse ( AnnotationAttributes componentScan, String declaringClass) { ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner ( this . registry, componentScan. getBoolean ( "useDefaultFilters" ) , this . environment, this . resourceLoader) ; 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 includeFilterAttributes : componentScan. getAnnotationArray ( "includeFilters" ) ) { List < TypeFilter > typeFilters = TypeFilterUtils . createTypeFiltersFor ( includeFilterAttributes, this . environment, this . resourceLoader, this . registry) ; for ( TypeFilter typeFilter : typeFilters) { scanner. addIncludeFilter ( typeFilter) ; } } for ( AnnotationAttributes excludeFilterAttributes : componentScan. getAnnotationArray ( "excludeFilters" ) ) { List < TypeFilter > typeFilters = TypeFilterUtils . createTypeFiltersFor ( excludeFilterAttributes, this . environment, this . resourceLoader, this . registry) ; for ( TypeFilter typeFilter : typeFilters) { scanner. addExcludeFilter ( typeFilter) ; } } boolean lazyInit = componentScan. getBoolean ( "lazyInit" ) ; if ( lazyInit) { scanner. getBeanDefinitionDefaults ( ) . setLazyInit ( true ) ; } Set < String > basePackages = new LinkedHashSet < > ( ) ; String [ ] basePackagesArray = componentScan. getStringArray ( "basePackages" ) ; for ( String pkg : basePackagesArray) { String [ ] tokenized = StringUtils . tokenizeToStringArray ( this . environment. resolvePlaceholders ( pkg) , ConfigurableApplicationContext . CONFIG_LOCATION_DELIMITERS ) ; Collections . addAll ( basePackages, 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 ) { @Override protected boolean matchClassName ( String className) { return declaringClass. equals ( className) ; } } ) ; return scanner. doScan ( StringUtils . toStringArray ( basePackages) ) ; }