spring笔记-ClassPathScanningCandidateComponentProvider

之前介绍过ClassPathBeanDefinitionScanner,用于扫描并注册Bean

https://www.jianshu.com/p/e309b747c7d3

1.作用

ClassPathScanningCandidateComponentProvider是ClassPathBeanDefinitionScanner的基类,其本身主要作用是包扫描,ClassPathBeanDefinitionScanner在其基础上做了注册功能,所以ClassPathBeanDefinitionScanner需要传入一个BeanDefinitionRegistry对象.
而ClassPathScanningCandidateComponentProvider扫描的对象是并不需要注册到BeanDefinitionRegistry中去的.

2.使用场景

如果需要扫描包结束后,并需要对BeanDefinition进行逻辑处理后注册到BeanDefinitionRegistry,可以继承ClassPathScanningCandidateComponentProvider,重新实现逻辑,相当于类似自定义ClassPathBeanDefinitionScanner逻辑

3.测试代码

主要是调用其findCandidateComponents方法来获取BeanDefinition列表

其默认只支持@Component注解

    @Test
    public void defaultsWithScan() {
        ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(true);
        provider.setResourceLoader(new DefaultResourceLoader(
                CandidateComponentsTestClassLoader.disableIndex(getClass().getClassLoader())));
        testDefault(provider, ScannedGenericBeanDefinition.class);
    }

    private void testDefault(ClassPathScanningCandidateComponentProvider provider,
            Class expectedBeanDefinitionType) {
        Set candidates = provider.findCandidateComponents(TEST_BASE_PACKAGE);
        assertTrue(containsBeanClass(candidates, DefaultNamedComponent.class));
        assertTrue(containsBeanClass(candidates, NamedComponent.class));
        assertTrue(containsBeanClass(candidates, FooServiceImpl.class));
        assertTrue(containsBeanClass(candidates, StubFooDao.class));
        assertTrue(containsBeanClass(candidates, NamedStubDao.class));
        assertTrue(containsBeanClass(candidates, ServiceInvocationCounter.class));
        assertTrue(containsBeanClass(candidates, BarComponent.class));
        assertEquals(7, candidates.size());
        assertBeanDefinitionType(candidates, expectedBeanDefinitionType);
    }

参考:
https://blog.csdn.net/duzm200542901104/article/details/78909668

你可能感兴趣的:(spring笔记-ClassPathScanningCandidateComponentProvider)