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 {
}
}