1+ package io .kimmking .rpcfx .api .annotation ;
2+
3+ import org .springframework .beans .factory .config .BeanDefinition ;
4+ import org .springframework .beans .factory .support .AbstractBeanDefinition ;
5+ import org .springframework .beans .factory .support .BeanDefinitionBuilder ;
6+ import org .springframework .beans .factory .support .BeanDefinitionReaderUtils ;
7+ import org .springframework .beans .factory .support .BeanDefinitionRegistry ;
8+ import org .springframework .context .annotation .ImportBeanDefinitionRegistrar ;
9+ import org .springframework .core .annotation .AnnotationAttributes ;
10+ import org .springframework .core .type .AnnotationMetadata ;
11+ import org .springframework .util .ClassUtils ;
12+
13+ import java .util .Arrays ;
14+ import java .util .Collections ;
15+ import java .util .LinkedHashSet ;
16+ import java .util .Set ;
17+
18+ import static org .springframework .beans .factory .support .BeanDefinitionBuilder .rootBeanDefinition ;
19+
20+ public class RpcfxComponentScanRegistrar implements ImportBeanDefinitionRegistrar {
21+
22+ @ Override
23+ public void registerBeanDefinitions (AnnotationMetadata importingClassMetadata , BeanDefinitionRegistry registry ) {
24+
25+ Set <String > packagesToScan = getPackagesToScan (importingClassMetadata );
26+
27+ registerServiceAnnotationBeanPostProcessor (packagesToScan , registry );
28+
29+ //registerCommonBeans(registry);
30+ }
31+
32+ private void registerServiceAnnotationBeanPostProcessor (Set <String > packagesToScan , BeanDefinitionRegistry registry ) {
33+
34+ BeanDefinitionBuilder builder = rootBeanDefinition (ServiceAnnotationBeanPostProcessor .class );
35+ builder .addConstructorArgValue (packagesToScan );
36+ builder .setRole (BeanDefinition .ROLE_INFRASTRUCTURE );
37+ AbstractBeanDefinition beanDefinition = builder .getBeanDefinition ();
38+ BeanDefinitionReaderUtils .registerWithGeneratedName (beanDefinition , registry );
39+
40+ }
41+
42+ private Set <String > getPackagesToScan (AnnotationMetadata metadata ) {
43+ AnnotationAttributes attributes = AnnotationAttributes .fromMap (
44+ metadata .getAnnotationAttributes (RpcfxComponentScan .class .getName ()));
45+ String [] basePackages = attributes .getStringArray ("basePackages" );
46+ Class <?>[] basePackageClasses = attributes .getClassArray ("basePackageClasses" );
47+ String [] value = attributes .getStringArray ("value" );
48+ // Appends value array attributes
49+ Set <String > packagesToScan = new LinkedHashSet <String >(Arrays .asList (value ));
50+ packagesToScan .addAll (Arrays .asList (basePackages ));
51+ for (Class <?> basePackageClass : basePackageClasses ) {
52+ packagesToScan .add (ClassUtils .getPackageName (basePackageClass ));
53+ }
54+ if (packagesToScan .isEmpty ()) {
55+ return Collections .singleton (ClassUtils .getPackageName (metadata .getClassName ()));
56+ }
57+ return packagesToScan ;
58+ }
59+
60+ }
0 commit comments