实战背景:
博主在上篇文章Spring启动后加载类或启动类方法大致聊到背景,是为了开发一个自定义注解,根据注解生成说明的菜单树,用于前端编辑。这就要求Spring启动后就扫描特定的包,然后解析自定义注解,“填入”菜单树的业务领域对象中。这个细节将在另外一篇文章具体解说——有关自定义注解和解析实战。
我们知道,虽然JAVA有提供几个操作资源的接口,但是不是很给力。而Spring框架提供了很优秀且很丰富的资源获取和处理接口,包括file/url/class等资源。但是,有关指定包的class文件扫描,具体解说的还是比较少的。我只能根据Spring component-scan的流程获取些灵感。所以,先大概看看component-scan是怎么处理的
component-scan解析流程:
通过Eclipse使用快捷键Ctrl+Shift+T,根据直觉输入ComponentScan,可以定位到唯一一个类ComponentScanBeanDefinitionParser,应该就是这个类处理component-scan了。查看其方法,可以发现只有一个公共方法,如下
public BeanDefinition parse(Element element, ParserContext parserContext) {
String[] basePackages = StringUtils.tokenizeToStringArray(element.getAttribute(BASE_PACKAGE_ATTRIBUTE),
ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS);
// Actually scan for bean definitions and register them.
ClassPathBeanDefinitionScanner scanner = configureScanner(parserContext, element);
Set<BeanDefinitionHolder> beanDefinitions = scanner.doScan(basePackages);
registerComponents(parserContext.getReaderContext(), beanDefinitions, element);
return null;
}
Set<BeanDefinitionHolder> beanDefinitions = scanner.doScan(basePackages);
返回值是BeanDefinitionHolder,应该就是这个方法,继续进入ClassPathBeanDefinitionScanner类,看到ClassPathBean应该就没错了,对应处理方法
protected Se