SpringBoot扫描注入自定义Bean

2019-07-06 / 6 阅读 / Java

SpringBoot扫描注入自定义Bean

开发当中有时需要注入自定义的Bean,固定的Bean可以用注解方式注入,但有时候需要注入的Bean并不是固定不变的,如果增加一个就配置一个,那就过于繁琐。所以自定义扫描器的方式就会方便很多。

下面一个简单的例子:


@Configuration
public class BeanConfig implements BeanDefinitionRegistryPostProcessor {

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {

        // 定义扫描器
        ClassPathBeanDefinitionScanner classPathBeanDefinitionScanner = new ClassPathBeanDefinitionScanner(beanDefinitionRegistry);
        // 定义扫描过滤器,返回true表示注册,否则忽略
        classPathBeanDefinitionScanner.addIncludeFilter(new TypeFilter() {
            @Override
            public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
                //当继承之指定类,即父类名称与继承类名称一致,注册该类
                if (metadataReader.getClassMetadata().getSuperClassName().equals(Screen.class.getName())) {
                    return true;
                }
                return false;
            }
        });
        // 注册Bean需要指定BeanName,即别处可以通过BeanName注入。
        classPathBeanDefinitionScanner.setBeanNameGenerator(new BeanNameGenerator() {
            @Override
            public String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry beanDefinitionRegistry) {
                String beanClassName = beanDefinition.getBeanClassName();
                return "util_" + beanClassName.toLowerCase();
            }
        });
        // 开始扫描
        classPathBeanDefinitionScanner.scan("com.example.util");
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {

    }
}
相关推荐