5.AnnotationConfigWebApplicationContext载入注解Bean定义:
AnnotationConfigWebApplicationContext是AnnotationConfigApplicationContext的Web版,它们对于注解Bean的注册和扫描是基本相同的,但是AnnotationConfigWebApplicationContext对注解Bean定义的载入稍有不同,AnnotationConfigWebApplicationContext注入注解Bean定义源码如下:
[java] view plaincopy- //载入注解Bean定义资源 protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) {
- //为容器设置注解Bean定义读取器 AnnotatedBeanDefinitionReader reader = new AnnotatedBeanDefinitionReader(beanFactory);
- //为容器设置类路径Bean定义扫描器 ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(beanFactory);
- //获取容器的Bean名称生成器 BeanNameGenerator beanNameGenerator = getBeanNameGenerator();
- //获取容器的作用域元信息解析器 ScopeMetadataResolver scopeMetadataResolver = getScopeMetadataResolver();
- //为注解Bean定义读取器和类路径扫描器设置Bean名称生成器 if (beanNameGenerator != null) {
- reader.setBeanNameGenerator(beanNameGenerator); scanner.setBeanNameGenerator(beanNameGenerator);
- } //为注解Bean定义读取器和类路径扫描器设置作用域元信息解析器
- if (scopeMetadataResolver != null) { reader.setScopeMetadataResolver(scopeMetadataResolver);
- scanner.setScopeMetadataResolver(scopeMetadataResolver); }
- //获取容器定义的Bean定义资源路径 String[] configLocations = getConfigLocations();
- //如果定位的Bean定义资源路径不为空 if (configLocations != null) {
- for (String configLocation : configLocations) { try {
- //使用当前容器的类加载器加载定位路径的字节码类文件 Class clazz = getClassLoader().loadClass(configLocation);
- if (logger.isInfoEnabled()) { logger.info(Successfully resolved class for [ + configLocation + ]);
- } reader.register(clazz);
- } catch (ClassNotFoundException ex) {
- if (logger.isDebugEnabled()) { logger.debug(Could not load class for config location [ + configLocation +
- ] - trying package scan. + ex); }
- //如果容器类加载器加载定义路径的Bean定义资源失败,则启用 //容器类路径扫描器扫描给定路径包及其子包中的类
- int count = scanner.scan(configLocation); if (logger.isInfoEnabled()) {
- if (count == 0) { logger.info(No annotated classes found for specified class/package [