wangyufan1 2018-04-17 13:59 采纳率: 0%
浏览 871
已结题

解释一下下面代码的意思

public class AutoBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor {
private static final String RESOURCE_PATTERN = "/**/*.class";
private static final String DAO_CALSS_NAME = "com.exam.dao.base.impl.BaseDaoImpl";
private ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
private TypeFilter[] daoTypeFilters = new TypeFilter[] { new AnnotationTypeFilter(AutoDao.class, false) };

private String[] packagesToScan;

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory bf) throws BeansException {
}

@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
    scanPackages(registry);
}

private void scanPackages(BeanDefinitionRegistry registry) {
    if (this.packagesToScan != null) {
        try {
            for (String pkg : this.packagesToScan) {
                String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
                        + ClassUtils.convertClassNameToResourcePath(pkg) + RESOURCE_PATTERN;
                Resource[] resources = this.resourcePatternResolver.getResources(pattern);
                MetadataReaderFactory readerFactory = new CachingMetadataReaderFactory(this.resourcePatternResolver);
                for (Resource resource : resources) {
                    if (resource.isReadable()) {
                        MetadataReader reader = readerFactory.getMetadataReader(resource);
                        if (matchesFilter(reader, readerFactory, daoTypeFilters)) {
                            Class<?> domainClass = Class.forName(reader.getClassMetadata().getClassName());
                            GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
                            beanDefinition.setBeanClassName(DAO_CALSS_NAME);
                            ConstructorArgumentValues cavs = new ConstructorArgumentValues();
                            cavs.addIndexedArgumentValue(0, domainClass);
                            beanDefinition.setConstructorArgumentValues(cavs);
                            beanDefinition.setAutowireMode(AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE);
                            registry.registerBeanDefinition(domainClass.getAnnotation(AutoDao.class).name(),
                                    beanDefinition);
                        }
                    }
                }
            }
        } catch (IOException ex) {
            throw new RuntimeException("Failed to scan classpath for unlisted classes", ex);
        } catch (ClassNotFoundException ex) {
            throw new RuntimeException("Failed to load class", ex);
        }
    }
}

private static boolean matchesFilter(MetadataReader reader, MetadataReaderFactory readerFactory,
        TypeFilter[] typeFilters) throws IOException {
    if (typeFilters != null) {
        for (TypeFilter filter : typeFilters) {
            if (filter.match(reader, readerFactory)) {
                return true;
            }
        }
    }
    return false;
}

public void setPackagesToScan(String[] packagesToScan) {
    this.packagesToScan = packagesToScan;
}

}

  • 写回答

1条回答 默认 最新

  • threenewbee 2018-04-17 14:23
    关注

    根据你提供的包名字符串,遍历你的资源,并且自动注入到你的bean中去。实现了插件装载。

    评论

报告相同问题?

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧